2014-11-24 117 views
0

我正在將vba程序轉換爲c#。 vba程序使用來自不同記錄集rst2的值修改/添加行到記錄集rst1。 c#版本使用OleDbDataAdapter將查詢中的數據填充到數據集csrst1表0中。c#使用數據集更新Access數據庫表

在vba版本中,rst1.update似乎直接修改數據庫錶行。問題是,在更新/修改數據集之後是否有更新訪問數據庫行的方法?有一個更好的方法嗎?

這是我到目前爲止已經完成了...

vba: 
rst1.FindFirst "[L1]=" & ![VendorID] & " AND [D1]=#" & ![REQ_IP_DATE] & "#" 
If rst1.NoMatch Then 
    rst1.AddNew 
    '...new row fields set 
    rst1.Update 
Else 
    rst1.Edit 
    '...rows edited 
    rst1.Update 
End If 

(上面的代碼中的隨着RST2做循環。該RST1字段與RST2值進行更新。)

c#: 
foreach(DataRow dr in csrst2.Tables[0].Rows) 
{ 
    var findfirst = csrst1.Tables[0].Select("[L1]=" + dr[0] + " AND [D1]=#" + dr[1] + "#"); 
    if(findfirst.Count() < 1) 
    { 
     var newRow = csrst1.Tables[0].NewRow(); 
     //...new row fields set 
     csrst1.Tables[0].Rows.Add(newRow); 
    } 
    else 
    { 
     findfirst[0].BeginEdit(); 
     //...rows edited 
     findfirst[0].AcceptChanges(); 
    } 
} 

回答

0

我在這裏找到了我的問題的答案:http://msdn.microsoft.com/en-us/library/xzb1zw3x.aspx,使用adapter.update。這似乎很慢(需要15-20秒才能執行141行),所以如果有其他解決方案,我想知道它!

這裏就是我所做的:

c#: 
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter); 
foreach(DataRow dr in csrst2.Tables[0].Rows) 
{ 
    var findfirst = csrst1.Tables[0].Select("[L1]=" + dr[0] + " AND [D1]=#" + dr[1] + "#"); 
    if(findfirst.Count() < 1) 
    { 
     var newRow = csrst1.Tables[0].NewRow(); 
     //...new row fields set 
     csrst1.Tables[0].Rows.Add(newRow); 
     adapter.Update(csrst1.Tables[0]); 
    } 
    else 
    { 
     findfirst[0].BeginEdit(); 
     //...rows edited 
     findfirst[0].AcceptChanges(); 
     adapter.Update(csrst1.Tables[0]); 
    } 
}