我正在尝试用DataTable
(绑定到DataGrid
)替换我的DataSource( SQL CE 数据库)中的表(FooTable)。我想这样做的原因是:在我从数据库填充到DataSet
(显示DataGrid
上的所有行)之后,我可以编辑,删除和向{添加多行{1}}。每次修改DataTable时,我都不想更改对DataSource(DataTable
)的更改,而是希望在会话结束时集体完成。
我的方法很简单:
以下是我的C#代码
SQL CE
如果我在/* Truncate the DataSource Table */
SqlCeCommand delCmd = new SqlCeCommand("DELETE FROM FooTable", conn)
conn.Open();
delCmd.ExecuteNonQuery();
conn.Close();
/* Insert DataTable into an empty DataSource Table */
string ins = @"INSERT INTO FooTable (FooName) values (@fooName)";
SqlCeCommand cmd = new SqlCeCommand(ins, conn);
da.InsertCommand = cmd;
da.Update(ds, "FooTable");
上添加或删除行,代码就有效,但是当我编辑DataTable
上的特定行并将表格插入我的DataSource时,我收到以下错误
“在传递带有修改行的DataRow集合时,更新需要有效的UpdateCommand。”
我不明白为什么会收到此错误。我已经清空了我的DataSource表中的所有行,我的DataSource不应该知道有修改过的行,而是将所有DataTable行作为新行插入。
或者,是否有一种通过DataTable“替换”DataSource表的简单方法?
[EDITED]
我尝试手动设置RowState,如下面的代码
DataTable
但RowState只是只读且无法写入。
[编辑 - 第2名] 我尝试使用SetAdded()
进行设置foreach (DataRow row in dt.Rows)
{
row.RowState = DataRowState.Added;
}
然后我收到以下错误: “ SetAdded和SetModified只能在具有Unchanged DataRowState的DataRows上调用。”
仍然无法让它发挥作用......
[编辑 - 第3次] 所以最后让它使用以下代码:
foreach (DataRow row in dt.Rows)
{
row.SetAdded();
}
答案 0 :(得分:2)
内部DataTable
跟踪RowState
修改现有行时,其RowState
变为Modified
,因此DataAdapter
会尝试运行UPDATE
命令。
您需要在已修改的行上调用SetAdded()
方法,将RowState
设置为Added
而不是Modified
。