ご挨拶皆さんStackoverflow! 私はこの問題に取り組んでおり、運がなかった。私はmysqlデータベースにcsvファイルをインポートしたいが、エラー1が発生し続ける。 "行1のカラム 'upc'のデータが長すぎ、エラー2:"パラメータ '@sku'がすでに定義されている "。エラー1は1回、エラー2はループが終了するまで繰り返されます。次のように私のコードは次のとおりです。MySqlでCsvを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ファイルのサンプルです: SKU、ItemNameの、ItemDescription、UPC XY-1-12-ZX、コーラゼロ缶100ミリリットル - 12のパック、「さわやかな味をゲットコークスのゼロ糖」、6111111113
ありがとうございます。
これは、LOAD DATA IN FILEを再作成しようとしていますか? – e4c5
私は "LOAD DATA INFILE test.csv INTO TABLE testimport FIELDS TERMINATED BY"、 "LINES TERMINATED BY '\ n'IGNORE 1 LINES(sku、ItemName、ItemDescription、upc)"を試しましたが、デッドエンドにヒットしました。私は上記のように見えるcsvファイルに対してクエリに正しくSQL文を記述していますか? – dshock9
いわゆるデッドエンドとは何ですか?それは間違いでしたか? – e4c5