解决方案 »

  1.   

    先 理清思路。  新行的 DataRow - 执行插入操作;而不是执行update操作,应为新增数据再数据库中 不存在,怎么个更新。
      

  2.   

     大神,能不能说的清楚一点,我是刚看到这个部分的
    我想用这两句更新datatable里的内容
      ds.Tables[0].Rows[num - 1]["lname"] = name;
      ds.Tables[0].Rows[num - 1]["lpassword"] = password;
    然后再更新到数据库里
      

  3.   

    改成
    SqlDataAdapter adapter = new SqlDataAdapter(sql,conn);
    adapter.fill(ds,"table1");
    然后再update,因为之前你个ds赋值,但是这个ds和dataadapter没什么关联,adapter认为这个ds之前是空的,后来新增了行,所以要执行insert语句。
      

  4.   

    像你手动创建dataadapter对象的话,最好顺便创建dataadapter对象的InsertCommand、UpdateCommand、DeleteCommand。
    这样就操作ds就可以,操作完,更具需要调用insert,update,delete就行了。
      

  5.   

    你下面两句是干什么的?你到底是只要更新现有行,还是如果存在就更新,不存在就添加?            ds.Tables[0].Rows[num - 1]["lname"] = name;
                ds.Tables[0].Rows[num - 1]["lpassword"] = password;数据表里有主键,也可以考虑使用SqlCommandBuilder,这样定义好SELECT命令语句,可以通过它的GetUpdateCommand()和GetInsertCommand()方法自动获取更新和插入命令,然后通过类似adapter.UpdateCommand = commandBuilder.GetUpdateCommand();的方法传给adapter。
      

  6.   

    以前回答别人更新DataGrideView时候写的代码,有部分是通过DataSet和Adapter更新的,供参考 public static DataSet getDataSet(string connStr, string sql, string name)
    {
    SqlConnection conn = null;
    DataSet ds = null;
    try
    {
    conn = new SqlConnection(connStr);
    ds = new DataSet();
    conn.Open(); SqlDataAdapter cmd = new SqlDataAdapter(sql, conn);
    cmd.Fill(ds, name);
    }
    catch
    {
    }
    finally
    {
    if (conn != null)
    conn.Close();
    }
    return ds;
    }

    public void UpdateDB()
    {
    try {

    DsCustomer = new DataSet();
    DsCustomer = getDataSet(connstr, "select * from Customer", "Customer");
    //DsCustomer = dbManage.getDataSet("select * from Customer", "Customer");//自定义的一个过程,返回DataSet

    SqlConnection conn = new SqlConnection(connstr);
    conn.Open(); SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Customer", conn);

    SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adapter);

    adapter.UpdateCommand = commandBuilder.GetUpdateCommand();
    adapter.InsertCommand = commandBuilder.GetInsertCommand();

    adapter.Fill(DsCustomer);

    BsCustomer = new BindingSource();
    BsCustomer.DataSource = DsCustomer.Tables["Customer"];
    System.Diagnostics.Debug.Print("DS1 Rows:" + DsCustomer.Tables[0].Rows.Count.ToString());
    dataGridView1.DataSource = BsCustomer;//这里把dataGridView1的DataSource指向BindingSource DataRowView drv = BsCustomer.AddNew() as DataRowView;//如果是添加新记录的话
    drv.BeginEdit();//开始修改
    drv["Name"] = "fish";//该行item属性为“fish”
    drv["type"] = "2";//该行item属性为“fish”
    drv.EndEdit();
    //结束BindigSource编辑
    BsCustomer.EndEdit();
    //获取修改过的记录来只更新有改变的数据
    //DsCustomer.GetChanges();
    //System.Diagnostics.Debug.Print("DS1 Rows:" + DsCustomer.Tables[0].Rows.Count.ToString());
    //System.Diagnostics.Debug.Print("Changed: " + DsCustomer.HasChanges().ToString()); adapter.Update(DsCustomer, "Customer");
    //真正更新到数据库
    //DsCustomer.AcceptChanges();
    } catch (Exception) {

    throw;
    }
    }