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

9njqaruj  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(394)

大家好,
首先,我要提前感谢所有花时间浏览这篇冗长文章的人。
上下文:我正在使用windows窗体和csharp构建一个简单的gui界面,该界面连接到mysql数据库以执行crud操作。
问题:我正在尝试实现一个方法,该方法将把必需的mysql代码元素作为参数,并将表拉入数据网格视图。我已经产生了两个方法-一个接受参数,另一个是硬编码来提取数据。
拉数据后,我可以插入/修改数据库中的任何记录与保存按钮的方法。问题是,当我使用带参数的方法将数据拉入网格视图时,当我得到一个 null 引用错误。但是当使用硬编码方法时,我没有得到任何 null 出错,一切正常。因为某种原因 sqlData 以及 dataTable 在网格视图中填充了基于最终作为参数的方法之后,变量被传递给save button方法 null . 有开发这些应用程序经验的Maven有什么建议吗?
将数据拉入网格视图的硬编码方法:

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元素,我就不需要像在第一个代码片段中那样分别硬编码所有5个拉取方法。它工作,但它不让我保存任何更改,如上面提到的,因为 sqlData 以及 dataTable 当我尝试执行save方法时,变量最终为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);

    }

edit:我已经阅读了可能的重复线程,它是有用的,但是我很难理解为什么本质上使用两个方法来做相同的事情,其中一个会丢弃 sqlData 以及 dataTable 将变量设置为null,并且第一个代码段中的硬编码方法不会删除变量,并保留传递到save方法中所需的值。

raogr8fs

raogr8fs1#

基于@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;
        }
    }

将用网格视图和续集字符串重写的方法另存为参数:

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

相关问题