此代码片段引发错误:
更新无法在适配器上找到 TableMapping['Table'] 或 DataTable 'Table'。)。Update(ds);线
为什么它会抛出这种类型的错误?
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);
Use
adapter.Update(ds, "Cars");
instead.
我已经测试过了。我得到了同样的错误,如果我指定表名,它就会起作用。然而,我必须承认,我还不知道为什么DataAdapter
需要知道表名,因为它具有所需的所有信息。如果我使用ds.GetChanges我得到一行具有正确的表名。
Update我没有找到任何关于MSDN但最终在源代码(ILSpy)中找到了它。这是执行DBDataAdapter.Update(DataSet)
:
public override int Update(DataSet dataSet)
{
return this.Update(dataSet, "Table");
}
因此,如果您不指定表,则表名"Table"
使用,如果您指定了除此之外的表名,您将收到此错误,这真的很奇怪!
我认为造成这种情况的原因是DataAdapter
无法打电话GetChanges
确定要更新的表有两个原因:
- 它的效率很低,因为它需要循环所有表及其所有行来查找具有
RowState
!= Unchanged
- 可能需要更新多个表,因为它们包含更改的行。不支持通过
DataAdapter
. Hence DataAdapter.Update(DataSet)
假定默认名称"Table"
作为表名。
Edit: 不过,也许有人可以解释一下为什么DataAdapter
不使用DataSet.Tables[0].TableName
反而。
因此,一般来说,指定要更新的表的名称似乎是最佳实践。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)