我碰到以下问题,......................................用sqlcommandBuilder 无法更新数据库.其实datagridview中已经更新了值.
虽然我用sqlcommand 命令也更新好达到同样效果.但是我想追究的是sqlcommadnbuilder 为什么会没有起作用.
看以下代码.............................
         using (SqlConnection mycon = new SqlConnection(appCon))
                {
                    mycon.Open();
                    string cmd = "SELECT  * from [Salary]";
                    SqlDataAdapter sda = new SqlDataAdapter(cmd, mycon);                    SqlCommandBuilder thisBulider = new SqlCommandBuilder(sda);
                    thisDataSet = new DataSet();
                    sda.MissingSchemaAction = MissingSchemaAction.AddWithKey;//显式加载数据库主键
                    sda.Fill(thisDataSet, "salary");
                   
                                       
                    ////------------------Merge---------
                    thisDataSet.Tables["salary"].Merge(excelDataSet.Tables[sheetName], false, MissingSchemaAction.Ignore);
                    //
                    dataGridView1.DataMember = null;
                    dataGridView1.DataSource = null;
                    dataGridView1.DataSource = thisDataSet;
                    dataGridView1.DataMember = "salary";
                    ///--------------------------------------------
                    ///sqlcommand
                       sda.Update(thisDataSet, "salary");//这个步骤没有起作用................                  ------------------------------------------------------
另外说一下,我用 setModified() 也没有用..........................................................................
那位找得到原因吗?.....................................
如何解决这种情况......................................

解决方案 »

  1.   

    看不太明白。
    是用select语句执行update的原因?
      

  2.   

    SqlCommandBuilder只针对单张表,该表必须有主键
      

  3.   

    http://blog.csdn.net/zcheva/archive/2010/04/13/5481367.aspx
      

  4.   

    http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommandbuilder(VS.80).aspx
      

  5.   

    msdn上的解释
      

  6.   

    SqlCommandBuilder会根据查询语句自动生成Update,Delete,Insert命令,调用SqlDataAdapter.Update时会根据DataSet中DataTable的DataRow的行状态来执行对应的操作更新数据库 
    使用SqlCommandBuilder更新数据库失败,查看数据表是否有主键,看DataRow的行状态 
    DataSet ds = new DataSet();
            SqlDataAdapter sda;
            private void button1_Click(object sender, EventArgs e)
            {
                ds.Tables.Clear();
                sda = new SqlDataAdapter("", conn);
                sda.Fill(ds);
                this.dataGridView1.DataSource = ds.Tables[0];
            }        private void button2_Click(object sender, EventArgs e)
            {
                SqlCommandBuilder scb = new SqlCommandBuilder(sda);
                sda.Update(ds);
                this.dataGridView1.DataSource = ds.Tables[0];
            }
      

  7.   

    不理解你的方法, 你这样就算不使用 sqlcommandBuilder  也不会起作用,不信试试
      

  8.   

    string emailSql="select email,validFlag from emailMe";
    DataSet emailAdd=new DataSet();
    SqlDataAdapter emailAdapter=new SqlDataAdapter(emailSql,myConn);
    SqlCommandBuilder cb=new SqlCommandBuilder(emailAdapter);
    SqlCommand upCmd=new SqlCommand("update ["+strTableName+"] set validFlag=@validFlag where email=@email",myConn);
    upCmd.Parameters.Add("@validFlag",SqlDbType.Int,8,"validFlag");
    upCmd.Parameters.Add("@email",SqlDbType.NVarChar,100,"email");
    emailAdapter.UpdateCommand=upCmd;
    emailAdapter.Fill(emailAdd,"address");
    myConn.Close();
    ......//修改myDs数据
    emailAdapter.Update(emailAdd,"address");总结一下,对这样的问题,解决方法两种:1.    修改表的定义,定义一个主键;
    2.    为SqlDataAdapter指定UpdateCommand(DeleteCommand,InsertCommand应该也一样);
      

  9.   

    因为你是合并的表,所以合并的数据DataRow的RowState状态为未更改[DataRowState.Unchanged],
    thisDataSet.Tables["salary"].Merge(excelDataSet.Tables[sheetName], false, MissingSchemaAction.Ignore);
    这句话,你只要把excelDataSet.Tables[sheetName]取出来的datatable的每行数据的RowStae状态改为新添加[DataRowState.Added],这样你就看到效果了
      

  10.   

    sqlcommandBuilder 在自动更新的时候是根据每行数据的RowState生成的。
      

  11.   

    不用主键也可以更新吧?只是产生的sql语句很长(where子句后面一大堆),且如果碰到日期或者bin类型字段很容易出问题。
      

  12.   

    没有必要的话不要调用合并方法,没有意思。有时间看下这里http://www.cnblogs.com/PLAYBOY840616/archive/2006/12/13/590996.html。
    差不多的。
    还有就是好像你什么也没有做。
      

  13.   

    DataSet ds = new DataSet();
      SqlDataAdapter sda;
      private void button1_Click(object sender, EventArgs e)
      {
      ds.Tables["表名"].Clear();
      sda = new SqlDataAdapter("SQL语句", conn);
      sda.Fill(ds);
      this.dataGridView1.DataSource = ds.Tables["表名"];
      }  private void button2_Click(object sender, EventArgs e)
      {
      SqlCommandBuilder scb = new SqlCommandBuilder(sda);
      sda.Update(ds,"表名");
      }
      

  14.   

         这个问题我也遇到过。
         我出现问题是因为用来显示dataGridView的dataSet的table名和用来更改的table名不一样,导致填充时是一个新表,于是根本就没有修改。
         你看一下外面用来显示dataGridView的数据源是不是thisDataSet.table["salary"],如果不是就改成一样的。
    如果跟我是一样的问题,那就给点分给我吧。
      

  15.   

    我是楼上,贴一下我的代码吧:
    public Form1()
            {
                InitializeComponent();
                conn = new SqlConnection("Data Source=.;Initial Catalog=BookManager;Integrated Security=SSPI");
                Methodload();
            }        private void Methodload()
            {
                da = new SqlDataAdapter("select  * from BookInfo", conn);
                ds = new DataSet();
                da.Fill(ds, "BookIn");
                this.dataGridView1.DataSource = ds.Tables["BookIn"];
            }
            SqlConnection conn = null;
            SqlDataAdapter da = null;
            DataSet ds = null;
            private void button1_Click(object sender, EventArgs e)
            {            if (MessageBox.Show("确定修改吗?", "修改", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    da = new SqlDataAdapter("select * from BookInfo", conn);
                    SqlCommandBuilder sb = new SqlCommandBuilder(da);
                    da.Fill(ds, "BookIn");
                    //判断是否修改成功
                    int num = da.Update(ds.Tables["BookIn"]);
                    if (num > 0)
                    {
                        MessageBox.Show("修改成功");
                    }
                    else
                    {
                        MessageBox.Show("修改失败");
                    }
                    Methodload();            }
                
                        }        private void button2_Click(object sender, EventArgs e)
            {
                Methodload();
            }
      

  16.   


    楼主可以试试看foreach循环看看thisDataSet.Tables["salary"] 中的每条记录的rowState,是否是Added,或者Updated?
      

  17.   

    上面有误,应该是:
    Added
     已将该行添加到表中,但尚未调用 AcceptChanges。
     
    Modified
     已更改了行的某个元素。
     
      

  18.   

    以上总结一下:以便大家不要和我一样的错误.
    主键我已经设置了,所以不存在主键的问题. 
    另外Modified 这种也是不行的.我用setModified 而且我用foreach后行状态的确是已修改的.可是也没有用.
    ------------------------------------------------
    以上情况sqlcommandbuilder命令没有作用.只有手动指定update命令才是正道.
    2. 为SqlDataAdapter指定UpdateCommand(DeleteCommand,InsertCommand应该也一样);
    这点和13楼说的是一样的.
      

  19.   

    还是给你上代码,只是证明我说的是对的    class Program
        {
            static void Main(string[] args)
            {
                /* sql脚本
                    create database test
                    go
                    use test
                    go
                    create table tab1
                    (
                    id int identity primary key,
                    a varchar(10)
                    )
                    create table tab2
                    (
                    id int identity primary key,
                    a varchar(10)
                    )
                    insert into tab1 values('1')
                    insert into tab2 values('2')                select * from tab1
                 */
                DataSet ds = new DataSet();
                SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True");
                SqlDataAdapter da1 = new SqlDataAdapter("select * from tab1", con);
                da1.Fill(ds, "Tab1");
                SqlDataAdapter da2 = new SqlDataAdapter("select * from tab2", con);
                da2.Fill(ds, "Tab2");
                foreach (DataRow row in ds.Tables["Tab2"].Rows)
                    row.SetAdded();
                ds.Tables["Tab1"].Merge(ds.Tables["Tab2"]);
                SqlCommandBuilder cb = new SqlCommandBuilder(da1);
                da1.Update(ds.Tables["Tab1"]);
            }
        }