小弟在做项目时遇到一个问题,从数据库里查询某个表返回一个DataTable对象,想通过代码直接修改(包括增加,修改,删除)DataTable来直接更新数据库,结算发现无论怎么修改DataTable,只有增加是可以的,即可是删除一行,数据库还是保持不变,请问高手是什么原因或有什么好的解决办法? 更新方法用的是SqlDataAdapter.Update(dt)

解决方案 »

  1.   

    没有用过直接修改的,添加、删除、update都是用的sql语句
      

  2.   

    首先,你的表必须要有主键,才能删除和更改,其次,你是否用过SqlCommandBuilder 来创建删除修改的sql语句,就像下面的代码一样,        SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = new SqlCommand(queryString, connection);
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);        connection.Open();        DataSet dataSet = new DataSet();
            adapter.Fill(dataSet, tableName);        //code to modify data in DataSet here        builder.GetUpdateCommand();
      

  3.   

    我也用过,但用户修改了哪些东西你不知道呀,我每次都要重新取得哪些是更新的数据,哪些是新增的,哪些是删除的。那样操作的难度有点大
     顺便贴下测试原码
      
    //数据加载
       SqlConnection conn = new SqlConnection("server=127.0.0.1;database=Test_DB;uid=sa;pwd=123456");
                SqlCommand scd = new SqlCommand("select name,age,serid,nFieldType,sFieldType from tUser", conn);
                sda.SelectCommand = scd;
                sda.Fill(dt);
                conn.Close();//手工操作dataTable
            //手工加一行,并自动更新到数据库
            private void button2_Click(object sender, EventArgs e)
            {
                //dt.Rows.Clear();
                DataRow dr = dt.NewRow();
                dr["name"] = "哈哈!";
                dr["age"] = 24;
                dr["nFieldType"] = 3;
                dr["sFieldType"] = "varchar";            dt.Rows.Add(dr);            dt.Rows.RemoveAt(1);
                dt.AcceptChanges();
                
                 try
                {
                    SqlCommandBuilder scb = new SqlCommandBuilder(sda);
                    dt.Rows.Clear();
                    sda.Update(dt);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }            MessageBox.Show("更新成功!");       
     }
      
     主键ID是自增长的。如果我更新了一数据,或删除一条数据,都不会对数据库有任务操作
      

  4.   


    dt = new DataTable();
                SqlConnection conn = new SqlConnection(connstr);
                conn.Open();
                adpter = new SqlDataAdapter(sql, conn);
                SqlCommandBuilder cmdbuilder = new SqlCommandBuilder(adpter);
                adpter.UpdateCommand = cmdbuilder.GetUpdateCommand();
                adpter.AcceptChangesDuringUpdate = true;
                adpter.Fill(dt);
                dt.Select("case when SSex=0 then '男' else '女' end");
                GridViewColumn cs = new GridViewColumn();
                cs.DisplayMemberBinding = new Binding();
      

  5.   

    修改一下,上面有错            dt = new DataTable();
                SqlConnection conn = new SqlConnection(connstr);
                conn.Open();
                adpter = new SqlDataAdapter(sql, conn);
                SqlCommandBuilder cmdbuilder = new SqlCommandBuilder(adpter);
                adpter.UpdateCommand = cmdbuilder.GetUpdateCommand();
                adpter.AcceptChangesDuringUpdate = true;
                adpter.Fill(dt);
               
      

  6.   

    呵呵,你不能自己AcceptChanges,你AcceptChanges之后dt里面就没有删除标志了,就没法帮你删除记录了,把这句去掉:
               dt.AcceptChanges();
      

  7.   

    sda.Update(dt)会帮你调用dt.AcceptChanges(),你不需要自己调用,
      

  8.   

    其次,一般不要这样删除行:dt.Rows.RemoveAt(1)最好改为:dt.Rows[1].Delete(),这样删除,只是在DataTable中标记行被删除,这样Adapter还可以取得行的主键去数据库里删除记录,