当前位置: 首页 > 编程语言 > C#

使用OleDbDataAdapter更新DataTable C#分享

时间:2023-04-10 10:47:32 C#

C#学习教程:使用OleDbDataAdapter来更新DataTable因为我有时会从不同的表中获取信息,所以我无法使用CommandBuilder。所以我试图在我的上创建命令,但很难找到参数。DataTable.GetChanges返回需要使用INSERT或UPDATE命令的行——我想我无法区分它们。我需要您执行以下操作:DataTabledt=newDataTable();OleDbDataAdapterda=newOleDbDataAdapter();//这里我创建了SELECT命令并传递了连接。da.Fill(dt);//这里我对DataTable进行了更改(插入/更新)(通过DataGridView)。da.UpdateCommand=newOleDbCommand("UPDATETABLE_NAMESET(COL1,COL2,...)VALUES(@newVal1,@newVal2,...)WHEREid=@id");//如何使用当前行(即da正在更新)的值作为参数(@newVal1、@newVal2、id....)?非常感谢!数据适配器可以与数据表一起使用。所以我实际上已经将我的打包成一个类并且它工作正常。除了我的东西的复杂性之外,这里有一个片段可能会对您有所帮助。添加参数时,您可以识别数据来自DataTable的列源。这样,当记录在内部被标识为“添加”或“更新”(或“删除”)时,在构建SQL插入/更新/删除命令时,它将从相应行的列中提取数据。例如。假设我有一个DataTable,主键是“MyID”,列有“ColX、ColY、ColZ”。我创建我的DataAdapter并构建我的选择、更新、删除命令,例如...(?是参数的占位符)DataAdaptermyAdapter=newDataAdapter()myAdapter.SelectCommand=newOleDbCommand();myAdapter.InsertCommand=newOleDbCommand();myAdapter.UpdateCommand=newOleDbCommand();myAdapter.DeleteCommand=newOleDbCommand();myAdapter.SelectCommand.CommandText="从MyTable中选择*,其中MyID=?";myAdapter.InsertCommand.CommandText="插入MyTable(ColX,ColY,ColZ)值(?,?,?)";myAdapter.UpdateCommand.CommandText="更新MyTable设置ColX=?,ColY=?,ColZ=?其中MyID=?";myAdapter.DeleteCommand.CommandText="从MyTable中删除MyID=?";现在,每个人都必须有自己的“参数”。参数的添加顺序必须与其对应的“?”相同。占位符。//虽然我为prepare参数设置了伪值,但它只用于//数据类型。它在应用更改时通过数据适配器进行更改OleDbParameteroParm=newOleDbParameter("myID",-1);oParm.DbType=DbType.Int32;oParm.SourceColumn="myID";//根据其类型...char、int、double等,并对其余参数执行类似操作。同样,我想要一个包装类来处理每个表的管理......简而言之publicmyClassWrapper{protectedDataTablemyTable;受保护的数据适配器myAdapter;...更多...protectedvoidSaveChanges(){}}它比这更复杂,但在“SaveChanges”期间,数据表和dataAdapter出于各自的目的而同步。现在,刷新数据。我检查表的状态,然后您可以将整个表传递给dataAdapter进行更新,它将遍历所有更改的记录并推送适当的更改。不过,您必须捕获任何可能的数据错误。myAdapter.Update(this.MyTable);当它找到每个“已更改”的记录时,它会从列源中提取值,该列源由在传递给适配器进行处理的表中找到的参数标识。希望这可以阐明您遇到的问题。----评论反馈----我会将您的更新放在try/catch中,然后进入程序以查看异常是什么。消息adn/或错误的内部异常可能提供更多信息。但是,尝试将UPDATE简化为仅包含带有WHERE“Key”元素的FEW字段。另外,我错过了答案第一部分的要点。您可能必须识别数据表的“PrimaryKey”列。为此,它需要一个DataTable属性和一个表示表主键的列数组。我所做的是...//设置表的主键列DataColumn[]oCols={myDataTbl.Columns["myID"]};myDataTbl.PrimaryKey=oCols;我会为您的UPDATE注释掉您的完整更新字符串及其所有参数。然后,只需设置2-3列和where子句myAdapter.UpdateCommand.CommandText="updateMyTablesetColX=?,ColY=?whereMyID=?";为“X”添加参数对象为“Y”添加参数对象为“MyID”添加参数对象选择像int或char这样的字段,这样它们在数据类型转换方面出现问题的可能性最小,然后,一旦它起作用,尝试添加所有“int”"和"character"列...然后添加任何其他列。另外,你反对哪个数据库。一些数据库不使用“?”作为命令中的占位符但使用“命名”参数,有些使用“actualColumn=@namedCol”甚至“actualColumn=:namedCol”希望这能让你度过难关......你可以使用String.Format方法来替换@newVal1,@newVal2,...在代码中,例如da.UpdateCommand=newOleDbCommand(String.Format("UPDATETABLE_NAMESET(COL1,COL2,...)VALUES({0},{1},...)WHEREid=@id",OBJECT_ARRAY_CONTAINING_VALUES_FROM_THEDG));[Eidtpercomment]要处理行[0]、行[1],您需要一个循环,例如:for(i=0;ida.UpdateCommand=newOleDbCommand(String.Format("UPDATE...",row[i]);da.Update(dt);}以上就是C#学习教程:UsingOleDbDataAdaptertoupdateDataTableC#分享所有内容,如果对你有用需要了解更多C#学习教程,希望大家点赞更多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: