Значение не может быть нулевым. Имя параметра: источник данных. Редактирование сетки данных и сохранение в базу данных - PullRequest
3 голосов
/ 04 декабря 2011

Здравствуйте, у меня проблема здесь. Код выглядит следующим образом.

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, это влияло на мою базу данных после того, как я нажал кнопку 1 (кнопка сохранения). ех. Если после смены его имени в качестве клиента у меня появится Роман, и я нажму кнопку 1, это должно измениться. Однако я получаю значение не может быть нулевой ошибкой. Пожалуйста, кто-нибудь может помочь. Т_Т

* РЕДАКТИРОВАТЬ: Вот обновленный код

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 Ответ

4 голосов
/ 04 декабря 2011

Я предполагаю, что у вас есть экземпляр переменная с именем ds, и вы ожидаете, что метод Form3_Load заполнит ее?Этого не произойдет - потому что в Form3_Load у вас есть это:

DataSet ds = new DataSet();

Это объявление новой локальной переменной с именем ds, так что, если вы явно не используете this.ds в методе вы не собираетесь изменять значение переменной instance.

Я немного удивлен, что вы не получаете NullReferenceException при нажатии на кнопку, номожет быть, у вас есть код для создания пустого DataSet и назначения ссылки на переменную экземпляра ds где-нибудь.В любом случае, изменение показанной выше строки на просто:

ds = new DataSet();

должно решить эту проблему.

(я настоятельно рекомендую не делать запросы к базе данных в потоке пользовательского интерфейса, заметьте, и вам следуетУ вас есть using заявление для вашей связи, но это отдельные вопросы.)

...