DataSet ds;
        OleDbDataAdapter adap;
        private void button1_Click(object sender, EventArgs e)//加载数据
        {
            OleDbConnection conn=new OleDbConnection("provider=microsoft.jet.oledb.4.0;jet oledb:database password='txp2008*';data source=G:\\程序设计-C#\\XP.MDB");
            adap = new OleDbDataAdapter("select name,gz from tb_student", conn);           
            ds=new DataSet();
           adap.MissingSchemaAction=MissingSchemaAction.AddWithKey;
            adap.Fill(ds);
            dataGridView1.DataSource = ds.Tables[0];
            this.dataGridView1.Columns[2].DefaultCellStyle.Format = "¥#,000";
        }        private void button2_Click(object sender, EventArgs e)//更新数据
        {
            ds.Tables[0].PrimaryKey = new DataColumn[] { ds.Tables[0].Columns["name"] };
            DataColumn[] cols;
            cols = ds.Tables[0].PrimaryKey;
            for (int i = 0; i < cols.Length; i++)
            MessageBox.Show(cols[i].ColumnName);            
            OleDbCommandBuilder build = new OleDbCommandBuilder(adap);           
            adap.Update(ds.Tables[0]);
            MessageBox.Show("修改成功!");
        }

解决方案 »

  1.   

    补充:数据表ID,NAME,GZ,其中ID是主键,
    但是我想在Datatable 中设置NAME 为主键,这样就不行,请各位高手多多指导
      

  2.   

    楼主 你查下DataAdapter的MSDN 这个 貌似是根据DataRow的一个state 来更新数据的 就是说如果数据的state状态没有变化的话 DataAdapter是不可能更新数据库数据的。 
      

  3.   

    LZ希望相同Name的数据做批量变更?
      

  4.   


    你把NAME换成真正的主键ID试试,如果更新成功了,则说明就是主键的问题。
    我没用过OleDbCommandBuilder类,不知道他会不会判断表的真实主键名称。
      

  5.   

    我认为是主键的问题没有设置成功,但是这段代码MessageBox.Show(cols[i].ColumnName)显示是成功的
    不知为什么?
    出现提示信息:对于不返回任何键列信息的 SelectCommand,不支持 UpdateCommand 的动态 SQL 生成。
      

  6.   

    public void reData(string sqlstr)
            {
                SqlCommand sqlcmd = new SqlCommand();
                sql.Open();
                sqlcmd.Connection = sql;
                sqlcmd.CommandText = sqlstr;
                sqlcmd.ExecuteNonQuery();
                sql.Close();           
            }