值不能为空.参数名称:数据源.编辑数据网格和保存到数据库

本文关键字:网格 数据网 数据 保存 数据库 编辑 数据源 不能 参数 | 更新日期: 2023-09-27 18:16:41

你好,我这里有一个问题。代码如下:

private void Form3_Load(object sender, EventArgs e)
{ 
     string connectionString =
     "Server=localhost;" +
     "Database=oroderm;" +
     "User ID=root;" +
     "Password=root;" +
     "Pooling=false";
     string query = "Select * from client";
     MySqlConnection conn = new MySqlConnection(connectionString);
     MySqlDataAdapter dAdapter = new MySqlDataAdapter(query, connectionString);
     conn.Open();
     DataSet ds = new DataSet();
     MySqlCommandBuilder cBuilder = new MySqlCommandBuilder(dAdapter);
     dAdapter.Fill(ds, "client");
     BindingSource bSource = new BindingSource();
     bSource.DataSource = ds.Tables["client"];
     dataGridView2.DataSource = bSource;
}
private void button1_Click(object sender, EventArgs e)
{
     DataTable dt = ds.Tables["client"];
     this.dataGridView2.BindingContext[dt].EndCurrentEdit();
     this.da.Update(dt);
}

所以我想要的是,每当我编辑我的数据网格的值,它会影响我的数据库后,我点击button1(保存按钮)。如果我有罗马作为客户后,我改变了他的名字,我点击按钮1,它应该改变。然而,我得到一个值不能为空的错误。有人能帮帮我吗?T_T

*编辑:这里是更新后的代码

private MySqlDataAdapter _da;
        private DataTable _dt;
        private DataSet _ds;
 private void Form3_Load(object sender, EventArgs e)
        {
               updateClient();
        }
public void updateClient()
        {
            string connectionString =
             "Server=localhost;" +
             "Database=oroderm;" +
             "User ID=root;" +
             "Password=root;" +
             "Pooling=false";
            string query = "select * from client";
            MySqlConnection conn = new MySqlConnection(connectionString);
            _da = new MySqlDataAdapter(query, connectionString);
            conn.Open();
            _ds = new DataSet();
            MySqlCommandBuilder cBuilder = new MySqlCommandBuilder(_da);
            _da.Fill(_ds, "client");
            BindingSource bSource = new BindingSource();
            bSource.DataSource = _ds.Tables["client"];
            dataGridView2.DataSource = bSource;
            _da.UpdateCommand = cBuilder.GetUpdateCommand();
        }
private void button1_Click(object sender, EventArgs e)
        {
            _dt = _ds.Tables["client"];
            this.dataGridView2.BindingContext[_dt].EndCurrentEdit();
            this._da.Update(_dt);
        }

值不能为空.参数名称:数据源.编辑数据网格和保存到数据库

我假设您有一个实例变量称为ds,并且您期望Form3_Load方法填充它?这不会发生-因为在Form3_Load你有这个:

DataSet ds = new DataSet();

声明了一个新的局部变量ds,所以除非在方法中显式地使用this.ds,否则不会改变instance变量的值。

我有点惊讶,你没有得到一个NullReferenceException,当你点击按钮,但也许你有一些代码来创建一个 DataSet,并分配引用到ds实例变量的某个地方。无论如何,将上面的行更改为:

ds = new DataSet();

应该可以解决这个问题。

(我强烈建议不要在UI线程中进行数据库请求,请注意,您应该有一个using语句用于您的连接,但这些是单独的事情。)