2011-11-10 16 views
6

Ho un set di dati creato dinamicamente da un file csv. Quello che voglio fare è inserire le righe nella mia tabella MS Access ma non riesco a capire da dove cominciare.Dataset C# per accedere al DB

Le intestazioni dei dati nel set di dati possono variare fino all'ordine ma il nome dell'intestazione corrisponderà sempre al database di accesso. Devo chiamare staticamente il nome dell'intestazione nel comando insert o posso creare le intestazioni dal set di dati?

So come creare la connessione e aprirlo al database ma non sono sicuro di come creare nel comando di inserimento per estrarre dinamicamente le intestazioni della tabella.

Sono abbastanza verde quando si tratta di programmazione in C# quindi se riesci a spiegarlo per me lo apprezzerei davvero!

Ecco un esempio delle intestazioni della tabella di accesso:

ID, punto, costo, vendita al dettaglio

Poi il CSV che riempirà la tabella di set di dati. Potrebbe avere al dettaglio o non potrebbe:

Item, costo

Ecco il codice che ho finora, ma non scrive alla tabella di accesso. Se visualizzo correttamente dtAccess, viene visualizzato correttamente.

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"C:\\Database.accdb\";Persist Security Info=False;"); 
       myConnection.Open(); 

       string queryString = "SELECT * from " + lblTable.Text; 

       OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, myConnection); 

       DataTable dtAccess = new DataTable(); 

       DataTable dtCSV = new DataTable(); 

       dtCSV = ds.Tables[0]; 

       using (new OleDbCommandBuilder(adapter)) 
       { 
        adapter.Fill(dtAccess); 
        dtAccess.Merge(dtCSV); 
        adapter.Update(dtAccess); 
       } 

       myConnection.Close(); 
+0

È già stato creato dinamicamente o vuoi che venga creato dinamicamente? – McKay

+0

Voglio che venga creato dinamicamente in una stringa, così posso usarlo in un comando di inserimento. Somthing like: INSERT INTO [table] (datasetheaders) – Reg

+0

Scusa @reg puoi essere più esplicito in ciò che stai cercando. Possiamo vedere esempi? – McKay

risposta

4

capito. Ecco il codice che ho usato:

OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"Database.accdb\";Persist Security Info=False;"); 

       //command to insert each ASIN 
       OleDbCommand cmd = new OleDbCommand(); 

       //command to update each column (ASIN, Retail... from CSV) 
       OleDbCommand cmd1 = new OleDbCommand(); 

       //load csv data to dtCSV datatabe 
       DataTable dtCSV = new DataTable(); 

       dtCSV = ds.Tables[0]; 

       // Now we will collect data from data table and insert it into database one by one 
       // Initially there will be no data in database so we will insert data in first two columns 
       // and after that we will update data in same row for remaining columns 
       // The logic is simple. 'i' represents rows while 'j' represents columns 

       cmd.Connection = myConnection; 
       cmd.CommandType = CommandType.Text; 
       cmd1.Connection = myConnection; 
       cmd1.CommandType = CommandType.Text; 

       myConnection.Open(); 

       for (int i = 0; i <= dtCSV.Rows.Count - 1; i++) 
       { 
        cmd.CommandText = "INSERT INTO " + lblTable.Text + "(ID, " + dtCSV.Columns[0].ColumnName.Trim() + ") VALUES (" + (i + 1) + ",'" + dtCSV.Rows[i].ItemArray.GetValue(0) + "')"; 

        cmd.ExecuteNonQuery(); 

        for (int j = 1; j <= dtCSV.Columns.Count - 1; j++) 
        { 
         cmd1.CommandText = "UPDATE " + lblTable.Text + " SET [" + dtCSV.Columns[j].ColumnName.Trim() + "] = '" + dtCSV.Rows[i].ItemArray.GetValue(j) + "' WHERE ID = " + (i + 1); 

         cmd1.ExecuteNonQuery(); 
        } 
       } 

       myConnection.Close(); 
+1

Per la riga 'dtCSV = ds.Tables [0]', dove prendi la variabile 'ds'? –

0

L'accesso dispone di tabelle nascoste che forniscono l'accesso al database alle tabelle e alle colonne nel database. I nomi di questi dipendono dalla versione di accesso, ma in genere sono qualcosa come i systables? È passato un po 'di tempo, ma se "mostri i tavoli nascosti" dovresti riuscire a trovarli.

+0

Conosco i systables in accesso ma sto cercando di creare le intestazioni dal set di dati non dalla tabella di accesso. Il mio set di dati includerà solo 4 colonne su 10 (varieranno) dalla tabella di accesso. – Reg

0

Se i due DataTable hanno la stessa struttura è possibile merge il "CSV" DataTable con DataTable tabella del database, in modo ad esempio è possibile recuperare la tabella del database in un DataTable utilizzando un adattatore di dati:

string queryString = "SELECT * FROM sometable"; 
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection); 
DataTable dtAccess = new DataTable(); 
adapter.Fill(dtAccess); 

allora è possibile unire il contenuto di questo DataTable con il contenuto del CSV DataTable:

dtAccess.Merge(dtCSV); 

Dopo di che è possibile scrivere il contenuto della datatable nella tabella di database di Access con un costruttore di comando:

Se i DataTable hanno la stessa struttura dovrebbe funzionare senza alcun problema ...

+0

Funziona quasi ma non scrive sulla tabella di accesso. Mi sto perdendo qualcosa? – Reg

+0

Provare a inizializzare CommandBuilder prima di riempire il datable con l'adattatore. – aleroot

+0

Scusa se sono un noob. Come potrei farlo? L'istruzione using in alto si inizializza senza chiamarla in alcun modo? – Reg

Problemi correlati