gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:22:46 26 4
gpt4 key购买 nike

此代码片段引发错误:

Update unable to find TableMapping['Table'] or DataTable 'Table'.) on adapter.Update(ds); line

为什么会抛出这种类型的错误?

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

最佳答案

使用

adapter.Update(ds, "Cars");

相反。

我已经测试过了。我得到了同样的错误,如果我指定了表名,它就可以工作。然而,我必须承认,我还不知道为什么 DataAdapter 需要知道表名,因为它有它需要的所有信息。如果我使用 ds.GetChanges我得到一行正确的表名。

更新 我在MSDN 上什么都没找到|但最终在源代码(ILSpy)中找到了它。下面是 DBDataAdapter.Update(DataSet) 的实现:

public override int Update(DataSet dataSet)
{
return this.Update(dataSet, "Table");
}

因此,如果您未指定表,则会使用表名 "Table",如果您指定的表名不是该表名,则会出现此错误,那是真奇怪!

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

  1. 这将是低效的,因为它需要循环所有表及其所有行以找到具有 RowState != Unchanged
  2. 的行
  3. 可能需要更新多个表,因为它们包含更改的行。 DataAdapter 不支持它。因此 DataAdapter.Update(DataSet) 假定默认名称 "Table" 作为表名。

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

所以一般来说,最好的做法似乎是指定要更新的表的名称。

关于c# - DataAdapter:更新无法找到 TableMapping ['Table' ] 或 DataTable 'Table',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19228608/

26 4 0