如何将数据库表替换为数据表

本文关键字:替换 数据表 数据库 | 更新日期: 2023-09-27 17:56:11

我正在尝试将数据源(SQL CE数据库)中的表(FooTable)替换为DataTable(绑定到DataGrid)。我想这样做的原因是:从数据库填充到DataSet(显示DataGrid上的所有行)后,我可能会编辑、删除并向DataTable添加多行。与其在每次修改数据表时更新对数据源 (SQL CE) 所做的更改,不如在会话结束时集体执行此操作。

我的方法很简单:

  1. 从我的数据源表(FooTable)中"删除"所有数据(我正在使用**SQL CE**,因此"TRUNCATE"不可用)
  2. 将"数据表"的数据插入到清空的数据源表中

以下是我的 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