System.ArgumentException: «Столбец не принадлежит таблице.» - как исправить эту ошибку (импортировать данные из файла CSV в базу данных MySQL)? - PullRequest
0 голосов
/ 09 июля 2019

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

System.ArgumentException: „Столбец NAME не принадлежит таблице.”

И показывает в строке кода:

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

У меня есть вопрос, как исправить эту ошибку?Должен ли я изменить строки кода с cmd.Parameters.AddWithValue на cmd.Parameters.Add?Есть идеи?Заранее спасибо.

ОБНОВЛЕНИЕ

для случая только для 1 столбца код:

private void save_projects(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 query2 = "INSERT IGNORE INTO try1.projects(PROJECT_NAME) VALUES (@PROJECT_NAME);";

                MySqlCommand cmd = new MySqlCommand(query2, conn);

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

            cmd.ExecuteNonQuery();
        }
        conn.Close();
    }  
    MessageBox.Show("Imported to database");
}

Работает без каких-либо мелких ошибок.

Вот мой код:

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

1 Ответ

0 голосов
/ 12 июля 2019

Хорошо. Отвечая на совет @soohoonigan, мне пришлось изменить только две строки кода:

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

Обнаружив, что в .csb файле отделяются эти ";" знаки, поэтому я изменил эти строки на это:

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

И работает правильно. Большое спасибо товарищи. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...