首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OleDbDataAdapter更新DataTable C#

使用OleDbDataAdapter更新DataTable C#
EN

Stack Overflow用户
提问于 2012-04-16 12:58:20
回答 2查看 14.4K关注 0票数 1

我一直试图使用OleDbDataAdapter更新DataTable,但是对命令感到困惑。因为我有时从不同的表中获得信息,所以我不能使用CommandBuilder。因此,我尝试在on上创建命令,但发现很难使用参数。DataTable.GetChanges返回需要使用INSERT或UPDATE命令的行--我想我无法区分它们。我需要你完成以下工作:

代码语言:javascript
复制
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....)?

,非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-17 13:09:49

数据适配器可以与datatable一起工作。因此,我实际上已经将我的类打包成一个类,并且运行得相当好。除了我的东西的复杂性,这里有一个片段,可能会帮助你前进。添加参数时,可以标识数据来自DataTable的列源。这样,当内部标识为“添加”或“更新”(或“删除”)的记录时,当您构建SQL Insert/Update/Delete命令时,它将从相应的行中提取数据。

例如。假设我有一个DataTable,主键是"MyID“,并且有列"ColX,ColY,ColZ”。我创建我的DataAdapter并构建我的select、update、delete命令。(?是参数的位置保持器)

代码语言:javascript
复制
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 = ?";

现在,每个人都必须有各自的“参数”。参数必须按照与其对应的"?“相同的顺序添加。位置持有者。

//虽然我使用伪值来准备参数,但它只是为了//数据类型的目的。当应用这些更改时,它确实会通过数据适配器进行更改。

代码语言:javascript
复制
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 );

根据其类型对其他参数执行类似的操作.查尔,int,双倍,随便吧

再说一遍,我有一个包装类,它可以根据每个表来处理管理.简而言之

代码语言:javascript
复制
public myClassWrapper
{
    protected DataTable myTable;
    protected DataAdapter myAdapter;
    ... more ...

    protected void SaveChanges()
    {
    }
}

它比这更复杂,但在"SaveChanges“期间,datatable和dataAdapter出于各自的目的是同步的。现在,冲洗数据。我检查表的状态,然后您可以将整个表传递给dataAdapter进行更新,它将循环遍历所有更改的记录并推送相应的更改。不过,您将不得不捕捉任何可能的数据错误。

代码语言:javascript
复制
myAdapter.Update( this.MyTable );

在查找每个“更改”记录时,它从列Source中提取值,该值由传递给适配器进行处理的表中的参数标识。

希望这能给你带来一个巨大的飞跃,你正在遇到什么。

我会将您的更新放在try/catch中,然后进入程序以查看异常情况。错误的消息和/或内部异常可能会提供更多信息。但是,尝试将更新简化为只包含几个包含WHERE "Key“元素的字段。

另外,我发现,在第一部分的回答中漏掉了这个。您可能必须标识datatable的"PrimaryKey“列。要做到这一点,需要DataTable的一个属性,以及表示表的主键的列数组。我所做的是..。

代码语言:javascript
复制
// set the primary key column of the table
DataColumn[] oCols = { myDataTbl.Columns["myID"] };
myDataTbl.PrimaryKey = oCols;

我将注释掉您的完整更新字符串及其用于更新的所有参数。然后,使用只设置2-3列的示例和where子句构建它。

代码语言:javascript
复制
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“和”字符“列.然后再加上其他的。还有,你反对哪个数据库。有些数据库不使用"?“作为命令中的占位符,但使用“命名”参数,有些则使用

代码语言:javascript
复制
"actualColumn = @namedCol"
or even
"actualColumn = :namedCol"

希望这能让你渡过难关..。

票数 2
EN

Stack Overflow用户

发布于 2012-04-16 13:21:58

您可以使用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));

Eidt /评论

要处理row[0]row[1]需要一个循环,如:

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

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

da.Update(dt);

}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10174549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档