【问题标题】:import csv in MySql using C#使用 C# 在 MySql 中导入 csv
【发布时间】:2016-05-14 04:01:33
【问题描述】:

向 Stackoverflow 上的每个人问好! 我一直在解决这个问题,但没有运气。我想将一个 csv 文件导入到我的 mysql 数据库中,但我不断收到错误 1:“第 1 行的列 'upc' 的数据太长”和错误 2:“参数 '@sku' 已被定义”。错误 1 ​​出现一次,错误 2 出现,我猜会重复直到循环结束。我的代码如下:

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,项目名称,项目描述,upc XY-1-12-ZX,可乐零罐 100 毫升 - 12 件装,“零糖可乐的清爽口感”,6111111113

感谢您的宝贵时间。

【问题讨论】:

  • 这是重新发明 LOAD DATA IN FILE 的尝试吗?
  • 我确实尝试过“将数据 INFILE test.csv 加载到表 testimport 字段中,由 ',' LINES TERMINATED BY '\n'IGNORE 1 LINES (sku,ItemName,ItemDescription,upc)”但点击了死路。我是否正确编写了这个 sql 语句来查询看起来像我上面描述的 csv 文件?
  • 什么是所谓的死胡同。是不是有错误?
  • 是的,有一个错误提示“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在 'test.csv INTO TABLE testimport 附近使用正确的语法FIELD' 在第 1 行。我尝试查找语法错误,但没有发现任何错误。?? 所以放弃了这条路线。
  • 文件名应该用引号引起来。您为什么不更新答案并提及您在切换到 c# 之前尝试加载数据以给出您使用的确切查询。

标签: c# mysql csv


【解决方案1】:

在这里猜测一下......当您创建列时

    dt.Columns.Add("sku");

这将创建一个名为“sku”的字符串类型的列。如果您的 MySQL 表不仅存储字符串,还存储其他类型,我猜您会收到此错误或非常类似的错误。

尝试将类型添加到您的 dt.column.add。这是支持的数据类型的链接。 https://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype(v=vs.110).aspx

【讨论】:

  • 感谢您的回复。我试过你的建议,不幸的是没有走远。还有另一个错误说“sku 不属于该表”。我检查了我的数据库是否有任何拼写错误,但没有。任何其他疯狂的猜测:))
  • 抱歉,耽搁了这么久……出奇地忙。可悲的是,我没有任何想法。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多