BulkInsert方法实现批量导入
2016-08-07 21:45
477 查看
最近在做新生系统,其中有一个导入功能就是把保存在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的方法
这是底层的方法,在逻辑层只实现了简单的从Excel转换为Datatable,对于重复的数据判断后还没有提示,还有一些判断和处理需要优化,完善好了再来写。
底层导入的方法如下
/// <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,对于重复的数据判断后还没有提示,还有一些判断和处理需要优化,完善好了再来写。
相关文章推荐
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- pro*C 使用动态sql方法四实现数据批量导入导出
- SQL Server Bulk Insert 批量数据导入
- SqlBulkCopy(批量导入)使用方法
- (总结) SQL Server Bulk Insert 批量数据导入
- 代码生成BULK INSERT语句,批量将txt数据导入Sqlserver2008
- C#批量保存方法-利用Net SqlBulkCopy 批量导入数据库,速度超快-通用方法源码提供
- Java实现数据批量导入数据库(优化速度-2种方法)
- Oracle批量导入文本文件快速的方法(sqlldr实现)
- Java实现数据批量导入数据库(优化速度-2种方法)
- 使用 BULK INSERT 或 OPENROWSET(BULK...) 导入批量数据 (SQL Server)
- 【ITOO 1】SQLBulkCopy实现不同数据库服务器之间的批量导入
- php实现refresh刷新页面批量导入数据的方法
- access最快速的批量导入SQL的方法 使用SqlBulkCopy
- (总结) SQL Server Bulk Insert 批量数据导入
- php实现refresh刷新页面批量导入数据的方法