我有一个名为 DTAllCustomers 的数据表,我逐个记录地更新它,但是我现在需要更改数据表几乎所有记录中的一个字段。我想用数据表中的更新信息快速更新数据库。
我试过了:
Dim objCmdBuilder As New SQLiteCommandBuilder(AllCustomersAdapter)
DTAllCustomers.AcceptChanges()
AllCustomersAdapter.UpdateCommand = objCmdBuilder.GetUpdateCommand()
AllCustomersAdapter.Update(DTAllCustomers)
每个命令都被处理,但是底层数据库没有被改变?
我已经搜索了一段时间,但找不到我做错了什么。
任何帮助是极大的赞赏
布拉德
最佳答案
问题是您正在调用 AcceptChanges
.一旦您接受了更改,就没有更多的更改,那么 Update
是什么?要救吗?那Update
方法已调用 AcceptChanges
一旦将这些更改保存到数据库中,就会隐式地进行。您必须调用AcceptChanges
的情况很少见。明确地。以下是一些您可能会操纵接受更改的场景。
Fill
在数据适配器上,该方法将在内部添加一堆 DataRows
到DataTable
.在这种情况下,RowState
每个将是Added
,就像你自己添加一行一样。但是,这通常不是您在检索数据时想要的,所以 Fill
隐式调用 AcceptChanges
默认情况下。假设您想从一个数据库中检索数据并将其插入到另一个数据库中。在这种情况下,您确实希望所有行都是 Added
.为此,您设置 AcceptChangesDuringFill
数据适配器的属性为 False
. DataTable
包含要保存到两个不同数据库表的更改。在这种情况下,您将需要两个不同的数据适配器。您需要第一个 Updte
调用不接受更改,以便第二个数据适配器仍然可以使用它们。在这种情况下,您设置 AcceptChangesDuringUpdate
第一个数据适配器的属性为 False
调用 Update
后更改仍然存在.您可以允许 AcceptChanges
由第二个数据适配器隐式调用,或者您可以设置 AcceptChangesDuringUpdate
也可以,然后调用AcceptChanges
明确地。 DataTables
在父/子关系中,并且您希望将两者的更改保存到数据库中。在这种情况下,您需要在父删除之前保存子删除,并在子插入之前保存父插入。为此,您可以调用 GetChanges
在 DataTables
以适当的顺序获取要保存的子集。因为你没有通过原始 DataTables
至Update
,他们的更改不会被隐式接受,因此您需要调用 AcceptChanges
明确地在每个 DataTable
保存成功后。 关于vb.net - 在 vb.net 和 sqlite 中将数据表保存回数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57941885/