2012-04-16 49 views
1

我一直在嘗試使用OleDbDataAdapter來更新數據表,但對命令感到困惑。 由於我有時從不同的表中獲取信息,因此我無法使用CommandBuilder。 所以我試圖在我的上創建命令,但發現它與參數很難。 DataTable.GetChanges返回需要使用INSERT或UPDATE命令的行 - 我想我不能區分它們。 我需要你來完成下列操作:使用OleDbDataAdapter更新數據表C#

DataTable dt = new DataTable(); 
OleDbDataAdapter da = new OleDbDataAdapter(); 
// Here I create the SELECT command and pass the connection. 
da.Fill(dt); 
// Here I make changes (INSERT/UPDATE) to the DataTable (by a DataGridView). 
da.UpdateCommand = new OleDbCommand("UPDATE TABLE_NAME SET (COL1, COL2, ...) VALUES (@newVal1, @newVal2, ...) WHERE [email protected]"); // How can I use the values of the current row (that the da is updating) as the parameters (@newVal1, @newVal2, id....)? 

非常感謝您!

回答

2

數據適配器可以與數據表一起工作。因此,我實際上已經把我的一起打包成一個班,工作得很好。除了我的東西的複雜性,這裏有一個片段可以幫助你。添加參數時,可以確定數據來自DataTable的列源。這樣,當記錄在內部被識別爲「已添加」或「已更新」(或「已刪除」)時,當您構建SQL插入/更新/刪除命令時,它將從各行的列中提取數據。

例如。假設我有一個DataTable,主鍵是「MyID」,並且有列「ColX,ColY,ColZ」。創建我的DataAdapter,打造出我的選擇,更新,刪除命令類似...(?是的參數的佔位符)

DataAdapter myAdapter = new DataAdapter() 

myAdapter.SelectCommand = new OleDbCommand(); 
myAdapter.InsertCommand = new OleDbCommand(); 
myAdapter.UpdateCommand = new OleDbCommand(); 
myAdapter.DeleteCommand = new OleDbCommand(); 

myAdapter.SelectCommand.CommandText = "select * from MyTable where MyID = ?"; 
myAdapter.InsertCommand.CommandText = "insert into MyTable (ColX, ColY, ColZ) values (?, ?, ?)"; 
myAdapter.UpdateCommand.CommandText = "update MyTable set ColX = ?, ColY = ?, ColZ = ? where MyID = ?"; 
myAdapter.DeleteCommand.CommandText = "delete from MyTable where MyID = ?"; 

現在,每次都必須有各自的「參數」。參數必須按照與其相應的「?」相同的順序相加。佔位。

//雖然我在編制參數時使用了虛假值,但它只是用於數據類型目的的 。它通過數據適配器得到改變時,它可將更改應用於

OleDbParameter oParm = new OleDbParameter("myID", -1); 
oParm.DbType = DbType.Int32; 
oParm.SourceColumn = "myID"; // <- this is where it looks back to source table's column 
oParm.ParameterName = "myID"; // just for consistency/readability reference 

myAdapter.SelectCommand.Parameters.Add(oParm); 

做基於它們的類型......字符,整型,雙參數其餘類似,無論

同樣,我有一個像基於每個表格處理管理的包裝類...在簡短的

public myClassWrapper 
{ 
    protected DataTable myTable; 
    protected DataAdapter myAdapter; 
    ... more ... 

    protected void SaveChanges() 
    { 
    } 
} 

它不僅僅是這個更復雜,但在「調用SaveChanges」,數據表和DataAdapter是同步達到自己的目的。現在,刷新數據。我檢查表的狀態,然後你可以將整個表傳遞給dataAdapter進行更新,並且它將遍歷所有更改的記錄並推送相應的更改。儘管如此,你將不得不陷入任何可能的數據錯誤。

myAdapter.Update(this.MyTable); 

作爲找到的每個「變爲」記錄,就會從所標識的是在表中被傳遞給適配器進行處理中發現的參數列源極中的值。

希望這給了你一個巨大的跳躍,你正在進入。

---- COMMENT每一次反饋----

我會把您的更新一個try/catch內,並進入程序見異常是什麼。該錯誤的消息和/或內部異常可能會提供更多信息。但是,嘗試簡化您的更新只包含WHERE「Key」元素的FEW字段。

另外,我選擇了,從第一部分的答案錯過了。您可能需要識別數據表的「PrimaryKey」列。爲此,它需要DataTable的屬性和表示表的主鍵的列的數組。我做的是...

// set the primary key column of the table 
DataColumn[] oCols = { myDataTbl.Columns["myID"] }; 
myDataTbl.PrimaryKey = oCols; 

我會註釋掉你的完整更新字符串及其更新的所有參數。然後,一樣簡單我只設置2-3列樣品和where子句

myAdapter.UpdateCommand.CommandText = "update MyTable set ColX = ?, ColY = ? where MyID=?"; 
Add Parameter object for "X" 
Add Parameter object for "Y" 
Add Parameter object for "MyID" 

皮克領域,如int或字符建立它讓他們有對數據類型轉換問題最少的概率,那麼,一旦工作,嘗試添加所有「int」和「字符」列......然後添加其他任何其他人。另外,你反對哪個數據庫。有些數據庫不使用「?」作爲佔位符的命令,但使用「命名」參數,一些使用

"actualColumn = @namedCol" 
or even 
"actualColumn = :namedCol" 

希望這可以讓你渡過了難關......

+0

謝謝。我仍然遇到執行Update方法的問題。它說我缺少一個參數的值。有沒有可能是因爲我沒有使用數據集? (我只是使用DataTable並使用BindingSource對象將其綁定到DataGridView)。謝謝( – gavra 2012-04-19 08:54:26

+0

@ gavra,看到擴展的答案,讓我知道。 – DRapp 2012-04-19 11:01:03

+0

非常感謝!這一次的問題是我試圖更新主鍵列。現在它工作的很好,我會包裝它,並將使用它在我的項目中。祝你有美好的一天! – gavra 2012-04-19 12:11:39

1

您可以使用String.Format Method更換@newVal1, @newVal2, ...在你的代碼,這樣da.UpdateCommand = new OleDbCommand(String.Format("UPDATE TABLE_NAME SET (COL1, COL2, ...) VALUES ({0}, {1}, ...) WHERE [email protected]",OBJECT_ARRAY_CONTAINING_VALUES_FROM_THEDG));

[根據註釋Eidt]

爲了處理row[0]row[1]你需要像一個循環:

for(i=0; i<rows.Count; i++) {

        da.UpdateCommand = new OleDbCommand(String.Format("UPDATE ... ",row[i]);

        da.Update(dt);

}

+0

謝謝您的答覆。我知道這種方法。問題是更新數據表中的所有行,我只有一個更新命令。例如,我可能想用作參數rows [0] .myColumn,之後參數需要是rows [1] .myColumn。我還注意到有一種更新方法,甚至沒有定義更新命令。只是還沒有想出如何。 – gavra 2012-04-17 05:21:20

+0

您是否查看了Microsoft的[DataAdapter.Update](http://msdn.microsoft.com/zh-cn/library/system.data.common.dataadapter.update.aspx)文檔? – 2012-04-17 12:16:20