C# 将C datatable插入Access表时出现异常-System.InvalidOperationException:缺少SourceColumn“ID”的数据列“ID”

C# 将C datatable插入Access表时出现异常-System.InvalidOperationException:缺少SourceColumn“ID”的数据列“ID”,c#,insert,C#,Insert,当我试图将字符串列MedName上具有主键值的表中的所有行插入具有自动递增主键的Access表时,出现上述异常。这就是我正在做的: OleDbConnection con; OleDbCommand cmd; OleDbDataAdapter adapter; string Connection ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Directory; con=new OleDbConnection(Connection); stri

当我试图将字符串列MedName上具有主键值的表中的所有行插入具有自动递增主键的Access表时,出现上述异常。这就是我正在做的:

OleDbConnection con;
OleDbCommand cmd;
OleDbDataAdapter adapter;
string Connection ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Directory;
con=new OleDbConnection(Connection);
string selectCommand = "select * from AccessTableTest";
cmd=new System.Data.OleDb.OleDbCommand(Query,con) ;
adapter=new OleDbDataAdapter(cmd);
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
dt.PrimaryKey = null; //Tried to see if PK is causing trouble. No luck
foreach (DataRow dr in dt.Rows)
{
    dr.SetModified(); //Tried this. Helped me to insert for the very first time.
}
adapter.InsertCommand = builder.GetInsertCommand();
var rows = adapter.Update(dt); //dt is the function parameter
con.Close();
因此,adapter.Updatedt抛出错误,因为缺少SourceColumn“ID”的数据列“ID”

注意:第一个insert命令使用dr.SetModified语句成功,但所有后续插入都失败。我确保表的所有列都与access表的列匹配

另外,adapter.InsertCommand中的insert命令如下所示:

INSERT INTO DrugAudit (Category, SubCategory, Quantity, MedName, OrderTrigger, Issues, Price, Notes, Summary, Recommendations, Alternative) 
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
con.Open();
foreach (DataRow dr in dt.Rows)
{
 string insertCommand = "Insert INTO DrugAudit (Category, SubCategory, Quantity, MedName, OrderTrigger, Issues, Price, Notes, Summary, Recommendations, Alternative) VALUES (";
//dr.SetModified();
foreach (DataColumn dc in dt.Columns)
{
    insertCommand += "'" + dr[dc].ToString() + "',"
}
int lastIndex = insertCommand.LastIndexOf(',');
insertCommand = insertCommand.Remove(lastIndex);
insertCommand += ");";
cmd=new System.Data.OleDb.OleDbCommand(insertCommand,con);
int i = cmd.ExecuteNonQuery();
}

请帮忙。这几天我一直在努力解决这个问题。谢谢

我解决了这个问题,只需像这样在表格中循环:

INSERT INTO DrugAudit (Category, SubCategory, Quantity, MedName, OrderTrigger, Issues, Price, Notes, Summary, Recommendations, Alternative) 
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
con.Open();
foreach (DataRow dr in dt.Rows)
{
 string insertCommand = "Insert INTO DrugAudit (Category, SubCategory, Quantity, MedName, OrderTrigger, Issues, Price, Notes, Summary, Recommendations, Alternative) VALUES (";
//dr.SetModified();
foreach (DataColumn dc in dt.Columns)
{
    insertCommand += "'" + dr[dc].ToString() + "',"
}
int lastIndex = insertCommand.LastIndexOf(',');
insertCommand = insertCommand.Remove(lastIndex);
insertCommand += ");";
cmd=new System.Data.OleDb.OleDbCommand(insertCommand,con);
int i = cmd.ExecuteNonQuery();
}

但是,我仍然想知道为什么我第一次尝试的adapter.Updatedt方法无法将表插入到访问表中。如果有人能指出我在之前的程序中做错了什么,我将不胜感激。谢谢

插入整个表失败,因为其中一个列名是保留关键字

这需要在OleDbCommandBuilder上同时指定QuotePrefix和QuoteSuffix

对于MS access,这是 builder.QuotePrefix=[; builder.QuoteSuffix=]


在调用GetInsertCommand之前设置它们,它应该可以工作。

源和目标是否在同一个access db中?我的源是C数据表,目标是access表。对不起,如果我没有把你的问题答对。谢谢数据是如何从winform用户输入进入DataTable对象的。我正在将所有表单数据保存到datatable对象中。