Nel precedente post ho spiegato come popolare un dataset partendo da un file di testo. Ora facciamo un passo successivo: portiamo il dataset creato su un database MSSQL.
Il dataset creato con la funzione del post precedente ha il vantaggio di riconoscere nella maggior parte dei casi i tipi di dati contenuti nel file di testo importato, permettendoci quindi di scorrerne le colonne e creare sul database una tabella adeguata a contenerne i dati.
Il nome della tabella verra’ ottenuto dalla proprieta’ DataSetName dell’oggetto dataset.
La connessione al database dovra essere infine effettuata con delle credenziali con la possibilita’ di creare e modificare tabelle.
Public Function DataSet2SQLTable(ByVal ds As DataSet)
Dim cn As SqlConnection = New SqlConnection(My.Settings.ConnectionString1.ToString)
cn.Open()
Dim cmd As SqlCommand = New SqlCommand(“CREATE TABLE [" & ds.DataSetName & "] ([id] [int] IDENTITY (1, 1) NOT NULL) ON [PRIMARY]“, cn)
cmd.ExecuteNonQuery()
cn.Close()
Dim colonna As DataColumn = Nothing
For Each colonna In ds.Tables(0).Columns
Dim nome_colonna = colonna.ColumnName
Dim tipo_colonna = SysType2DBType(colonna.DataType)
Dim tipo_colonna_str As String = tipo_colonna.ToString
Dim dimensioni As String = “”
If tipo_colonna_str.ToUpper = “NVARCHAR” Then
dimensioni = “(250)”
End If
Dim str_query = “ALTER TABLE [" & ds.DataSetName & "] ADD [" & nome_colonna.ToString.Replace(ds.DataSetName.Replace(".", "#"), "") & "] ” & tipo_colonna_str & ” ” & dimensioni & “NULL”
cn.Open()
cmd = New SqlCommand(str_query, cn)
cmd.ExecuteNonQuery()
cn.Close()
Next
‘importazione dei dati nella tabella appena creata
Dim objConn As New SqlConnection(My.Settings.ConnectionString1.ToString)
objConn.Open()
Dim da_temp As SqlDataAdapter
da_temp = New SqlDataAdapter(“Select top 1 * From [" & ds.DataSetName & "]“, objConn)
da_temp.AcceptChangesDuringFill = True
Dim ds_temp As New DataSet()
da_temp.FillSchema(ds_temp, SchemaType.Source)
da_temp.Fill(ds_temp)
‘ Setto come nuove tutte le righe del DataSet
Dim riga_tmp As DataRow
For Each riga_tmp In ds.Tables(0).Rows
Try
riga_tmp.SetAdded()
Catch ex As Exception
End Try
Next
Try
ds_temp.Merge(ds, False)
Catch ex As Exception
End Try
Dim objCommandBuilder As New SqlCommandBuilder(da_temp)
da_temp.Update(ds_temp)
da_temp.Dispose()
objConn.Close()
Return 1
End Function
La funzione SysType2DBType richiamata nella linea 14 e’ la stessa realizzata nel post VB.NET: Convertire da System.Type a SqlDbType







Miticissimo… una? Ossia Un Dataset?
io ho provatop ad applicare le tue indicazione per una tabella access…MA NON FUNZIONA!!!…ci sto sbattendo i denti puoi aiutarmi…Grazie!!
—CODICE DA ME SCRITTO
Public Function writeDataTableToMdbFile(ByVal strSql As String, ByVal connMDB As OleDb.OleDbConnection, _
ByVal dTable As DataTable) As Integer
‘ strSql = Nome Tabella destinazione DB – Utilizzata anche per assegnare il nome alla DataTable
‘ connMDB = OleDbConnection
‘ dTable = DataTable – Popolata con il risultato di elaborazioni precedente (di 2 o più DataTable)
‘ La struttura dei campi record è identica alla tabella di destinazione
‘ DB di destinazione File ACCESS 2003
‘ DB Sorgenti VARI
dTable.TableName = strSql ‘ Assegno il nome al DataTable
Dim tbAdapter As New OleDb.OleDbDataAdapter(“select * from ” & strSql, connMDB) ‘ db vuoto
tbAdapter.AcceptChangesDuringFill = True
Dim ds_temp As New DataSet()
tbAdapter.FillSchema(ds_temp, SchemaType.Source)
tbAdapter.Fill(ds_temp, strSql)
‘ Setto come nuove tutte le righe del DataSet
Dim riga_tmp As DataRow
For Each riga_tmp In ds_temp.Tables(strSql).Rows ‘ Nessun Record Esce subito
Try
riga_tmp.SetAdded()
Catch ex As Exception
End Try
Next
ds_temp.Merge(dTable)
Debug.Print(ds_temp.Tables(strSql).Rows.Count) ‘ Verifico se il DataSet è Popolato (CIRCA 19000 RECORD)
Dim CommandBuilder As New OleDb.OleDbCommandBuilder(tbAdapter)
tbAdapter.Update(ds_temp) ‘ Aggiorno il DB
tbAdapter.Dispose()
End Function
Spero che mi puoi aiutare in qualche modo…Grazie!