各位 大虾请看,我用DataGridView动态的显示了两个数据集中的信息, 但是当我在对 数据进行修改, 并使用SqlCommandBuilder,使用SqlDataAdapter的Update()对数据进行修改时,  第一张表成功了, 而与之代码一样的另一张表上的信息修改却失败了。
代码1(对表student的修改--成功)
 SqlDataAdapter s = studentManager.GetSdap();
                    SqlCommandBuilder builder = new SqlCommandBuilder(s);
                    s.SelectCommand.Connection = new SqlConnection("Data Source=.\\sqlexpress;Initial Catalog=Tab;Integrated Security=True");
                    s.Update(ds, "studentTable");
                    s.SelectCommand.Connection.Close();
                    s.SelectCommand.Connection.Dispose();
                    s.Dispose();
代码2 (对表的修改--报出如标题所示的异常!)
  SqlDataAdapter s = Manager.GetSdap();
                    SqlCommandBuilder builder = new SqlCommandBuilder(s);
                    s.SelectCommand.Connection = new SqlConnection("Data Source=.\\sqlexpress;Initial Catalog=Tab;Integrated Security=True");
                  
                    s.Update(ds, "Table");
                    s.SelectCommand.Connection.Close();
                    s.SelectCommand.Connection.Dispose();附:
两张表大致结构一样;
两张表数据集绑定在DataGridView的方式一样。谢谢 各位大虾。 小弟初来乍到,基本无分相送,不过,一颗求知之心罢了, 谢谢各位!

解决方案 »

  1.   

    代码2应该是绑定DataGridView有问题
      

  2.   

       ds = Manager.GetAllMarks();
                    this.dgvMessage.DataSource = ds.Tables["Table"];
                    dgvMessage.Columns["ID"].HeaderText = "编号";
                    dgvMessage.Columns["ID"].Visible = false;
                    dgvMessage.Columns["uNo"].HeaderText = "学号";
                    dgvMessage.Columns["uName"].HeaderText = "姓名";
                    dgvMessage.Columns["uGender"].HeaderText = "性别";
                    dgvMessage.Columns["courseA"].HeaderText = "学科A";
                    dgvMessage.Columns["courseB"].HeaderText = "学科B";
                    dgvMessage.Columns["total"].HeaderText = "总分";
                    dgvMessage.Columns["term"].HeaderText = "学期";
                    dgvMessage.Columns["uGender"].HeaderText = "性别";
    这是我代码2的绑定,
    ID为主键。
    您们给看看?
      

  3.   

    DataSet ds = new DataSet();
    SqlDataAdapter sda;SqlCommandBuilder scb = new SqlCommandBuilder(sda);
    sda.Update(ds);
    this.dataGridView1.DataSource = ds.Tables[0];
       
      

  4.   

    DataSet ds = new DataSet();
    SqlDataAdapter sda = new Sqldataadapter(strsql,conn);
    SqlCommandBuilder scb = new SqlCommandBuilder(sda);
    sda.Update(ds);
    this.dataGridView1.DataSource = ds.Tables[0];
      

  5.   

    4楼的大侠, 您的第二行 构造函数的第一个 参数,是 T-SQL语句吧? 呵呵, 我确实不知道怎么写, 因为,我是在 DATAGRIDVIEW里进行编辑的,     不知道, 切入点在哪儿, 谢谢
      

  6.   

    还有,不要依赖于CommandBuilder,自己手写sql比较直观!
      

  7.   

      private void btnGo_Click(object sender, EventArgs e)
            {
                //dgvMessage.Columns.Clear();
                if (cbxItems.Text.Trim() == "")
                {
                    MessageBox.Show("请选择查询明细!");
                }
                else if (cbxItems.Text.Trim() == "学员基本信息")
                {
                    ds = studentManager.GetAllStudents();
                    this.dgvMessage.DataSource = ds.Tables["studentTable"];
                    dgvMessage.Columns["uNo"].HeaderText="学号";
                    dgvMessage.Columns["uName"].HeaderText = "姓名";
                    dgvMessage.Columns["uGender"].HeaderText = "性别";
                    dgvMessage.Columns["uBirth"].HeaderText = "生日";
                    dgvMessage.ReadOnly = false;
                    cbxSex.Enabled = true;
                    cbxOther.Enabled = false;
                }
                else if (cbxItems.Text.Trim() == "学员成绩信息")
                {
                    ds = Manager.GetAllMarks();
                    this.dgvMessage.DataSource = ds.Tables["Table"];
                    dgvMessage.Columns["ID"].HeaderText = "编号";
                    dgvMessage.Columns["ID"].Visible = false;
                    dgvMessage.Columns["uNo"].HeaderText = "学号";
                    dgvMessage.Columns["uName"].HeaderText = "姓名";
                    dgvMessage.Columns["uGender"].HeaderText = "性别";
                    dgvMessage.Columns["courseA"].HeaderText = "学科A";
                    dgvMessage.Columns["courseB"].HeaderText = "学科B";
                    dgvMessage.Columns["total"].HeaderText = "总分";
                    dgvMessage.Columns["term"].HeaderText = "学期";
                    dgvMessage.Columns["uGender"].HeaderText = "性别";
                    dgvMessage.ReadOnly = false;
                    cbxSex.Enabled = true;
                    cbxSex.Text = "";
                    cbxOther.Enabled = true;
                }
            }        private void cbxSex_SelectedIndexChanged(object sender, EventArgs e)
            {
                if (cbxItems.Text.Trim() == "学员基本信息")
                {
                    this.dgvMessage.DataSource = studentManager.GetStudentsBySex(this.cbxSex.Text.Trim()).Tables["studentTable"];
                }
                else
                {
                    this.dgvMessage.DataSource = Manager.GetMarksBySex(this.cbxSex.Text.Trim(), cbxOther.Text.Trim());
                    this.dgvMessage.ReadOnly = true;
                }        }
            #region Error Region
            private void btnSave_Click(object sender, EventArgs e)
            {
                DialogResult result = MessageBox.Show("确实要将修改保存到数据库吗?", "操作提示!", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                if (result == DialogResult.OK)
                {
                    if (cbxItems.Text.Trim() == "学员基本信息")
                    {
                        SqlDataAdapter s = studentManager.GetSdap();
                        SqlCommandBuilder builder = new SqlCommandBuilder(s);
                        s.SelectCommand.Connection = new SqlConnection("Data Source=.\\sqlexpress;Initial Catalog=Tab;Integrated Security=True");
                        s.Update(ds, "studentTable");
                        s.SelectCommand.Connection.Close();
                        s.SelectCommand.Connection.Dispose();
                        s.Dispose();
                    }
                    if (cbxItems.Text.Trim() == "学员成绩信息")
                    {
                        SqlDataAdapter s = Manager.GetSdap();
                        SqlCommandBuilder builder = new SqlCommandBuilder(s);
                        s.SelectCommand.Connection = new SqlConnection("Data Source=.\\sqlexpress;Initial Catalog=Tab;Integrated Security=True");
                        ds.Tables.Clear();
                        //ds.Tables.Add((DataTable)this.dgvMessage.DataSource);
                        //s.SelectCommand.Connection.Open();
                        s.Update(ds, "Table");------报错行,报错原因如标题                    s.SelectCommand.Connection.Close();
                        s.SelectCommand.Connection.Dispose();
                    }
                }
            }
            #endregion
    第一段  学员基本信息能够通过  DATAGRIDVIEW 成功修改, 第二段,就不行啦。
    呵呵, 谢谢啦
      

  8.   

    主键是在数据库表中设置的吗?
    另外,sqldataadapter最好用他们说的方法建立,别用返回
    我没有看见你的select语句啊,比如:selcet *from 表
    你的dataset 也没定义
    第一个成功是不是巧合啊
      

  9.   

    呵呵, 主键是在数据库中设置,如代码段之中"ID"列,
    我的第一个 和第二个,DATASET。 获取方式如下。  
    //第一个DATASET构建
      public DataSet GetAllStudents()
            {
                string strSql="select * from tabUser";
                objAdapter.SelectCommand.Connection = DBTool.GetConn();
                objAdapter.SelectCommand.CommandType = CommandType.Text;
                objAdapter.SelectCommand.CommandText = strSql;
                ds.Clear();
                objAdapter.Fill(ds, "studentTable");
                objAdapter.SelectCommand.Connection.Close();
                objAdapter.SelectCommand.Connection.Dispose();
                return ds;
            }
    //第二个DATASET构建
      public DataSet GetAllMarks()
            {
                string strSql = "select * from tabMark";
                objAdapter.SelectCommand.Connection = DBTool.GetConn();
                objAdapter.SelectCommand.CommandType = CommandType.Text;
                objAdapter.SelectCommand.CommandText = strSql;
                ds.Clear();
                objAdapter.Fill(ds, "Table");
                objAdapter.SelectCommand.Connection.Close();
                objAdapter.SelectCommand.Connection.Dispose();
                return ds;
            }拜托各位啦, 呵呵
      

  10.   

    当我将DATASET绑定到,DATAGRIDVIEW
    再构建 SQLDATAADAPTER实例时,
    SqlDataAdapter sda=new SqlDataAdapter(strSql,conn);
    中第一个 参数即T-SQL语句 无从下手, 真是纳闷了, 为什么第一张表能修改。
      

  11.   

    cmd 的commontext有没有给赋值啊!
      

  12.   

    ...哎, 就是不知道 咋 赋值。     我想通过DATAGRIDVIEW对整张表进行 更新。  嘿嘿,  确实不知道怎么写。
      

  13.   

    多谢 各位 大虾, 多谢各位大虾的帮助, 通过使用DATAADPATER的UPDATE()方法时。 其COMMANDTEXT属性,与 使用DATAADAPTER的FILL方法时的COMMANDTEXT一致, 正是如此, DATAADAPTER通过比较 使用UPDATE时,DATATABLE中的变化便是依据。  谢谢各位大虾,我明白了,  另外,SQLDATAADAPTER实例 最好在每次使用时 进行实例化。
    由于 ,我语言表达不清楚, 让各位麻烦了, 不好意思哦, 另外 麻烦各位能不能教教在下, 如何给分? 嘿嘿
      

  14.   

    分为什么给了我啊?
    你的程序调试好了?
    我现在也在学习datagridview,这是我编的,你看看能不能用:
            private void button1_Click(object sender, EventArgs e)
            {
                SqlConnection sa = new SqlConnection("Data Source=.;Initial Catalog=master;Integrated Security=True");
                SqlDataAdapter sda = new SqlDataAdapter("select *from shit", sa);
                DataSet ds = new DataSet();
                SqlCommandBuilder scbld = new SqlCommandBuilder(sda);
                sda.Fill(ds, "temp");
                DataRow dr = ds.Tables["temp"].NewRow();
                dr["name"] = textBox1.Text;
                dr["age"] = Convert.ToInt32(textBox2.Text);
                dr["city"] = textBox3.Text;
                dr["zip"] = textBox4.Text;
                ds.Tables["temp"].Rows.Add(dr);
                sda.Update(ds, "temp");
                this.shitTableAdapter.Fill(this.masterDataSet1.shit);
                shitBindingSource.DataSource = masterDataSet1;
                dataGridView1.DataSource = shitBindingSource;