VB.NET: creare una tabella su DataBase partendo da un dataset

1 04 2008

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


Azioni

Informazione

2 risposte

1 04 2008
SIIII BADRONE

Miticissimo… una? Ossia Un Dataset?

20 03 2009
Luciano

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!

Lascia un commento