2011-11-10 49 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