System.argumentexception: „столбец не принадлежит таблице”. - Как исправить эту ошибку (импорт данных из csv-файла в базу данных mysql)?
В этом случае я хотел бы импортировать данные из csv-файла в базу данных mysql. На данный момент я написал метод, который вставляет этот файл:
1) Выберите файл с расширением "*.csv"
2) После выбора он загружает данные, разделяя запятые и продолжая, если есть пустые ячейки.
private DataTable ImportFile() { DataTable imported_data = new DataTable(); OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "Open csv file"; ofd.DefaultExt = "*.csv"; ofd.Filter = "Documents (*.csv)|*.csv"; ofd.ShowDialog(); FileInfo fi = new FileInfo(ofd.FileName); string FileName1 = ofd.FileName; string excel = fi.FullName; using(StreamReader sr = new StreamReader(excel)) { string header = sr.ReadLine(); if (string.IsNullOrEmpty(header)) { MessageBox.Show("Not found or loaded not correct file."); return null; } string[] header_columns = header.Split(','); foreach(string header_column in header_columns) { imported_data.Columns.Add(header_column); } while (!sr.EndOfStream) { string line = sr.ReadLine(); if (string.IsNullOrEmpty(linia)) continue; string[] fields = line.Split(','); DataRow imported_row = imported_data.NewRow(); for (int i = 0; i < fields.Count(); i++) { imported_row[i] = fields[i]; } imported_data.Rows.Add(imported_row); } } return imported_data; }
Затем второй метод заключается в том, что когда он имеет соединение с базой данных mysql, он вставляет значения в эту базу данных:
private void save_modules(DataTable imported_data) { string connection = "datasource=localhost;port=3306;username=root;password="; using (MySqlConnection conn = new MySqlConnection(connection)) { conn.Open(); foreach (DataRow importRow in imported_data.Rows) { string query3 = @"INSERT IGNORE INTO try1.modules (NAME, ID_PROJECT) SELECT @NAME, projekty.ID FROM try1.projects WHERE projects.PROJECT_NAME = @PROJECT_NAME;"; MySqlCommand cmd = new MySqlCommand(query3, conn); cmd.Parameters.AddWithValue("@NAME", importRow["NAME"]); cmd.Parameters.AddWithValue("@PROJECT_NAME", importRow["PROJECT_NAME"]); cmd.ExecuteNonQuery(); } conn.Close(); } MessageBox.Show("Imported to database"); }
И событие при кликах на btn_import_projects.
private void btn_import_projects_Click(object sender, EventArgs e) { DataTable imported_data = ImportFile(); save_modules(imported_data); frm2.loaddataalldatagridview(); }
когда я составил связан из 3-х линий кодов 1 Код у меня ошибка исключения :
Цитата:Система.ArgumentException: „имя столбца не принадлежит таблице .”
И показывает на строку кода:
cmd.Parameters.AddWithValue("@NAME", importRow["NAME"]);
У меня есть вопрос, как исправить эту ошибку? Должен ли я изменить форму строк кода
cmd.Parameters.AddWithValueк
cmd.Parameters.Add?Есть идеи? Заранее спасибо.
Что я уже пробовал:
Вот мой код:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Collections; using System.Data.OleDb; using System.IO; using System.Configuration; using MySql.Data.MySqlClient; namespace ControlDataBase { public partial class Import_data_mysql : Form { public Import_data_mysql() { InitializeComponent(); } New_Tables frm2 = (New_Tables)Application.OpenForms["New_Tables"]; private DataTable ImportFile() { DataTable imported_data = new DataTable(); OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "Open csv file"; ofd.DefaultExt = "*.csv"; ofd.Filter = "Documents (*.csv)|*.csv"; ofd.ShowDialog(); FileInfo fi = new FileInfo(ofd.FileName); string FileName1 = ofd.FileName; string excel = fi.FullName; using(StreamReader sr = new StreamReader(excel)) { string header = sr.ReadLine(); if (string.IsNullOrEmpty(header)) { MessageBox.Show("Not found or loaded not correct file."); return null; } string[] header_columns = header.Split(','); foreach(string header_column in header_columns) { imported_data.Columns.Add(header_column); } while (!sr.EndOfStream) { string line = sr.ReadLine(); if (string.IsNullOrEmpty(linia)) continue; string[] fields = line.Split(','); DataRow imported_row = imported_data.NewRow(); for (int i = 0; i < fields.Count(); i++) { imported_row[i] = fields[i]; } imported_data.Rows.Add(imported_row); } } return imported_data; } private void save_modules(DataTable imported_data) { string connection = "datasource=localhost;port=3306;username=root;password="; using (MySqlConnection conn = new MySqlConnection(connection)) { conn.Open(); foreach (DataRow importRow in imported_data.Rows) { string query3 = @"INSERT IGNORE INTO try1.modules (NAME, ID_PROJECT) SELECT @NAME, projekty.ID FROM try1.projects WHERE projects.PROJECT_NAME = @PROJECT_NAME;"; MySqlCommand cmd = new MySqlCommand(query3, conn); cmd.Parameters.AddWithValue("@NAME", importRow["NAME"]); cmd.Parameters.AddWithValue("@PROJECT_NAME", importRow["PROJECT_NAME"]); cmd.ExecuteNonQuery(); } conn.Close(); } MessageBox.Show("Imported to database"); } private void btn_import_projects_Click(object sender, EventArgs e) { try { DataTable imported_data = ImportFile(); save_modules(imported_data); frm2.loaddataalldatagridview(); } catch { MessageBox.Show("Select invalid file to import data."); } } } }