我用odbcDataAdapter1.Update(dataSet1,"table1");
不行啊,老是出错
出错信息为“当传递具有已修改行的DataRow集合时,更新要求有效的UpdataCommand"请各位帮帮忘!!!!

解决方案 »

  1.   

    使用odbcDataAdapter1的update方法,要明白它到底是如何实现的
    其实它只不过是根据select 语句和字段信息生产 update、insert、delete语句的模版;
    然后根据datatable中记录的行状态,用这3个模版去执行SQL操作因此你仅仅定义一个odbcDataAdapter1,没有select语句,那么不行的,没有OleDbCommandBuilder也是不行的,例子:
     System.Data.OleDb.OleDbConnection cn;
                System.Data.OleDb.OleDbCommand cm = new System.Data.OleDb.OleDbCommand();
                cm.Connection = cn;
                System.Data.OleDb.OleDbDataAdapter  da = new System.Data.OleDb.OleDbDataAdapter(cm);
                cm.CommandText = "select * from table1 where id = 1";            System.Data.OleDb.OleDbCommandBuilder cb = new System.Data.OleDb.OleDbCommandBuilder(da);
    然后才能使用da.Update()
      

  2.   

    利用odbcDataAdapter1.Update(dataSet1,"table1");更新数据库时,要求数据无重复.否则会出现上述错误
      

  3.   

    我怎么样才能获得用户修改的数据呢??因为用户可能对DataGrid中每个单元格都要做修改,这样的话写SQL语句就没有where (条件)了啊??
      

  4.   

    二楼正解。考虑自己写更新数据库的SQL语句,简单高效!
      

  5.   

    DataSet很强的,你去看看他的GetChanges方法,所有的改动她都记着呢?
      

  6.   

    循环,判断DataSet中表的行的状态,然后写SQL语句!
      

  7.   


    115 0000E74F2300 曾发国4号 A栋一楼金居堆货点假设有一行有上面三个单元格,用户可能更改每一个单元格,怎么样把用户的更改更新到数据库中?假设把115改为114,0000E74F2300改为1111E74F2300    请写部分源代码!!
    谢谢了!!
      

  8.   

    用事务处理,我在项目中这么用
    SqlCommandBuilder cBuilder=new SqlCommandBuilder(SY_departAdapter);
    SY_departAdapter.InsertCommand = cBuilder.GetInsertCommand();
    SY_departAdapter.DeleteCommand = cBuilder.GetDeleteCommand();
    SY_departAdapter.UpdateCommand = cBuilder.GetUpdateCommand();
    SqlTransaction transaction1;
    SY_Conn.Open();
    transaction1 = SY_Conn.BeginTransaction();
    SY_departAdapter.InsertCommand.Transaction = transaction1;
    SY_departAdapter.DeleteCommand.Transaction = transaction1;
    SY_departAdapter.UpdateCommand.Transaction = transaction1;
      

  9.   

    这个问题之前我们也涉及到这样的问题:在UI层对DataSet做任意操作后,实现批量更新
    实现的方法(Eddie005(♂) 暴赱 『零零伍』(︶︵︶) 同)如下:
    1 如果用设计器将SqlDataAdapter拖放到界面上使用时,一般不会出现这样的情况
      Update(dataSet1,"table1")出错,因为设计器此时已经自动帮你生成SqlDataAdapter相关的
      命令属性:selectCommand,insertcommand,updatecommand,deleteCommand,但是如果你没有使用
      设计器生成SqlDataAdapter,此时以上的相关命令属性就没有生成,没有被确定,因此如果在更新
      过程中,就会出现出错了,因为不知道所做操作的命令对象.
    2 解决办法:就是设法产生它的上述命令,使用SqlCommandBuiler类,用他产生上述的命令有两种方
      法,方法一:
      SqlConnection con = new SqlConnection(conStr);
      SqlCommand cmd = new SqlCommand("select * from ....",con);
      SqlDataAdapter da = new SqlDataAdapter();
      da.SelectCommand = cmd;
      SqlCommandBuilder cbuild = new SqlCommandBuilder(da);
      da.Update(ds,TableName);
      方法二:
      SqlConnection con = new SqlConnection(conStr);
      SqlCommand cmd = new SqlCommand("select * from ....",con);
      SqlDataAdapter da = new SqlDataAdapter(cmd);
      SqlCommandBuilder cbuild = new SqlCommandBuilder(da);
      da.InsertCommand = cbuild.GetInsertCommand();
      da.UpdateCommand = cbuild.GetUpdateCommand();
      da.DeleteCommand = cbuild.GetDeleteCommand();
      da.Update(ds,TableName);
    3 说明如下:
      SqlDataAdapter 不会自动生成实现 DataSet 的更改与关联的 SQL Server 实例之间的协调所 
      需的 Transact-SQL 语句。但是,如果设置了 SqlDataAdapter 的 SelectCommand 属性,则可
      以创建一个 SqlCommandBuilder 对象来自动生成用于单表更新的 Transact-SQL 语句。然后,
      SqlCommandBuilder 将生成其他任何未设置的 Transact-SQL 语句。                                                  桂林电子工业学院计算机系
                                                         信息管理与信息系统
                                                           2006.3.29
      
      

  10.   

    我就是用设计器将SqlDataAdapter拖放到界面上使用的啊!
    真是郁闷
      

  11.   

    这里有比较详细的实现,
    http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx