Datatable to sql table

venerdì 03 settembre 2010 - 21.11

dompa72 Profilo | Senior Member

Ciao,
vorrei sapere come posso inviare il contenuto di un DataTable in una tabella SQL. In caso non esiste la tabella, il connettore crea la tabella.
Di solito inserisco la tabella tramite degli Insert per ogni riga.

Ho letto qualcosa sul Bulkcopy ma non ho capito molto. E' la strada giusta???

Grazie

franco.geko Profilo | Junior Member

Di solito se i dati sono pochi anche io uso inserimenti diretti dalla Datatable.
Non sarà molto efficiente ma hai il controllo completo sull'operazione di inserimento ;)

Se nella datatable i dati li inserisci ex novo (del tipo crei il datatable e usi il metodo Add della collection rows quindi i record vengono segnati come "added"), potresti usare il dataadapter e configurare il commandbuilder in modo adeguato.

Altrimenti dai un occhio qui per vedere se può esserti utile
http://msdn.microsoft.com/en-us/library/1y8tb169(v=VS.80).aspx

Ciao
Franco

dompa72 Profilo | Senior Member

Praticamente devo prelevare dei dati da un db aziendale, manipolarli e copiarli in un db locale per ulteriori viste e da queste poi esportarli in excel e/o stamparli.

Cercavo un modo per velocizzare la copia in locale, questa naturalmente deve anche creare la tabella.

Forse il metodo del bulkcopy, se funziona con i datatable, è ottimale.

Grazie e sono ben accetti ulteriori considerazioni.

franco.geko Profilo | Junior Member

Dompa,
se hai a disposizione il framework dal 2.0 in poi, l'oggetto SqlBulkCopy funziona bene anche con le Datatable.

Ti posto un pezzo di codice che ho usato or ora per testarlo ed ha funzionato su due database Sql Server 2005 su macchine diverse.

<<<<<<<<<<<<<<<<<<<<<<<
Friend sSourceConnectionString As String = "Data Source=NOMESERVERSOURCE;Initial Catalog=DB_SOURCE;Integrated Security=SSPI"
Friend sDestinationConnectionString As String = "Data Source=NOMESERVERDEST;Initial Catalog=DB_DEST;Integrated Security=SSPI"
Public Sub DoIt()
Dim sourceConnection As New SqlConnection(sSourceConnectionString)
Dim destConnection As New SqlConnection(sDestinationConnectionString)


Dim sourceDt As New DataTable
Dim Da As New SqlDataAdapter("Select * from SOURCETABLE", sourceConnection)

sourceConnection.Open()
destConnection.Open()
Da.Fill(sourceDt)

' Note that the column positions in the source DataTable
' match the column positions in the destination table,
' so there is no need to map columns.
Using bulkCopy As SqlBulkCopy = _
New SqlBulkCopy(destConnection)
bulkCopy.DestinationTableName = "DESTINATIONTABLE"

' Write from the source to the destination.
bulkCopy.WriteToServer(sourceDt)
MsgBox("OK")
End Using

sourceConnection.Close()
destConnection.Close()

End Sub

<<<<<<<<<<<<<<<<<<<<<<<

Il codice può essere solo migliorato...comunque il concetto di funzionamento è quello.
Occhio che nell'esempio le tabelle Source e Destination hanno la stessa struttura.
Nel caso in cui ci fossero differenze strutturali, o normalissi il tutto tramite la Select SQL oppure utilizza il metodo ColumnMappings dell'oggetto.

Grazie mille per avermi fatto ri-scoprire un nuovo oggetto di cui sapevo l'esistenza ma che non avevo mai usato nei miei programmi...mi sa che appena avrò un attimo di tempo farò un restyling a qualche applicativo...;)

Ciao
Franco

dompa72 Profilo | Senior Member

>Grazie mille per avermi fatto ri-scoprire un nuovo oggetto di
>cui sapevo l'esistenza ma che non avevo mai usato nei miei programmi...mi
>sa che appena avrò un attimo di tempo farò un restyling a qualche
>applicativo...;)
Grazie a te per avermi risolto anche un po' di ore studio

>Ciao
>Franco
Ciao e appena scrivo il codice ti faccio sapere
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5