Member 10696161 Ответов: 2

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

2 Ответов

Рейтинг:
4

Member 10696161

Allright вчера я проверял, как в csv-файле значения импортируются в datatable. Я понял, что там разделяются точкой с запятой, например: "любовь"; а не запятыми "любовь".

Итак, проблема заключалась в двух строках кодов:

string[] header_columns = header.Split(',');
string[] fields = line.Split(',');


Мне пришлось перейти на точку с запятой:

string[] header_columns = header.Split(';');
string[] fields = line.Split(';');


И это было сработано. Thx для любой помощи в любом случае. :)


Рейтинг:
0

Gerry Schmitz

PROJECT_NAME-это "параметр" в данном контексте; однако NAME-это не так; NAME-это просто имя столбца в данном случае.

SELECT @NAME, projekty.ID FROM try1.projects ...
SELECT NAME, projekty.ID FROM try1.projects ...


cmd.Parameters.AddWithValue("@NAME", importRow["NAME"]);
cmd.Parameters.AddWithValue("@PROJECT_NAME", importRow["PROJECT_NAME"]);


Member 10696161

Но как это сделать? После изменения формы @NAME на NAME в sql-команде и комментирования cmd.Parameters.AddWithValue("@NAME", importRow["NAME"]);
затем показывается то же самое исключение: на этот раз система.ArgumentException: „столбец PROJECT_NAME не принадлежит таблице.