Value cannot be null. Parameter name: dataSource. Editing Datagrid and Save to Database

rj tubera picture rj tubera · Dec 4, 2011 · Viewed 10.9k times · Source

Hello I'm having a problem here. The code looks like this.

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

So what I want is that whenever I edit the values in my Datagrid it will affect my database after I click button1 (save button). ex. If I have roman as the client after I changed his name and I click button1 it should change. However Im getting a value cannot be null error. Please can somebody help. T_T

*EDIT: Heres the Updated Code

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

        }

Answer

Jon Skeet picture Jon Skeet · Dec 4, 2011

I assume you've got an instance variable called ds, and you're expecting the Form3_Load method to populate it? That won't happen - because in Form3_Load you've got this:

DataSet ds = new DataSet();

That's declaring a new local variable called ds, so unless you explicitly use this.ds in the method, you're not going to change the value of the instance variable.

I'm slightly surprised that you're not getting a NullReferenceException when you click on the button, but maybe you've got some code to create an empty DataSet and assign a reference to the ds instance variable somewhere. Anyway, changing the line shown above to just:

ds = new DataSet();

should fix this problem.

(I would strongly advise against making database requests in the UI thread, mind you, and you should have a using statement for your connection, but those are separate matters.)