2014-06-30 21 views
1

如何完成以下功能,接受刪除,插入和更新的記錄的三個收集參數,並將收集轉換爲DataTableDataAdapter以更新表格?如何將集合轉換爲DataTable for Ado.Net SqlDataAdapter.Update?

我找到了一種方法來將List轉換爲DataTable How to fill a datatable with List<T>。但是,它不會在DataTable中設置插入,更新和刪除標誌?

void Save(
    IEnumerable<int> deleted, 
    IEnumerable<Poco1> inserted, 
    IEnumerable<Poco1> updated) 
{ 
    var dt = new DataTable(); 
    .... // Initialize dt with deleted, inserted and update? 

    using (var con = new SqlConnection(ConnectionStr)) 
    { 
     con.Open(); 
     var da = new SqlDataAdapter("select * from table", con); 
     da.Update(dt); 
    } 
} 

或者還有更好的方法來從這三個集合中更新數據庫表嗎? (C#3.5)

回答

1

首先,你會想也定義插入,更新和刪除命令:

// Create the other commands. 
da.InsertCommand = new SqlCommand("...how to insert"); 

da.UpdateCommand = new SqlCommand("...how to update"); 

da.DeleteCommand = new SqlCommand("...how to delete"); 

或者你可以嘗試使用DbCommandBuilder將在運行時爲你做它:

// Create the DbCommandBuilder. 
DbCommandBuilder builder = factory.CreateCommandBuilder(); 
builder.DataAdapter = da; 

// Get the insert, update and delete commands. 
da.InsertCommand = builder.GetInsertCommand(); 
da.UpdateCommand = builder.GetUpdateCommand(); 
da.DeleteCommand = builder.GetDeleteCommand(); 

接下來,您需要定義數據表以匹配表,你的目標:

DataTable dt = new DataTable(); 
dt.Columns.Add(add your columns...) 

然後,您需要將行添加到DataTable,確保將行標記爲插入,更新或刪除。

DataRow dr = dt.NewRow(); 
dr["your column"] = ... 
// Don't forget to add the row to the table! 
dt.Rows.Add(dr); 
// Once the row is added then go ahead and mark it as deleted, modified or new 
dr.Delete() 
// or 
dr.SetAdded(); 
// or 
dr.SetModified(); 
+0

我得到的例外「的更多信息:SetAdded和SetModified之只能在具有不變的DataRowState數據行被稱爲」。當調用'dr.SetModified();'等。 – ca9163d9

+0

嘗試在設置其狀態之前調用行上的.AcceptChanges()。 –

0

它不會工作,你正在做的方式,做這樣的

using (var con = new SqlConnection(ConnectionStr)) 
    { 
     con.Open(); 
     var da = new SqlDataAdapter("select * from table", con); 
     var ds=new DataSet(); 
     da.Fill(ds); 
     var dt= ds.Tables[0]; 
     // all deleted rows 
     foreach(DataRow dr in dt.Rows.ToList()) 
{ 
    if(deleted.ToList().Contains((int)dr["id"])) 
{ 
     dr.Delete(); 
} 
//all updated rows 
foreach(var poco in updated.ToList() 
{ 
    DataRow dr = table.Select("id="+poco.id).FirstOrDefault(); 
    dr["field1]=poco.feild1 
    ....set all updated values 

} 
//all inserted rows 
foreach(var poco in inserted.ToList()) 
{ 
    var dr= dt.NewRow(); 
    dr["id"]=poco.id; 
    ..set all fields 
    dt.Rows.Add(dr); 
} 
} 
     dt.Accept 
     da.Update(dt); 
    }