2016-05-14 2 views
-1

Приветствую всех на 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

Благодарим вас за внимание.

+0

Является ли это попыткой изобретать ЗАГРУЗНЫЕ ДАННЫЕ В ФАЙЛЕ? – e4c5

+0

Я попробовал «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

+0

Какой был так называемый тупик. Была ли ошибка? – e4c5

ответ

0

Wild догадка ... Когда вы создаете столбцы

dt.Columns.Add("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