使用OleDbDataAdapter的更新一个DataTable C#(Using OleDbDat

2019-06-23 16:06发布

我一直在尝试使用OleDbDataAdapter的更新数据表中却得到了困惑的命令。 因为我有时会从不同势表的信息,我不能使用CommandBuilder的。 所以,我试图创建我的命令,但与参数发现很难。 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....)?

非常感谢你!

Answer 1:

该数据适配器可以与数据表一起工作。 因此,我实际上裹矿连成一类和工作得很好。 除开我的东西复杂,这里有一个片段,它可以帮助你一起。 在添加参数,您可以识别数据从数据表来列源。 这样,当一个记录被内部认定为“添加”或“更新”(或“删除”),当你建立你的SQL插入/更新/删除命令,它将从各行拉离列中的数据。

例如。 说我有一个DataTable,主键是“身份识别码”,并已列“COLX,科利,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 = ?";

现在,每次都必须有各自的“参数”。 该参数在同一个序列及其对应的被addded“?” 占位。

//虽然我在假值将准备的参数,它只是//数据类型的目的。 它通过数据适配器得到改变,当它应用更改

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,双,参数其余任何类似

同样,我有这样的处理在每个表的基础同治的包装类...应有尽有

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

    protected void SaveChanges()
    {
    }
}

它更复杂的不仅仅是这一点,但在“调用SaveChanges”,数据表和DataAdapter是同步达到自己的目的。 现在,将数据刷新。 我检查表的状态,然后你可以将整个表传递到DataAdapter的更新,然后它会通过所有周期更改的记录,推动各自的变化。 你必须来捕获任何可能的数据错误,但。

myAdapter.Update( this.MyTable );

因为它找到的每个“变为”记录,就会从所标识的是在表中被传递给适配器进行处理中发现的参数列源极中的值。

希望这给了你你正在运行到什么一个巨大的跳跃。

---- COMMENT每一次反馈----

我会把您的更新一个try / catch内,并进入程序见异常是什么。 消息ADN /或错误的内部异常可能会给更多的信息。 但是,尽量简化您的更新,只包括与WHERE“密钥”元素的几个字段。

此外,我oopsed,从第一部分的答案错过了这个。 您可能需要识别数据表中的“PrimaryKey的”一栏。 为了这样做,其一个期望和代表该表的主键列的阵列数据表的特性。 我所做的是...

// 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"

希望这可以让你渡过了难关......



Answer 2:

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

}



文章来源: Using OleDbDataAdapter to update a DataTable C#