Вытягивание данных в сетку с использованием 1 метода и получение исключения NULL Ref при сохранении изменений - PullRequest
0 голосов
/ 28 ноября 2018

Добрый день всем,

Во-первых, я хотел бы заранее поблагодарить всех, кто нашел время, чтобы просмотреть этот длинный пост.

Контекст: Я строюпростой интерфейс GUI, использующий формы Windows и C Sharp, который подключается к базе данных MySql для выполнения операций CRUD.

Проблема: Я пытаюсь реализовать метод, который будет принимать необходимые элементы кода MySqlв качестве аргументов и вытащить таблицу в виде сетки данных.Я разработал 2 метода - 1, который принимает аргументы, и другой, который жестко запрограммирован для извлечения данных.

После извлечения данных я могу вставить / изменить любые записи в базе данных с помощью кнопки SAVE.Проблема заключается в том, что когда я использую метод, который принимает аргументы для извлечения данных в виде сетки, я не могу СОХРАНИТЬ свои изменения, поскольку я получаю ошибку ссылки null.Однако при использовании метода с жестким кодом я не получаю никаких ошибок null, и все работает нормально.По какой-то причине, когда переменные sqlData и dataTable передаются методу кнопки SAVE ПОСЛЕ того, как представление сетки заполняется методом на основе аргументов, они заканчиваются как null.Любые эксперты, которые имеют опыт создания этих приложений, посоветуют, пожалуйста?

Жестко запрограммированный метод для извлечения данных в виде сетки:

 private void fill_grid_view1(string sequelQueryString)
    {
        using (MySqlConnection mysqlConn = new MySqlConnection(db_connection))
        {
            mysqlConn.Open();
            sqlData = new MySqlDataAdapter(sequelQueryString, mysqlConn);
            sqlCommandBuilder = new MySqlCommandBuilder(sqlData);

            dataTable = new DataTable();
            sqlData.Fill(dataTable);

            dataGridView1.DataSource = dataTable;
        }   
    }

Кнопка SAVEметоды:

private void bttnSave_Click(object sender, EventArgs e)
    {

        save_changes_refresh(sqlData, dataTable);

    }

private void save_changes_refresh(MySqlDataAdapter given_data_adapter, DataTable given_data_table) 

    {
        try
        {
            given_data_adapter.Update(given_data_table);

            select_both_user_tweet();

            MessageBox.Show("Your changes have been saved successfully!"); //
        }
        catch (Exception errobj)
        {
            MessageBox.Show(errobj.Message.ToString());
        }

    }

Метод, который я хочу использовать для извлечения данных в сетку на основе заданных аргументов:

 private void fill_given_grid_view (string sequelQueryString, MySqlDataAdapter given_data_adapter, DataTable given_data_table, DataGridView given_grid_view,
                                        MySqlCommandBuilder given_builder)

    {
        using (MySqlConnection mysqlConn = new MySqlConnection(db_connection))
        {
            mysqlConn.Open();
            given_data_adapter = new MySqlDataAdapter(sequelQueryString, mysqlConn);
            given_builder = new MySqlCommandBuilder(given_data_adapter);

            given_data_table = new DataTable();
            given_data_adapter.Fill(given_data_table);

            given_grid_view.DataSource = given_data_table;
        }
    }

Весь новый методОн извлекает данные, основанные на аргументах, так что если бы у меня было, скажем, 5 элементов dataGridView, мне не пришлось бы жестко кодировать все пять методов извлечения отдельно, как я делал в первом фрагменте кода.И это работает, но не позволяет мне сохранять любые изменения, как упомянуто выше, потому что переменные sqlData и dataTable заканчиваются нулем, когда я пытаюсь выполнить метод сохранения.

Методкоторый передает необходимые параметры в fill_given_grid_view:

private void view_users_Click(object sender, EventArgs e) 
    {
        fill_given_grid_view("SELECT * FROM new_schema.user", sqlData, dataTable, dataGridView1, sqlCommandBuilder);

    }

РЕДАКТИРОВАТЬ: Я прочитал возможный дубликат потока, и это полезно, однако я изо всех сил пытаюсь понять, почему, по сути, используя 2 метода, которые делают то же самоеодна из них сбрасывает переменные sqlData и dataTable в ноль, а метод с жестким кодом из первого фрагмента не удаляет переменные и сохраняет необходимые значения для передачи в метод SAVE.

1 Ответ

0 голосов
/ 30 ноября 2018

На основе предложений @Reniuz пришлось переписать методы fill_given_grid_view и save_changes_refresh, чтобы в качестве аргументов были приняты dataGridView и sequelQueryString.Переменные sqlData и dataTable нигде не используются в качестве входных данных для метода.Примеры кода ниже:

Метод для извлечения данных в виде сетки на основе ввода:

        private void fill_given_grid_view (string sequelQueryString, DataGridView given_grid_view) /* master method that takes an SQL query and grid view as input 
                                                                                                  and displays a table accordingly */

    {
        using (MySqlConnection mysqlConn = new MySqlConnection(db_connection)) // using stored connection params
        {
            mysqlConn.Open();
            sqlData = new MySqlDataAdapter(sequelQueryString, mysqlConn);
            sqlCommandBuilder = new MySqlCommandBuilder(sqlData);

            dataTable = new DataTable(); // new dataTable created, filled based on given query and set as the DataSource of the grid given as input to the method
            sqlData.Fill(dataTable);

            given_grid_view.DataSource = dataTable;
        }
    }

Метод SAVE, переписанный с видом сетки и строкой продолжения в видеаргументы:

private void save_changes(string sequelQueryString, DataGridView given_grid_view) /* master save method that initializes a new Data Adapter based on given sequel string 
                                                                                         that saves any changes inputted into the given grid view */

    {
        using (MySqlConnection mysqlConn = new MySqlConnection(db_connection))
        {
            mysqlConn.Open();
            sqlData = new MySqlDataAdapter(sequelQueryString, mysqlConn);
            sqlCommandBuilder = new MySqlCommandBuilder(sqlData);

            var current_data_table = (DataTable)given_grid_view.DataSource; // if any changes occur in given grid view db table is updated when a "SAVE" button is clicked
            sqlData.Update(current_data_table);
        }
    }
...