使用 1 方法将数据拉入网格视图并在保存更改时获取空引用异常

Pulling data into a grid view using 1 method and getting null ref exception when saving changes

大家好,

首先,我想提前感谢所有花时间阅读这篇冗长文章的人 post。

上下文: 我正在使用 windows 表单和 c sharp 构建一个简单的 GUI 界面,它连接到 MySql 数据库以执行 CRUD 操作。

问题: 我正在尝试实现一种方法,该方法将必要的 MySql 代码元素作为参数并将 table 拉入数据网格看法。我已经制作了 2 种方法 - 一种采用参数,另一种是硬编码以提取数据。

提取数据后,我可以使用“保存”按钮方法insert/amend 数据库中的任何记录。问题是,当我使用采用参数的方法将数据拉入网格视图时,我无法保存我的更改,因为我收到 null 引用错误。但是,当使用硬编码方法时,我没有收到任何 null 错误并且一切正常。出于某种原因,当 sqlDatadataTable 变量在网格视图被基于参数的方法填充后传递给保存按钮方法时,它们最终成为 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;
        }   
    }

保存按钮方法:

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 元素,我就不需要像在第一个代码片段中那样分别对所有五个提取方法进行硬编码。它有效但它不允许我保存如上所述的任何更改,因为当我尝试执行保存方法时 sqlDatadataTable 变量最终为 null。

将需要的参数传递给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 种方法来做同样的事情,其中​​一种方法会删除 sqlDatadataTable变量为 null 并且第一个代码段中的硬编码方法不会删除变量并保留传递给 SAVE 方法所需的值。

根据@Reniuz 的建议,必须重写 fill_given_grid_viewsave_changes_refresh 方法以将 dataGridViewsequelQueryString 作为参数。 sqlDatadataTable 变量未在任何地方用作方法的输入。代码示例如下:

根据输入将数据拉入网格视图的方法:

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

使用网格视图和 sequel 字符串作为参数重写的 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);
        }
    }