c#数据集访问数据库

本文关键字:数据库 访问 数据集 | 更新日期: 2023-09-27 18:14:10

我有一个从csv文件动态创建的数据集。我要做的是将行插入到我的MS Access表中,但我不知道从哪里开始。

数据集中数据的头可以根据顺序而变化,但头的名称将始终与访问数据库匹配。我是否必须在插入命令中静态地调用标题名称,或者我可以从数据集构建标题?

我知道如何创建连接并将其打开到数据库,但我不确定如何在插入命令中创建动态拉表头。

当涉及到c#编程时,我是一个新手,所以如果你能给我讲清楚,我会非常感激的!

下面是一个访问表头的例子:

ID, Item, Cost, Retail

然后是将填充数据集表的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();

c#数据集访问数据库

明白了。下面是我使用的代码:

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();

Access具有隐藏表,这些表提供对数据库中的表和列的数据库访问。它们的名称取决于访问版本,但它们通常类似于systables?这已经有一段时间了,但是如果你"显示隐藏的表格",你应该能够找到它们。

如果两个数据表具有相同的结构,您可以将"CSV"数据表与数据库表数据表合并,因此,例如,您可以使用数据适配器将数据库表检索到数据表:

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

则可以将此数据表的内容与CSV数据表的内容合并:

dtAccess.Merge(dtCSV);

之后,您可以使用命令构建器将数据表的内容写入访问数据库表:

 using (new SqlCommandBuilder(adapter)) {
adapter.Update(dtAccess);
}
如果数据表具有相同的结构应该没有任何问题…