ADO.NET 执行部分更新/插入

Posted

技术标签:

【中文标题】ADO.NET 执行部分更新/插入【英文标题】:ADO.NET Performing a partial Update / Insert 【发布时间】:2011-11-25 04:04:51 【问题描述】:

过去几年我一直在使用 ORM,在一个个人项目中,我很沮丧地发现自己在使用简单的 ADO.NET 时遇到了困难。

我有一个数据库,其中包含存储事务性数据和缓慢变化数据的表。要更新/插入的数据来自网络。

我正在尝试在 ADO.NET 中使用断开连接的数据适配器范例,在相对通用的 DB 类中允许许多/所有 ADO.NET 数据库实现。

我的问题是,由于数据库表的潜在大小,我不想执行 Adapter.Fill 到内存中(几乎每个参考和教程都会演示),而是使用 delta DataSet 将新/修改的数据推送回数据库。

如果我在 DataSet 上执行 DbDataAdapter.FillSchema,我会得到一个模式,并且我可以填充数据表,但是所有数据,无论我传递给我的关键字段是什么,都会在我更新时被视为新行使用 Adapter.Update 的表。

我是否使用正确的 ADO.NET 类来执行这样的批量 UPDATE / INSERT(通过“批量”,因为我不必在循环中执行它,而不是任何给定数据库可能在盖子)?

【问题讨论】:

【参考方案1】:

这里的问题原来是数据行的 RowState。

当通过 DataAdapter 填充 DataSet 时,对现有行和现有行的更改会将行的 RowState 设置为已修改。

添加到 DataSet 的数据被视为新行,其 RowState 将设置为已添加。

RowState为只读字段,不能手动设置为Modified。

因此,从客户端接收到的所有更新数据应添加如下:

// ... where dataTransferObject.IsNew == false 
DataRow row = table.NewRow();

row["Id"] = dataTransferObject.Id;//Set Key fields on row

table.Rows.Add(row);//Add row to table            

row.AcceptChanges();//change RowState to Unchanged

row["MyData1"] = dataTransferObject.MyData1; //Set other fields in row
row["MyData2"] = dataTransferObject.MyData2; //Set other fields in row
row["MyData3"] = dataTransferObject.MyData3; //Set other fields in row

我也忽略了 CommandBuilder 并手工制作了我的 Insert、Update 和 Select 语句。

现在可以使用 adapter.Update 将这些数据持久化到数据库中

我知道这远非一个优雅的解决方案,而是一个可行的解决方案。如果我找到更好的方法,我会更新这个答案

【讨论】:

以上是关于ADO.NET 执行部分更新/插入的主要内容,如果未能解决你的问题,请参考以下文章

WCF ado.net 插入记录(最后)

使用 ADO.NET Entity Framework 将记录插入 Sqlite DB?

使用 ADO.NET 的 PostgreSQL 参数化插入

使用 INSERT IDENTITY 插入多个表 - ADO.Net

ADO.NET之使用DataSet类更新数据库

ADO.NET 正确插入数据