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

Posted

技术标签:

【中文标题】值不能为空。参数名称:数据源。编辑数据网格并保存到数据库【英文标题】:Value cannot be null. Parameter name: dataSource. Editing Datagrid and Save to Database 【发布时间】:2012-01-12 12:19:53 【问题描述】:

您好,我在这里遇到了问题。代码如下所示。

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);

所以我想要的是,每当我在我的 Datagrid 中编辑值时,它都会在我单击 button1(保存按钮)后影响我的数据库。前任。如果我在更改名称后将罗马作为客户并单击 button1,它应该会更改。但是我得到一个值不能是空错误。请有人帮忙。 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);

        

【问题讨论】:

【参考方案1】:

我假设您有一个名为dsinstance 变量,并且您希望Form3_Load 方法填充它?这不会发生 - 因为在 Form3_Load 你有这个:

DataSet ds = new DataSet();

这声明了一个名为ds 的新本地 变量,因此除非您在方法中明确使用this.ds,否则您不会更改instance 变量的值。

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

ds = new DataSet();

应该解决这个问题。

(请注意,我强烈建议您不要在 UI 线程中发出数据库请求,并且您应该为您的连接使用 using 语句,但这些是单独的问题。)

【讨论】:

我已经设法通过为数据集、数据表和 mysqladapter 创建全局变量来运行代码。但是,我只能修改一次表的内容。编辑一次后,我无法编辑表格的内容。这是什么问题? @rjtubera:我不知道,但这对我来说听起来像是一个单独的问题,需要更详细的描述和更新的代码。 (顺便说一句,您不需要真正的 全局 变量。) 我把更新的代码放在上面。非常感谢你帮助我。 T_T @rjtubera:不,我建议你问一个问题。当一篇帖子实际上最终包含几个随时间变化的问题时,Stack Overflow 无法正常工作。

以上是关于值不能为空。参数名称:数据源。编辑数据网格并保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

值不能为空。 (参数's')尝试将excel文件上传到数据库时

使用 DAL2 访问数据:值不能为空。参数名称:con

值不能为空。参数名称:元素

网格部件判断字段内容不能为空

值不能为空。参数名称:dest

值不能为空。参数名称:编码器[重复]