Grüße alle auf Stackoverflow! Ich habe an diesem Problem gearbeitet und hatte kein Glück. Ich möchte eine CSV-Datei in meine MySQL-Datenbank importieren, aber ich bekomme immer Fehler 1: "Daten zu lang für Spalte 'upc' in Zeile 1" und Fehler 2: "Parameter '@sku' wurde bereits definiert". Fehler 1 kommt einmal und Fehler 2, ich denke, wiederholt, bis die Schleife endet. Mein Code ist wie folgt:Importieren Sie CSV in MySql mit 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
}
}
Meine CSV-Datei Beispiel ist: sku, ItemName, ItemDescription, upc XY-1-12-ZX, Coke Zero Dosen 100 ml - 12er-Pack, „Get erfrischenden Geschmack von Koks mit Null Zucker ", 6111111113
Vielen Dank für Ihre Zeit.
Ist dies ein Versuch, LOAD DATA IN FILE neu zu erfinden? – e4c5
Ich habe versucht, "LOAD DATA INFILE test.csv INTO TABLE Testimport FIELDS TERMINATED VON", "LINES TERMINATED VON '\ n'IGNORE 1 LINES (sku, ItemName, ItemDescription, upc)" aber traf eine Sackgasse. Schreibe ich diese SQL-Anweisung richtig, um die CSV-Datei abzufragen, die wie ich oben beschrieben aussieht? – dshock9
was war die sogenannte Sackgasse. War das ein Fehler? – e4c5