2011-11-25 73 views
1

过去几年来,我一直在使用ORM,在个人项目上,我很沮丧地发现自己在简单的ADO.NET中挣扎。ADO.NET执行部分更新/插入

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

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

我的问题是,由于数据库表的潜在规模,我不想执行Adapter.Fill到内存中(如几乎每参考和教程将演示),而使用增量数据集以将新的/修改的数据推回到数据库。

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

我是否使用正确的ADO.NET类来执行这样的批量UPDATE/INSERT(按照“批处理”的方式,我不必在循环中执行它,而不是任何给定的数据库实际上可能在下面执行的操作盖子)?

回答

0

问题在这里变成了数据行的RowState。

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

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

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

我aknowledge,这是远离优雅的解决方案数据库,但工作之一。我会更新这个答案,如果我找到一个更好的方法