异常:当传递具有已修改行的DataRow集合时,更新要求有效的UpdateCommand DataRow dr=dt.Rows [cbx1.SelectedIndex ].NewRow; 试试 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DataRow dr = ds.Tables["SetQx"].NewRow(); NewRow()不是新增一行么?我只是要更新第一行的'Qx'这个字段的值 dpt.SelectCommand = command;command 为你的选择语句命令。 to: wjhs(杰借) 我在OleDbDataAdapter dpt=new OleDbDataAdapter( "Select * from qx_gc ",conn);中已经设置了select语句啊.按照你说的加上:dpt.SelectCommand =new OleDbCommand ("Select * from tab_qx_gc",conn);还是不行! 在 OleDbDataAdapter dpt=new OleDbDataAdapter( "Select * from qx_gc ",conn); 后加 OleDbCommand DbComm = new System.Data.OleDb.OleDbCommand(); dpt.UpdateCommand = DbComm; DbComm.CommandText = "UPDATE Sond SET 字段名1 = ?, 字段名2 = ? WHERE (ID = ?)"; DbComm.Connection = conn; DbComm.Parameters.Add(new System.Data.OleDb.OleDbParameter("字段名1", System.Data.OleDb.OleDbType.VarWChar, 50, "FileName")); DbComm.Parameters.Add(new System.Data.OleDb.OleDbParameter("字段名2", System.Data.OleDb.OleDbType.VarWChar, 50, "FilePath")); DbComm.Parameters.Add(new System.Data.OleDb.OleDbParameter("ID", System.Data.OleDb.OleDbType.Integer,0,"ID"));试试 你没有关联UpdateCommand,Update语句没办法正确执行。updateCommand = new System.Data.OleDb.OleDbCommand();updateCommand.Connection = conn;updateCommand.CommandText = @"UPDATE qx_gc SET f1 = ?, f2 = ? , f3 = ? where f1 = ? ";updateCommand.Parameters.Add(new OleDbParameter("f1", OleDbType.Integer,4,"f1"));updateCommand.Parameters.Add(new OleDbParameter("f2", OleDbType.Char,12,"f2"));updateCommand.Parameters.Add(new OleDbParameter("f3", OleDbType.VarChar,4,"f3"));updateCommand.Parameters.Add(new OleDbParameter("Original_f1", OleDbType.Integer,4,"f1"));dpt.UpdateCommand = updateCommand; dr.AcceptChanges();改为dt.AcceptChanges();试试看。最好这样写:try{ if(this.ds.HasChanges()) { dpt.Update(ds,"SetQx"); } dt.AcceptChanges();}catch ( Exception Error ){ dt.RejectChanges();} 你把AcceptChanges()的注释拿掉不出错的原因是:执行AcceptChanges()后,DataSet的修改都被标识为已经修改完也,没有了修改未提交的部分,OleDataAdapter不会执行Update操作。 System.Data.OleDb.OleDbCommandBuilder cmicCB=new System.Data.OleDb.OleDbCommand(dpt);//加上这一句dpt.Update (ds,"SetQx"); dataSet执行upate的时候是根据你提供给他的UpdateCommand去执行的。如果你都没有提供给他语句的话,他怎么知道怎么更新你的数据库。所以一定要有相应的UpdateCommand,dpt.Update (ds,"SetQx");才可以正确执行。如果你不想自己写的话,OleDbCommandBuilder来为你生成一个UpdateCommand阿。当使用 Update 时,执行的顺序如下: 1。将 DataRow 中的值移至参数值。 2。引发 OnRowUpdating 事件。 3。执行命令。 <<<<<<<注意这句4。如果该命令设置为 FirstReturnedRecord,返回的第一项结果将放置在 DataRow 中。 5。如果存在输出参数,它们将被放在 DataRow 中。 6。引发 OnRowUpdated 事件。 7。调用 AcceptChanges。 下面是MSDN的原话:DataAdapter 的 Update 方法可调用来将 DataSet 中的更改解析回数据源。与 Fill 方法类似,Update 方法将 DataSet 的实例和可选的 DataTable 对象或 DataTable 名称用作参数。DataSet 实例是包含已作出的更改的 DataSet,而 DataTable 标识从其中检索更改的表。当调用 Update 方法时,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使用 InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。在调用 Update 之前,必须 显式 设置这些命令。如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。 就是就是,你没设置updatecommand, 肯定会报错了 谢谢tangyanjun1(唐延军).如果使用updatecommand,代码如下:OleDbDataAdapter daQx=new OleDbDataAdapter("Select * from tab_qx_gc",conn);string strUpdt = " UPDATE TAB_QX_GC SET QX = '" + strNewQx + "' WHERE NAME = '" +cbx1.Text .ToString ()+"'" ; OleDbCommand cmdQx = new OleDbCommand ( strUpdt ,conn ) ; daQx.UpdateCommand =cmdQx;cmdQx.ExecuteNonQuery ( ) ;这样用不着DataSet,我是在网上看见某篇文章说的使用DataSet更新数据的:OleDbDataAdapter daQx=new OleDbDataAdapter("Select * from tab_qx_gc",conn);DataSet dsQx=new DataSet ();daQx.Fill (dsQx,"SetQx");DataTable dt=dsQx.Tables["SetQx"];DataRow dr=dt.Rows [cbx1.SelectedIndex ];dr["Qx"]=strNewQx;daQx.update(ds,"SetQx")使用Datarow对象,看来比较简单,易理解.可是就是不行! WebBrowser 遇到 javascript:void(0) 页面无响应 创建了线程,导致程序停不下来了。窗体关闭了,但任务管理器看进程还在!! WebBrowser中的htmlDocument 创建样式表 异常统一处理事件,在线等! 如何快速成为ASP.net开发员 为什么调试的程序的结果是正确的,但直接运行的结果怎么不对了,代码没有改变,望高手解答 请教一个类的基本问题 问个C#中数据库的问题!! C# 读取xml到dataset asp.net mvc不能下载文件 应聘做什么东西比较好? 怎么声明变量
我只是要更新第一行的'Qx'这个字段的值
command 为你的选择语句命令。
我在OleDbDataAdapter dpt=new OleDbDataAdapter( "Select * from qx_gc ",conn);
中已经设置了select语句啊.
按照你说的加上:
dpt.SelectCommand =new OleDbCommand ("Select * from tab_qx_gc",conn);
还是不行!
OleDbCommand DbComm = new System.Data.OleDb.OleDbCommand();
dpt.UpdateCommand = DbComm;
DbComm.CommandText = "UPDATE Sond SET 字段名1 = ?, 字段名2 = ? WHERE (ID = ?)";
DbComm.Connection = conn;
DbComm.Parameters.Add(new System.Data.OleDb.OleDbParameter("字段名1", System.Data.OleDb.OleDbType.VarWChar, 50, "FileName"));
DbComm.Parameters.Add(new System.Data.OleDb.OleDbParameter("字段名2", System.Data.OleDb.OleDbType.VarWChar, 50, "FilePath"));
DbComm.Parameters.Add(new System.Data.OleDb.OleDbParameter("ID", System.Data.OleDb.OleDbType.Integer,0,"ID"));试试
updateCommand = new System.Data.OleDb.OleDbCommand();
updateCommand.Connection = conn;
updateCommand.CommandText = @"UPDATE qx_gc SET f1 = ?, f2 = ? , f3 = ? where f1 = ? ";
updateCommand.Parameters.Add(new OleDbParameter("f1", OleDbType.Integer,4,"f1"));
updateCommand.Parameters.Add(new OleDbParameter("f2", OleDbType.Char,12,"f2"));
updateCommand.Parameters.Add(new OleDbParameter("f3", OleDbType.VarChar,4,"f3"));
updateCommand.Parameters.Add(new OleDbParameter("Original_f1", OleDbType.Integer,4,"f1"));dpt.UpdateCommand = updateCommand;
try
{
if(this.ds.HasChanges())
{
dpt.Update(ds,"SetQx");
}
dt.AcceptChanges();
}
catch ( Exception Error )
{
dt.RejectChanges();
}
dpt.Update (ds,"SetQx");
所以一定要有相应的UpdateCommand,dpt.Update (ds,"SetQx");才可以正确执行。
如果你不想自己写的话,OleDbCommandBuilder来为你生成一个UpdateCommand阿。当使用 Update 时,执行的顺序如下: 1。将 DataRow 中的值移至参数值。
2。引发 OnRowUpdating 事件。
3。执行命令。 <<<<<<<注意这句
4。如果该命令设置为 FirstReturnedRecord,返回的第一项结果将放置在 DataRow 中。
5。如果存在输出参数,它们将被放在 DataRow 中。
6。引发 OnRowUpdated 事件。
7。调用 AcceptChanges。 下面是MSDN的原话:
DataAdapter 的 Update 方法可调用来将 DataSet 中的更改解析回数据源。与 Fill 方法类似,Update 方法将 DataSet 的实例和可选的 DataTable 对象或 DataTable 名称用作参数。DataSet 实例是包含已作出的更改的 DataSet,而 DataTable 标识从其中检索更改的表。当调用 Update 方法时,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使用 InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。在调用 Update 之前,必须 显式 设置这些命令。如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。
如果使用updatecommand,代码如下:
OleDbDataAdapter daQx=new OleDbDataAdapter("Select * from tab_qx_gc",conn);
string strUpdt = " UPDATE TAB_QX_GC SET QX = '" + strNewQx + "' WHERE NAME = '" +cbx1.Text .ToString ()+"'" ;
OleDbCommand cmdQx = new OleDbCommand ( strUpdt ,conn ) ;
daQx.UpdateCommand =cmdQx;
cmdQx.ExecuteNonQuery ( ) ;
这样用不着DataSet,我是在网上看见某篇文章说的使用DataSet更新数据的:
OleDbDataAdapter daQx=new OleDbDataAdapter("Select * from tab_qx_gc",conn);
DataSet dsQx=new DataSet ();
daQx.Fill (dsQx,"SetQx");
DataTable dt=dsQx.Tables["SetQx"];
DataRow dr=dt.Rows [cbx1.SelectedIndex ];
dr["Qx"]=strNewQx;
daQx.update(ds,"SetQx")
使用Datarow对象,看来比较简单,易理解.可是就是不行!