如何用DataTable替换DataBase表

时间:2011-05-10 03:03:53

标签: c# wpf datatable sql-server-ce

我正在尝试用DataTable(绑定到DataGrid)替换我的DataSource( SQL CE 数据库)中的表(FooTable)。我想这样做的原因是:在我从数据库填充到DataSet(显示DataGrid上的所有行)之后,我可以编辑,删除和向{添加多行{1}}。每次修改DataTable时,我都不想更改对DataSource(DataTable)的更改,而是希望在会话结束时集体完成。

我的方法很简单:

  1. `删除`我的DataSource表中的所有数据(FooTable)(我使用** SQL CE **,因此`TRUNCATE`不可用)
  2. 将`DataTable'数据插入到清空的DataSource表
  3. 以下是我的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();
    }
    

1 个答案:

答案 0 :(得分:2)

内部DataTable跟踪RowState 修改现有行时,其RowState变为Modified,因此DataAdapter会尝试运行UPDATE命令。

您需要在已修改的行上调用SetAdded()方法,将RowState设置为Added而不是Modified