当前位置:网站首页>BulkInsert方法实现批量导入
BulkInsert方法实现批量导入
2022-08-09 21:43:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
最近在做新生系统,其中有一个导入功能就是把保存在Excel中的多条数据导入到mysql数据库中。最初一点思路都没有,通过查阅资料,研究出了一种导入的方法,首先要把导入的Excel文件转换成Datatable,然后在底层将Datatable 转换成csv格式的文件,最终通过MySqlBulkLoader导入到数据库中。
底层导入的方法如下
/// <summary>
///大批量数据插入,返回成功插入行数
/// </summary>
/// <param name="connectionString">数据库连接字符串</param>
/// <param name="table">数据表</param>
/// <returns>返回成功插入行数</returns>
public static int BulkInsert(DataTable table)
{
if (string.IsNullOrEmpty(table.TableName)) throw new Exception("请给DataTable的TableName属性附上表名称");
if (table.Rows.Count == 0) return 0;
int insertCount = 0;
string tmpPath = Path.GetTempFileName();
string csv = DataTableToCsv(table);
File.WriteAllText(tmpPath, csv);
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
try
{
conn.Open();
//tran = conn.BeginTransaction();
MySqlBulkLoader bulk = new MySqlBulkLoader(conn)
{
FieldTerminator = ",",
FieldQuotationCharacter = '"',
EscapeCharacter = '"',
LineTerminator = "\r\n",
FileName = tmpPath,
NumberOfLinesToSkip = 0,
TableName = table.TableName,
};
bulk.Columns.AddRange(table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList());
insertCount = bulk.Load();
}
catch (MySqlException ex)
{
throw ex;
}
}
File.Delete(tmpPath);
return insertCount;
}
将DataTable转换为标准的CSV的方法
<span style="white-space:pre"> </span>/// <summary>
///将DataTable转换为标准的CSV
/// </summary>
/// <param name="table">数据表</param>
/// <returns>返回标准的CSV</returns>
private static string DataTableToCsv(DataTable table)
{
//以半角逗号(即,)作分隔符,列为空也要表达其存在。
//列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。
//列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。
StringBuilder sb = new StringBuilder();
DataColumn colum;
foreach (DataRow row in table.Rows)
{
for (int i = 0; i < table.Columns.Count; i++)
{
colum = table.Columns[i];
if (i != 0) sb.Append(",");
if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))
{
sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");
}
else sb.Append(row[colum].ToString());
}
sb.AppendLine();
}
return sb.ToString();
}
这是底层的方法,在逻辑层只实现了简单的从Excel转换为Datatable,对于重复的数据判断后还没有提示,还有一些判断和处理需要优化,完善好了再来写。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105727.html原文链接:https://javaforall.cn
边栏推荐
- 万字总结:分布式系统的38个知识点
- knn到底咋回事?
- 埃氏筛选法:统计素数个数
- TF生成均匀分布的tensor
- STC8H开发(十五): GPIO驱动Ci24R1无线模块
- 小黑leetcode之旅:94. 二叉树的中序遍历(补充Morris 中序遍历)
- Interpretation of the paper (DropEdge) "DropEdge: Towards Deep Graph Convolutional Networks on Node Classification"
- leetcode: the Kth largest element in the array
- 论文解读(DropEdge)《DropEdge: Towards Deep Graph Convolutional Networks on Node Classification》
- 题解:Edu Codeforces 109(div2)
猜你喜欢
随机推荐
4D Summary: 38 Knowledge Points of Distributed Systems
简单问题窥见数学
windos安装Mysql8.0,及解决重新登录异常问题 ERROR 1045 (28000)
json事例
Word怎么制作双面席卡?使用Word制作双面席卡方法
Deceptive Dice
字符串哈希(2014 SERC J题)
场效应管Mosfet之雷卯Leiditech对应英飞凌Infineon
TF使用constant生成数据
The kvm virtual machine cannot be started, NOT available, and the PV is larger than the partition
TF生成均匀分布的tensor
PHP 2D array sorted by a field
L3-2 至多删三个字符 (30 分)
Simple questions peek into mathematics
Cookie、session、token
[corctf 2022] section
AI识万物:从0搭建和部署手语识别系统
STC8H development (15): GPIO drive Ci24R1 wireless module
自监督学习 —— MoCo v2
SQL语句及索引的优化