DataAdapter:更新无法找到TableMapping ['Table']或DataTable'Table'

Ari*_*ari 5 c# sql-server ado.net dataadapter

此代码段引发错误:

更新无法在adapter.Update(ds)上找到TableMapping ['Table']或DataTable'Table'.); 线

为什么会抛出这种错误?

SqlConnection con = new SqlConnection();
con.ConnectionString = connectionString();

DataSet ds = new DataSet();

string strQuery = "SELECT * FROM Cars";
SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = new SqlCommand(strQuery, con);

SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

adapter.Fill(ds, "Cars");

//Code to modify data in the DataSet
ds.Tables["Cars"].Rows[0]["Brand"] = "NewBrand";

adapter.UpdateCommand = builder.GetUpdateCommand();
adapter.Update(ds);
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 9

使用

adapter.Update(ds, "Cars");
Run Code Online (Sandbox Code Playgroud)

代替.

我测试了它.没有相同的错误,如果我指定了表名,它就有效.但是,我必须承认,我还不知道为什么DataAdapter需要知道表名,因为它具有所需的所有信息.如果我使用ds.GetChanges我得到一行正确的表名.

更新我在MSDN上找不到任何内容,但最终在源代码中找到它(ILSpy).这是执行DBDataAdapter.Update(DataSet):

public override int Update(DataSet dataSet)
{
    return this.Update(dataSet, "Table");
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您没有指定表,"Table"则使用表名,如果您指定了除此之外的表名,您将收到此错误,这真的很奇怪!

我假设这样做的原因是DataAdapter无法调用GetChanges以确定要更新的表有两个原因:

  1. 这将是低效的,因为它需要循环所有表及其所有行以查找具有RowState!=的行Unchanged
  2. 由于多个表包含已更改的行,因此可能需要更新多个表.这不是通过支持DataAdapter.因此DataAdapter.Update(DataSet)假设默认名称"Table"为table-name.

编辑:但是,也许有人可以解释我为什么DataAdapter不使用DataSet.Tables[0].TableName.

因此,一般来说,最佳做法是指定要更新的表的名称.