Приветствую всех на Stackoverflow! Я работаю над этой проблемой и не повезло. Я хочу импортировать файл csv в мою базу данных mysql, но я продолжаю получать ошибку 1: «слишком большие данные для столбца« upc »в строке 1» и ошибка 2: «Параметр« @sku »уже определен». Ошибка 1 появляется один раз и ошибка 2, я думаю, повторяется до конца цикла. Мой код выглядит следующим образом:импорт csv в MySql с использованием C#
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.IO;
using MySql.Data;
using MySql.Data.MySqlClient;
//using Microsoft.VisualBasic.FileIO;
namespace cvsimporttrial
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnOpenFile_Click(object sender, EventArgs e)
{
OpenFileDialog fd = new OpenFileDialog();
fd.DefaultExt = "*.csv";
fd.Filter = "CSV files (*.csv)|*.csv";
fd.ShowDialog();
textBox1.Text = fd.FileName;
}
private void btnSaveToDatabase_Click(object sender, EventArgs e)
{
string constr = "server=localhost;user id=*****;password=*****;persistsecurityinfo=True;database=*****";
MySqlConnection con = new MySqlConnection(constr);
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;
cmd.CommandText = "insert into testimport values (@sku,@itemname,@itemdescription,@upc)";
DataTable dt = new DataTable();
try
{
con.Open();
cmd.Prepare();
// Open the text file using a stream reader.
using (StreamReader sr = new StreamReader(textBox1.Text))
{
dt.Columns.Add("sku");
dt.Columns.Add("ItemName");
dt.Columns.Add("ItemDescription");
dt.Columns.Add("upc");
while (!sr.EndOfStream)
{// Read the stream to a string, and write the string to the console.
//DataRow dr = dt.NewRow();
String line = sr.ReadLine(); //sr.ReadToEnd();
string[] columns = line.Split(',');
foreach (DataColumn cols in dt.Columns)
{ DataRow dr = dt.NewRow();
dr["sku"]= columns[0];
if (columns[0] == "sku") { continue; }//skip the heading as database already has heading, is there any other way to achieve this.
dr["ItemName"]= columns[1];
dr["ItemDescription"] = columns[2];
dr["upc"]= columns[3];
dt.Rows.Add(dr);
//Console.WriteLine(columns[3]);
}//foreach loop
//Console.WriteLine(line);
//Console.WriteLine(columns[0]);
//Console.WriteLine(columns[1]);
//Console.WriteLine(columns[2]);
//Console.WriteLine(columns[3]);
try
{
foreach (DataRow r in dt.Rows)
{
//cmd.Parameters["@sku"].Value = r["sku"];
cmd.Parameters.AddWithValue("@sku", r["sku"]);
cmd.Parameters.AddWithValue("@itemname", r["ItemName"]);
cmd.Parameters.AddWithValue("@itemdescription", r["ItemDescription"]);
cmd.Parameters.AddWithValue("@upc", r["upc"]);
cmd.ExecuteNonQuery();
}
}//mysql try block
catch (MySqlException mse) { MessageBox.Show(mse.Message); }//mysql catch
}//while loop
}
}//try block for file stream
catch (Exception ex) { Console.WriteLine(ex.Message); }//catch for file stream
}//btnSaveToDatabase_click event
}
}
Мой пример CSV файл: Код, ItemName, ItemDescription, UPC XY-1-12-ZX, Coke Zero банки 100 мл - пачка 12, «Получить освежающий вкус кокса с нулевым сахаром », 6111111113
Благодарим вас за внимание.
Является ли это попыткой изобретать ЗАГРУЗНЫЕ ДАННЫЕ В ФАЙЛЕ? – e4c5
Я попробовал «LOAD DATA INFILE test.csv INTO TABLE testimport FIELDS TERMINATED BY», «LINES TERMINATED by» \ n'IGNORE 1 LINES (sku, ItemName, ItemDescription, upc) », но попал в тупик. Я правильно пишу этот SQL-запрос для запроса к файлу csv, который выглядит так, как я описал выше? – dshock9
Какой был так называемый тупик. Была ли ошибка? – e4c5