2016-05-14 14 views
-1

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.

+0

Ist dies ein Versuch, LOAD DATA IN FILE neu zu erfinden? – e4c5

+0

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

+0

was war die sogenannte Sackgasse. War das ein Fehler? – e4c5

Antwort

0

wilde Vermutung hier ... Wenn Sie Ihre Spalten erstellen

dt.Columns.Add("sku"); 

Dies schafft eine Spalte vom Typ Zeichenfolge mit dem Namen „sku“. Wenn Ihre MySQL-Tabelle nicht nur Strings, sondern auch andere Typen speichert, schätze ich, dass Sie diesen oder einen sehr ähnlichen Fehler erhalten.

Versuchen Sie, Typen zu Ihrer dt.column.add hinzuzufügen. Dies ist der Link zu unterstützten Datentypen. https://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype(v=vs.110).aspx

+0

danke für Ihre Antwort. Ich habe deinen Vorschlag ausprobiert und bin leider nicht weit gekommen. Habe einen weiteren Fehler, der besagt "sku gehört nicht zur Tabelle". Ich habe meine Datenbank auf Schreibfehler überprüft, aber es gibt keine. andere wilde Vermutungen :)) – dshock9

+0

Sorry für die lange Verzögerung ... war seltsam beschäftigt. Leider habe ich nichts von meinem Kopf. Viel Glück aber! – k2snowman69