Добрый день всем,
Во-первых, я хотел бы заранее поблагодарить всех, кто нашел время, чтобы просмотреть этот длинный пост.
Контекст: Я строюпростой интерфейс 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.