2011-11-10 142 views
6

我有一個從csv文件動態創建的數據集。我想要做的是將行插入到我的MS Access表中,但我無法弄清楚從哪裏開始。訪問數據庫的C#數據集

數據集中數據的標題可能會有所不同,但是標題的名稱將始終與訪問數據庫相匹配。我是否必須在插入命令中靜態調出標題名稱,或者是否可以從數據集構建標題?

我知道如何創建連接並將其打開到數據庫,但不知道如何在插入命令中創建動態拉表格標題。

當談到C#編程時,我非常青澀,所以如果你能爲我拼出它,我將非常感激!

這裏是訪問表頭的一個例子:

ID,項目,成本,零售

然後CSV這將填充數據集表。它可能有零售,也可能不是:

項目,成本

這裏是我迄今爲止,但它並沒有寫入訪問表的代碼。如果我認爲dtAccess顯示正確。

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

它已經動態創建,或者您希望它被動態創建? – McKay

+0

我希望它被動態地創建成一個字符串,所以我可以在插入命令中使用它。類似於:INSERT INTO [table](datasetheaders) – Reg

+0

對不起@reg你能更清楚地知道你在找什麼。我們能看到例子嗎? – McKay

回答

4

想通了。這裏是我使用的代碼:

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

對於'dtCSV = ds.Tables [0]'這一行,你在哪裏得到變量'ds'? –

0

訪問具有提供數據庫訪問數據庫表和列的隱藏表。它們的名稱取決於訪問版本,但它們通常與systables類似?這是一段時間,但如果你「顯示隱藏的表」,你應該能夠找到它們。

+0

我知道訪問中的systable,但我試圖從數據集中創建標題,而不是從訪問表中創建標題。我的數據集將只包含訪問表中10列中的4列(會有所不同)。 – Reg

0

如果兩個數據表具有相同的結構,你可以merge的「CSV」數據表與數據庫表的數據表,因此,例如,你可以使用數據適配器檢索數據庫表到數據表:

string queryString = "SELECT * FROM sometable"; 
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection); 
DataTable dtAccess = new DataTable(); 
adapter.Fill(dtAccess); 
在此之後,你可以用一個命令生成器寫入數據表中的內容轉換成access數據庫表

dtAccess.Merge(dtCSV); 

,那麼你可以用CSV數據表的內容合併該數據表的內容

如果數據表具有相同的結構應該沒有任何問題工作...

+0

這幾乎可以工作,但不寫入訪問表。我錯過了什麼嗎? – Reg

+0

嘗試在使用適配器填充數據集之前初始化CommandBuilder。 – aleroot

+0

對不起,我是菜鳥。我會怎麼做?上面的using語句是否在不以任何方式調用的情況下初始化? – Reg