【发布时间】: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# 之前尝试加载数据以给出您使用的确切查询。