使用 OleDbDataAdapter 更新 DataTable C#
本文关键字:DataTable 更新 OleDbDataAdapter 使用 | 更新日期: 2023-09-27 18:31:27
我一直在尝试使用OleDbDataAdapter来更新DataTable,但对这些命令感到困惑。由于我有时会从不同的表中获取信息,因此我无法使用CommandBuilder。所以我尝试在我的 on 上创建命令,但发现参数很难。DataTable.GetChanges 返回需要使用 INSERT 或 UPDATE 命令的行 - 我想我无法区分它们。我需要您完成以下操作:
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 id=@id"); // How can I use the values of the current row (that the da is updating) as the parameters (@newVal1, @newVal2, id....)?
谢谢!
数据适配器可以与数据表结合使用。 因此,我实际上已经将我的打包成一个类并且效果很好。 除了我的东西的复杂性之外,这里有一个片段可能会帮助你。 添加参数时,可以标识数据来自数据表的列源。 这样,当记录在内部标识为"已添加"或"已更新"(或"已删除")时,当您构建 SQL 插入/更新/删除命令时,它将从相应行的列中提取数据。
例如。 假设我有一个数据表,主键是"MyID",并有"ColX,ColY,ColZ"列。 我创建我的数据适配器并构建我的选择,更新,删除命令,例如...(? 是参数的占位符)
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()
{
}
}
它比这更复杂,但在"保存更改"期间,数据表和数据适配器出于自己的目的而同步。 现在,刷新数据。 我检查表的状态,然后您可以将整个表传递给 dataAdapter 进行更新,它将循环浏览所有更改的记录并推送相应的更改。 不过,您必须捕获任何可能的数据错误。
myAdapter.Update( this.MyTable );
当它找到每个"更改的"记录时,它会从列源中提取值,这些值由在传递给适配器进行处理的表中找到的参数标识。
希望这能让你在遇到的事情上有很大的飞跃。
----每个反馈----的评论
我会将您的更新放在 try/catch 中,然后进入程序以查看异常是什么。 错误消息和/或错误的内部异常可能会提供更多信息。 但是,请尝试简化您的 UPDATE,以仅包含带有 WHERE "Key" 元素的几个字段。
此外,我哎呀,错过了第一部分答案。 您可能需要标识数据表的"主键"列。 为此,它是 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 或 char 这样的字段,这样它们在数据类型转换中出现问题的可能性最小,然后,一旦成功,请尝试添加所有"int"和"字符"列......然后添加任何其他内容。 另外,您要针对哪个数据库。 有些数据库在命令中不使用"?"作为占位符,而是使用"命名"参数,有些使用
"actualColumn = @namedCol"
or even
"actualColumn = :namedCol"
希望这能让你克服困难...
您可以使用 String.Format 方法来替换代码中的@newVal1, @newVal2, ...
,如下所示da.UpdateCommand = new OleDbCommand(String.Format("UPDATE TABLE_NAME SET (COL1, COL2, ...) VALUES ({0}, {1}, ...) WHERE id=@id",OBJECT_ARRAY_CONTAINING_VALUES_FROM_THEDG));
[开斋节每条评论]
要处理row[0]
,row[1]
你需要一个循环,如下所示:
for(i=0; i<rows.Count; i++)
{
da.UpdateCommand = new OleDbCommand(String.Format("UPDATE
......",row[i]);
da.Update(dt);
}