2011-11-25 109 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,這是遠離優雅的解決方案數據庫,但工作之一。我會更新這個答案,如果我找到一個更好的方法