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

时间:2011-11-25 04:04:52

标签: sql ado.net

过去几年我一直在与ORM合作,而且,在一个个人项目中,我很沮丧地发现自己正在努力使用简单的ADO.NET。

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

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

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

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

我是否正在使用正确的ADO.NET类来执行这样的批量UPDATE / INSERT(就我不必在循环中执行“批处理”而不是任何给定的数据库在盖)?

1 个答案:

答案 0 :(得分:0)

此处的问题原来是数据行的RowState。

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

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

RowState是一个只读字段,因此无法手动将其设置为“修改”。

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

// ... 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

将此数据持久保存到数据库

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