我在DataSet里更新了 表 "Users",如果要把更新后的内容推回数据库,是不是还要先设置 SqlCommmand 的UpdateCommand 属性,再用SqlCommand.Updata("Users")?如果这样,是不是太不方便了?还不如用DataReader.ExecuteNonQuery 执行SqlCommand.InsertCommand.在DataSet里更新"Users"的时候我用如下方法:internal static int Insert(string name ,string pwd ,DataTable datatable){DataRow  newrow = datatable.NewRow();  datatable.Rows[1].BeginEdit();
   newrow["UserName"] = name;
   newrow["Password"] = pwd;
   newrow["UserID"] = 111;
   datatable.Rows[1].EndEdit();
   Console.WriteLine ("Before Insert\n");
   DisTable(datatable);
   datatable.Rows.Add(newrow);   sqlConn.Open ();
   int num = sqlDa.Update(datatable);
   sqlConn.Close ();
   return num;}

解决方案 »

  1.   

    要自己提供更新逻辑
    或者自已设置UpdateCommand
    要不用CommandBuilder自动生成更新逻辑
      

  2.   

    // 还不如用DataReader.ExecuteNonQuery 执行SqlCommand.InsertCommand
    DataAdapter可以一次更新n条数据
    这也是ADO.NET的主要优点之一
      

  3.   

    非常感谢2位的帮助,还有点不明白的地方:To:chengbo198
            "自己设置 UpdateCommand 会提示 :没有设置 InsertCommand"
            "设置了更新逻辑以后,可以直接用int num = sqlDa.Update(datatable); 吗?不用再设置UpdataCommand?To:Sunmast         一次更新n条记录,不也得设置 UpdateCommand?那还是要"SET UserName= '"+name+"',Password= '"+pwd+"'",那前面我在 DataSet里增加的 newrow 有什么用?
      

  4.   

    当你改变dataset中的数据时,DataAdapter.UpData()会把现在dataset中的数据与数据库中的数据比较,自动检查是insert\update\delete,返回相应的SQL语句,执行相应的操作。也就是说,你不用去考虑你是什么样的数据操作,你要修改哪几个字段,原来的查找语句中必须包含有,并且要有唯一键!
      

  5.   

    UserName= '"+name+"',Password= '"+pwd+"'",这样的语句不用你自己写的
      

  6.   

    // 一次更新n条记录,不也得设置 UpdateCommand?
    是的
    我是说,当你的DataSet有很多的改动后,只需要一次Update,就更新到数据库了
      

  7.   

    谢谢!
    To CSDANTM:
        不对吧!我用 dataAdapter1.Fill(dataSet1,"Users"),在我用前面的方法Update已经加到dataset的表 "Users" 的时候,他会报错说" 未处理的异常   System.InvalidOperationException :当传递具有新行的 DataRow 集合时,更新要求有效的 InsertCommand "  ,这个意思不是说,如果要 Update,必须要有 InsertCommand?
        我是 设置InsertCommand并且 赋给 dataAdapter2,然后用  dataAdapter2.Update("Users"),这样做才可以正常.
        另外:在这个 社区 "给分"必须要结帐,也就是一次全都给完?
      

  8.   

    To CSDANTM:
         "SET UserName= '"+name+"',Password= '"+pwd+"'"  是为了设置 UpdateCommand,如果不写,他会提示我上面说的错误.
      

  9.   

    我想 做一个 清空表的 函数,通过DataAdapter.Update()方法,如下:
    internal static DataTable ClearTable(DataTable datatable)
    {
             datatable.Clear ();
             ShowTable(datatable);// 显示表 datatable 的所有行列内容.
    SqlDataAdapter sqlda = new SqlDataAdapter();
    sqlConn.Open ();// sqlConn 是全局变量.
    int n = sqlda.Update(datatable);
    sqlConn.Close ();
    Console.WriteLine ("Update the table successfully return :\t"+n);
    return datatable;
    }
    结果:Update the table successfully return :    0
    哪里的问题?要设置sqlCmd.CommandTest  ,再sqlda.UpdataCommand = sqlCmd  ?
      

  10.   

    采用那种数据方式,
    是由数据操作频率,数据量,决定的,
    一般一次性解决战斗的,比较推荐DataReader;
    如果整表或多个表的操作.还是用DataSet.其实DataReader也接受多个查询返回集的.SqlCommand.CommandTest="语句一;语句N";
    执行返回到DataReader里  用NextResult来取
    总之无论如何,用DataAdapter来推动数据或者SqlCommand解决,都要根据情况决定,
      

  11.   

    To fansihong:
        谢谢!
        DadaSet 在推回数据库的是不是 必须设置SqlCommand.CommandText 属性?