In principal, despre .NET, VB6. C#,VB.NET, ASP.NET Apoi despre programare si multe alte chestii ... de programare.

Subscribe RSS   Mini tools List

miercuri, martie 05, 2008

Al patrulea pas : Importul datelor
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/

Va sfatuim sa cititi partile anterioare

Primul pas : instalarea software-ului free

Al doilea pas : Analiza aplicatiei

Al treilea pas : Structura Bazei de date

Sau tutorialul anterior despre .NET 2.0

http://serviciipeweb.ro/iafblog/content/binary/tutorial.pdf

Vom importa datele din fisierul Excel in Baza de date. Daca am avea SQL Server Standard( sau mai mare) am putea importa direct din Excel in SQL Server.Este suficient sa facem click dreapta pe baza noastra de date , Tasks=> ImportData – ca in figura alaturata :

Dupa ce apasam, vom selecta la surse Excel:

Iar la destinatie serverul local de SQL Server

Cam asta ar fi, daca am avea SQL Server Standard.

Dar ,pentru ca avem SQL Server Express, nu avem o astfel de facilitate incorporata - asa ca va trebui sa ne descurcam importand datele cu un program in C#.

Vom creea tabele in SQL Server asemanatoare cu structura datelor din Excel. Vom crea tabelele asa cu am facut la pasul 3. De pilda tabela cu date despre cartile de copii va arata asa:

Acum vom importa datele. Va trebui sa facem citirea datelor in Excel si apoi scrierea lor in SQL Server.

Sa le luam pe rind:

Cream un nou proiect in C# , intitulat "ImportDate" de tip Consola in folder-ul C:\book3.

Linga toate "using" mai adaugam si un "using System.Data.OleDb;" ca sa putem citi din Excel si using System.Data.SqlClient pentru conectare la SQL Server.

O sa ne folosim de faptul ca DataAdapter stie sa faca modificari de date automat. Ne facem ca citim un DataTable din SQL Server, il umplem apoi cu datele de la Excel si ii spunem lui DataAdapter sa faca insert-urile pentru noi.

Deschidem o conexiune la SQL Server si citim datele din tabela "Excel_Copii":

Pentru citirea din Excel vom folosi driverul de OLEDB.Cream o conexiune la Excel si o sa citim datele din tabela "Copii".

Deschidem o conexiune la Excel

"Provider = \"Microsoft.Jet.OLEDB.4.0\";Data Source=\"C:\\book3\\carte.xls\";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";

(daca vreti sa stiti ce ISAM aveti , vedeti cu regedit cheia

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\ISAM Formats)

Deschidem o noua comanda, prin care selectam datele din Worksheetul "Copii"

oc.CommandText = "select * from [Copii$]";

(de remarcat sintaxa cu $ si paranteze drepte)

Cod complet:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data.OleDb;

using System.Data.SqlClient;

using System.Data;

namespace ImportDate

{

class Program

{

static void Main(string[] args)

{

using (SqlConnection sco = new SqlConnection())

{

sco.ConnectionString = "Data Source=.\\sqlExpress;Integrated Security=true;Initial Catalog=Library";

sco.Open();

using (SqlDataAdapter sda = new SqlDataAdapter("select * from Excel_Copii", sco))

{

// construct insert

if (sda.InsertCommand == null)

{

SqlCommandBuilder scb = new SqlCommandBuilder(sda);

sda.InsertCommand = scb.GetInsertCommand(true);

}

System.Data.DataTable dtTransfer = new System.Data.DataTable();

sda.Fill(dtTransfer);

using (OleDbConnection odc = new OleDbConnection())

{

odc.ConnectionString = "Provider = \"Microsoft.Jet.OLEDB.4.0\";Data Source=\"C:\\book3\\carte.xls\";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";

odc.Open();

using (OleDbCommand oc = new OleDbCommand())

{

oc.CommandType = System.Data.CommandType.Text;

oc.CommandText = "select * from [Copii$]";

oc.Connection = odc;

//fill data table with Excel data

System.Data.DataTable dtExcel = new System.Data.DataTable();

using (OleDbDataReader sr = oc.ExecuteReader())

{

dtExcel.Load(sr);

}

// transfer rows

foreach (DataRow dr in dtExcel.Rows)

{

DataRow drNew = dtTransfer.NewRow();

drNew.ItemArray = dr.ItemArray;

dtTransfer.Rows.Add(drNew);

}

}

sda.Update(dtTransfer);

}

}

}

}

}

}

La fel se importa si datele din tabela de SF.

Acum este cazul sa importam datele in tabele.

Mai intii, cea de autori.

Va trebui sa luam autorii din toate tabelele .

SELECT

[Autor1] as autor

FROM [Library].[dbo].[Excel_Copii]

union

select [Autor2]

FROM [Library].[dbo].[Excel_Copii]

UNION

SELECT

[Autor1] as autor

FROM [Library].[dbo].[Excel_SF]

union

select [Autor2]

FROM [Library].[dbo].[Excel_SF]

Observam urmatoarele date:

NULL

ISPIRESCU Petre

Andersen

George Lucas

Ion Creanga

Isaac Asimov

Petre Ispirescu

Va trebui sa facem 2 lucruri:

  1. Consolidarea datelor – in definitiv, Petre Ispirescu = ISPIRESCU Petre
  2. Inserarea in tabela Person si Tabela Author

Punctul 1 este destul de usor de facut cu un update ...

update Excel_Copii set Autor1= 'Petre Ispirescu' where Autor1 = ' ISPIRESCU Petre'

Punctul 2 il vom face inserind in tabela de persoane si pe urma in tabela de Autori

INSERT INTO [Library].[dbo].[Person]

([FirstNamePerson],[LastNamePerson]

)

select autor,'' from

(

SELECT

[Autor1] as autor

FROM [Library].[dbo].[Excel_Copii]

union

select [Autor2]

FROM [Library].[dbo].[Excel_Copii]

UNION

SELECT

[Autor1] as autor

FROM [Library].[dbo].[Excel_SF]

union

select [Autor2]

FROM [Library].[dbo].[Excel_SF]

) a where a.autor is not null

Acum separam nume de prenume:

UPDATE

Person

SET

FirstNamePerson = substring(FirstNamePerson,1,charindex(' ' ,FirstNamePerson)-1),

LastNamePerson = substring(FirstNamePerson,charindex(' ' ,FirstNamePerson)+1,100)

WHERE charindex(' ' ,FirstNamePerson)>0

Rezultatul este:

IDPerson FirstNamePerson LastNamePerson DateOfBirthPerson

2 Andersen NULL

3 George Lucas NULL

4 Ion Creanga NULL

5 Isaac Asimov NULL

6 Petre Ispirescu NULL

Acum le vom insera in tabela de Autori:

INSERT INTO

[Author]

([IDPerson]

)

SELECT IDPerson FROM Person

La fel inseram cartile si editurile..

Acum trebuie sa refacem legaturile, de pilda, intre autori si carti

INSERT INTO [Book_Author]

([IDBook]

,[IDAuthor])

select IDBOOK,IDAuthor from Book b

inner join Excel_SF excel

inner join Person p on excel.Autor1 = p.FirstNamePerson + ' ' + p.LastNamePerson

inner join Author a on p.IDPerson = a.IDPerson

on excel.Titlu = b.Title

La fel si pentru carti cu edituri :

update book

set IDPrintingHouse =

p.IDPrintingHouse from Book b

inner join Excel_SF excel

inner join PrintingHouse p on p.NamePrintingHouse = excel.Editura

on excel.Titlu = b.Title

Ramine la latitudinea cititorului exercitiul cu celelalte update-uri.

Backupul la BD il gasiti in folder-ul database si se numeste "lib_date_importExcel.bak" . Puteti face restore.

De citit:

  1. Primul pas : instalarea software-ului free , in care downloadati VC# Express si SQL Server Express
  2. Stringuri de conexiune pentru orice baza de date : www.connectionstrings.com

Surse

Tutorial PDF

Post page: http://serviciipeweb.ro/iafblog/2008/03/04/Al+Patrulea+Pas+Importul+Datelor.aspx

Weblog post by 'admin' on 'Al patrulea pas : Importul datelor'

Categories:.NET;programare;tutoriale

 
Acest blog s-a mutat la http://www.serviciipeweb.ro/iafblog/