2016-05-14 17 views
-1

ご挨拶皆さん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

ありがとうございます。

+0

これは、LOAD DATA IN FILEを再作成しようとしていますか? – e4c5

+0

私は "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

+0

いわゆるデッドエンドとは何ですか?それは間違いでしたか? – e4c5

答えて

0

ここワイルド推測...あなたが列を作成

dt.Columns.Add("sku"); 

これは、「SKU」という名前の文字列型の列を作成します。あなたのMySQLテーブルが文字列を格納するだけでなく、他の型を格納しているのであれば、私はこのエラーか非常によく似たエラーが発生すると思います。

dt.column.addに型を追加してみてください。これは、サポートされているデータ型へのリンクです。 https://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype(v=vs.110).aspx

+0

ご回答いただきありがとうございます。私はあなたの提案を試みたが、残念ながら遠くに来なかった。 「skuはテーブルに属していません」という別のエラーがあります。私は、スペルミスのために私のデータベースをチェックしたが、何もない。他の野生の推測:)) – dshock9

+0

長い遅延のために申し訳ありません...奇妙に忙しいです。悲しいことに私は頭の上から何も持っていない。幸運にも! – k2snowman69

関連する問題