【发布时间】:2016-12-01 07:52:25
【问题描述】:
使用此代码,我从 Excel 文档中创建了一个数据表。数据集也显示在 datagridview 中。
OleDbcon.Open();
tbContainer = new SD.DataTable();
OleDbCommand cmd = new OleDbCommand();
System.Data.DataTable dt = new System.Data.DataTable();
OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}$]", sheetName), OleDbcon);
DataSet ds = new DataSet();
oda.Fill(ds);
DGVExcel.DataSource = ds.Tables[0];
Console.WriteLine(dt.Rows.Count);
OleDbcon.Close();
现在我有了这个 Dataset/DataTable,我希望能够将其数据与已经建立的访问数据库的内容相匹配,然后添加相关值。
比如说我在数据库中有这个:
姓名 ||手指 ||大拇指 ||身份证
罗斯 || 10 || 2 || 12
老板 || 9 || 1 || 14
excel文件恰好有完全相同的数据,除了用于识别唯一条目的ID之外,其他字段都会被添加。
所以罗斯的值变成了 20||4,Boss 变成了 18 || 2.
如何使用我刚刚创建的DataSet/DataTable来执行这个操作?
我想到的想法是使用“如果不存在”Select * from Table where ID = [?]。但我不知道如何设置ID。 for循环会起作用吗?伪代码:
for (int i = 2; i < DB.Count ; i++){
string query = "if not exists Select * from Table where ID = " + DGridView.Rows[i].Cells[LastCell];
我之前被推荐过 Linq,但老实说我不知道从哪里开始。
编辑 x2:
========================================
所以我认为我一直在以错误的方式解决这个问题,无论如何,我设法将我的 excel 数据直接插入 Access 表中,而无需求助于数据集/原始查询。唯一需要注意的是,表结构需要与访问表完全匹配,尽管我认为无论如何总是如此。
代码:
conn.Open();
string sqls = @"INSERT INTO ACXL SELECT * FROM [Excel 12.0;HDR=YES;DATABASE=" + openFileDialog.FileName + "].[" + txtSheetName.Text + "$];";
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = sqls;
cmd.ExecuteNonQuery();
conn.Close();
关于SQL表匹配!
【问题讨论】:
-
根据您的描述,我相信您可以推断出
Name的自然键,因此只需更改您的 if not exists select 以使用它而不是 ID。 -
最好的方法之一是将其传递给 SQL 存储过程,该过程完成合并语句,该语句可以插入、更新和删除(如果需要)表中的任何记录符合您的条件
-
@JohnWu,我不确定这是否会发生很大变化。我遇到的问题是如何保持索引相对于表和数据库内容。所以,它可以是任意数量的 ID 或该数字的名称,我猜一个名称可能有重复的值,因此 ID 字段是我用来参考的。
-
@SimonPrice,我正在使用 MS Access 数据库。我不认为它能够使用存储过程?我之前用过SQL触发器,原理是一样的吗?
-
哦,我的错...抱歉,您认为您正在使用 SQL 数据库,好的,那么在这种情况下 LINQ 是您最好的朋友,建议您购买并阅读此microsoftpressstore.com/store/…
标签: c# linq ms-access datagridview datatable