數據適配器可以與數據表一起工作。因此,我實際上已經把我的一起打包成一個班,工作得很好。除了我的東西的複雜性,這裏有一個片段可以幫助你。添加參數時,可以確定數據來自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"
希望這可以讓你渡過了難關......
謝謝。我仍然遇到執行Update方法的問題。它說我缺少一個參數的值。有沒有可能是因爲我沒有使用數據集? (我只是使用DataTable並使用BindingSource對象將其綁定到DataGridView)。謝謝( – gavra 2012-04-19 08:54:26
@ gavra,看到擴展的答案,讓我知道。 – DRapp 2012-04-19 11:01:03
非常感謝!這一次的問題是我試圖更新主鍵列。現在它工作的很好,我會包裝它,並將使用它在我的項目中。祝你有美好的一天! – gavra 2012-04-19 12:11:39