从数据集更新数据库的奇怪问题

时间:2008-12-21 15:45:02

标签: c# sql database

运营:

从数据集中删除DataGridView选定的行:

FuDataSet.FuRow row = (FuDataSet.FuRow) ((DataRowView)FuBindingSource.Current).Row;
row.Delete();

要添加我正在执行的新行:

FuDataSet.FuRow row = FuDataSet.Fus.NewFuRow();
row.Someting = "Some initial Content";
row.SomethingElse = "More Initial Content";
...
FuDataSet.Fus.AddFuRow(row);

在数据集中保存当前行中的用户更改:

FuDataSet.FuRow row = (FuDataSet.FuRow) (((DataRowView) FuBindingSource.Current).Row);
row.Someting = someTextBox.text;
...

保存在数据库中:

Validate();
FuBindingSource.EndEdit();
FuTableAdapter.Update(FuDataSet.Fus); <-- Exception here

我正在使用标准DatagridView,Dataset,TableAdapter,BindingSource Scheme VS在定义数据库结构后自动启动。只涉及一个表,并使用SQL Server compact 3.5。

现在我的问题是我每次执行此操作时都会收到并发异常(DeletedRowInaccessibleException)(从空数据库开始): 创建新行,删除此行,保存在数据库中,新行,保存在数据库中,删除此行,保存在数据库中&lt; - 异常

我认为数据库和数据集之间存在一些同步问题。

如果我在每次保存后通过FuTableAdapter.Fill(FuDataSet.Fus)重新加载数据库,问题就消失了。但是,这不是我想的意图。

我希望有人可以帮助我,发现设计失败或解释可能出现的问题。

谢谢!

2 个答案:

答案 0 :(得分:1)

您的表是否有自动增量标识列作为主键?如果是这样,它可能不会在插入后使用新值更新数据集表,因此当您要删除它时,它无法在数据库中找到该行。这可以解释为什么一旦你调用Fill()方法它就可以工作。

您需要以某种方式返回插入的主键,以便数据集表与数据库保持同步。如果使用存储过程执行插入,则可以使用out参数返回主键。如果在命令中使用SQL insert语句,不确定最佳方法是什么,但是您必须从数据库表中获取主键并将其分配给数据库表行。

在保存后不确定是否这样做,但调用FuDataSet.AcceptChanges()将帮助数据集在数据库更新后跟踪新的更改。

答案 1 :(得分:0)

您列出的内容是正确的。在数据集表中创建新行时,它会创建自己的ID。保存到数据库时,数据库表也会创建自己的ID,这在大多数情况下会与数据集中的ID不同。

为该表创建表适配器时,必须提供sql状态才能创建数据集表。在高级选项按钮上,有一个名为“刷新数据表”的复选框。检查是否在插入和更新后添加了sql语句以检索标识列。

如果禁用该复选框,那么除了每次保存后重新加载数据外,我不确定您还能做什么,这不是最佳选择。

抱歉,我无法提供更多帮助。祝你好运