如何将数据库表替换为数据表
本文关键字:替换 数据表 数据库 | 更新日期: 2023-09-27 17:56:11
我正在尝试将数据源(SQL CE数据库)中的表(FooTable)替换为DataTable
(绑定到DataGrid
)。我想这样做的原因是:从数据库填充到DataSet
(显示DataGrid
上的所有行)后,我可能会编辑、删除并向DataTable
添加多行。与其在每次修改数据表时更新对数据源 (SQL CE
) 所做的更改,不如在会话结束时集体执行此操作。
我的方法很简单:
- 从我的数据源表(FooTable)中"删除"所有数据(我正在使用**SQL CE**,因此"TRUNCATE"不可用)
- 将"数据表"的数据插入到清空的数据源表中
以下是我的 C# 代码
/* 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
上添加或删除行,则代码有效,但是当我编辑DataTable
上的特定行并将表插入我的数据源时,出现以下错误
"更新在传递包含已修改行的数据行集合时需要有效的更新命令。"
我不明白为什么会出现此错误。我已经清空了数据源表中的所有行,我的数据源不应该不知道有修改的行,而是将所有数据表行作为新行插入。
或者,是否有一种简单的方法可以将数据源表"替换为"数据表?
[已编辑]
我尝试手动设置行状态,如以下代码
foreach (DataRow row in dt.Rows)
{
row.RowState = DataRowState.Added;
}
但 RowState 只是只读的,不能写入。
[已编辑 - 第 2 次]我尝试使用 SetAdded() 设置它
foreach (DataRow row in dt.Rows)
{
row.SetAdded();
}
然后我收到以下错误:"SetAdd 和 SetModified 只能在具有未更改 DataRowState 的 DataRows 上调用。
仍然无法让它工作...
[已编辑 - 第 3 次]所以最后让它使用以下代码工作:
using (SqlCeCommand insCmd = new SqlCeCommand(@"INSERT INTO FooTable (FooName) VALUES (@fooName)", conn))
{
insCmd.Parameters.Add("@fooName", SqlDbType.NVarChar, 10, "FooName");
dt.AcceptChanges();
foreach (DataRow row in dt.Rows)
{
row.SetAdded();
}
da.InsertCommand = insCmd;
da.Update(ds, "FooTable");
}
DataTable
在内部跟踪RowState
。
修改现有行时,其RowState
变为Modified
,因此DataAdapter
会尝试运行 UPDATE
命令。
您需要对修改的行调用 SetAdded()
方法,以将其RowState
设置为 Added
而不是 Modified
。