xls导入mysql不全_经验教训:excel大量数据导入Mysql的血泪史

先后遇到的问题:

1.插入速度太慢

2.Excel的数据太脏,同一列中混合有许多不同类型的值(日期,整数,浮点数)

3.字符集导致的字段太长问题(Data too long for column Data too long for column) [整了我一天,那一天就算我睡了个饱心情美汁汁,一看到这个问题还是会让我眉头紧皱]

4.Table is full,小破阿里云服务器没空间了

解决过程:

1.插入速度太慢:

如果是一条条的简单插入,两分钟才插入1k+条,实在是太慢了。于是上网查了一些方法。

1.改用 PreparedStatement来批插入, 也就是 用 insert into table (a,b,c,d,e,......) values( ?, ? , ? ,......) 的方法去插入

每用 setObject 设置完一个 括号 : () 里的值就 addBatch, 最后 executeBatch , 但实际上还是很慢,和之前没什么区别,或许是我用的方法有问题,具体为什么还要去研究下Mysql的实现

2.改用另一种批插入方法:多值插入

也就是把 sql 语句写成 insert into table (a,b,c,d,e,......) values (x,y,z,...), (x1,y1,z1,...), (..,..,..,...), (..,..,..,...), (..,..,..,...), (..,..,..,...)......

用的不是PreparedStatement ,而是普通 statement 的 execute,有明显的效果,原本要十几分钟来插入的 8m的excel,只用十几秒就可以插入到数据库

2.编码问题

但是随之而来发生的是 Datatoo long for column Data too long for column 的错误,困扰了我许久,我的列明明长度管够,为什么还报错?

按照网上的方法试了许久,还是不行,于是在想是不是和 PreparedStatement 和 Statement 的区别。

最后改用 PreparedStatement , 还是用多值插入 insert into table (a,b,c,d,e,......) values (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...)......

实现起来比较复杂,但是试了许久还是有问题,于是把数据库表中 对应列的 编码改成 utf8,并且适当增长长度,最后成功,具体为什么可能要日后查看实现才能知道

后来又用旧的代码,也就是之前普通statement的语句测试了一下,数据插入成功,可以断定是列的编码不正确,应该选用 utf8

3.数据太脏

知道表的格式,把表头及其对应的类型(按照表头的下一行判断,可能表头的下一列是空的,或者下一列本身不正确,不正确概率比较小,我业务的脏数据一般出现在中后部分),读取出来,建立 表明 - 列类型集合  的映射,如果读进来的值不符合类型,则直接跳过该行,问题解决

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用以下代码来实现将 Excel 数据导入MySQL 数据库中: ```csharp using System; using System.Data; using System.Data.OleDb; using System.Windows.Forms; using MySql.Data.MySqlClient; namespace ExcelToMySQL { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // 设置 Excel 文件路径和连接字符串 string filePath = textBox1.Text; string fileExt = System.IO.Path.GetExtension(filePath); string connString = ""; if (fileExt == ".xls") { connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"; } else if (fileExt == ".xlsx") { connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;'"; } // 读取 Excel 数据到 DataTable 中 OleDbConnection conn = new OleDbConnection(connString); OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn); DataTable dt = new DataTable(); da.Fill(dt); // 将 DataTable 中的数据导入MySQL 数据库中 string mysqlConnString = "Server=localhost;Database=test;Uid=root;Pwd=123456;"; MySqlConnection mysqlConn = new MySqlConnection(mysqlConnString); mysqlConn.Open(); foreach (DataRow row in dt.Rows) { MySqlCommand cmd = new MySqlCommand(); cmd.Connection = mysqlConn; cmd.CommandText = "INSERT INTO mytable (id, name, age) VALUES (@id, @name, @age)"; cmd.Parameters.AddWithValue("@id", row["ID"].ToString()); cmd.Parameters.AddWithValue("@name", row["Name"].ToString()); cmd.Parameters.AddWithValue("@age", row["Age"].ToString()); cmd.ExecuteNonQuery(); } mysqlConn.Close(); MessageBox.Show("导入成功!"); } } } ``` 在上面的代码中,需要根据实际情况修改以下变量: - `filePath`:Excel 文件路径 - `connString`:Excel 连接字符串 - `mysqlConnString`:MySQL 连接字符串 - `da.Fill(dt)`:指定要读取Excel 工作表名称(这里是 `Sheet1`) - `cmd.CommandText`:指定要插入数据的表名和字段名 另外,需要在 WinForm 窗体中添加一个 `TextBox` 控件和一个 `Button` 控件,并将它们分别命名为 `textBox1` 和 `button1`。当用户点击 `button1` 按钮时,会触发 `button1_Click` 方法,从而执行 Excel 数据导入MySQL 数据库的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值