C# 多笔数据导入DB
6万笔数据瞬间导入进DB
命名空间
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
//Filename为文件路径
public JsonResult ConsumptionUploadcoupon(string filename)
{
CouponManageBLL _bll = new CouponManageBLL();
var result = new Result<string>();
result.flag = false;
string Msg = string.Empty;
try
{
CouponManageBLL _BLL = new CouponManageBLL();
BLL.DeleteTempMember(); //先删除临时表信息
DataTable excelTable = new DataTable();
excelTable = GetExcelDataTable(filename, id); //将文件的数据导入datatable
//插入数据
InsertMemberInfo(excelTable, id);
result.flag = true;
}
catch (Exception ex)
{
Log(ex);
result.msg = ex.Message;
throw;
}
return Json(result, JsonRequestBehavior.AllowGet);
}
//将文件数据转为DATATABLE 储存方法
public DataTable GetExcelDataTable(string filePath, int id)
{
IWorkbook Workbook;
DataTable table = new DataTable();
try
{
using (FileStream fileStream = new FileStream(Server.MapPath("~" + filePath), FileMode.Open, FileAccess.Read))
{
//XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
string fileExt = Path.GetExtension(filePath).ToLower();
if (fileExt == ".xls")
{
Workbook = new HSSFWorkbook(fileStream);
}
else if (fileExt == ".xlsx")
{
Workbook = new XSSFWorkbook(fileStream);
}
else
{
Workbook = null;
}
}
}
catch (Exception ex)
{
throw ex;
}
//定位在第一个sheet
ISheet sheet = Workbook.GetSheetAt(0);
//第一行为标题行
IRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum;
int rowCount = sheet.LastRowNum;
//循环添加标题列
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
{
DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
table.Columns.Add(column);
}
table.Columns.Add("coupon_id");
//数据
for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)
{
IRow row = sheet.GetRow(i);
DataRow dataRow = table.NewRow();
if (row != null)
{
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
dataRow[j] = GetCellValue(row.GetCell(j));
dataRow[j + 1] = id;
}
}
}
table.Rows.Add(dataRow);
}
return table;
}
//分页存放数据
public void InsertMemberInfo(DataTable dt, int id)
{
int index = 60000;
if (dt.Rows.Count >= index)
{
int count = dt.Rows.Count / index;
for (int i = 1; i <= count; i++)
{
DataTable dts = GetPagedTable(dt, i, index);
InsertDateTable(dts, id);
}
}
else
{
InsertDateTable(dt, id);
}
}
//与DB表对应进行数据映射
public void InsertDateTable(DataTable dt, int id)
{
string connectionString = ConfigurationManager.AppSettings["SQLConnection"];
// "Data Source =192.168.1.111; Initial Catalog =DB库名; Persist Security Info =True; User ID =sa; Password =123456";
using (SqlConnection destinationConnection = new SqlConnection(connectionString))
{
destinationConnection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
{
try
{
bulkCopy.DestinationTableName = "rsl_temp_coupon";//要插入的表的表名
bulkCopy.BatchSize = dt.Rows.Count;
bulkCopy.ColumnMappings.Add("coupon_no", "coupon_no");//映射字段名 DataTable列名 ,数据库 对应的列名
bulkCopy.ColumnMappings.Add("coupon_id", "coupon_id");
bulkCopy.WriteToServer(dt);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
}
}
}
}
注意导入进DB 数据的栏位一定要一致,否则导入失败。 如有好的建议请在下方评论
C# 多笔数据导入DB的更多相关文章
- jmeter导入DB数据再再优化
前言:分享和规定命名规范后,各位测试人员一致认为这样jmeter的jmx文件限制太死,主要体现六方面: 第一:规定了一个jmx文件只能录入一个接口,这样会导致jmx文件很多 第二:导入DB的jmx文件 ...
- 以Excel 作为Data Source,将data导入db
将Excel作为数据源,将数据导入db,是SSIS的一个简单的应用,下图是示例Excel,数据列是code和name 第一部分,Excel中的数据类型是数值类型 1,使用SSDT创建一个package ...
- jmeter导入DB数据再优化
由于同一个迭代中每天都在执行.之前设计的思路是同个迭代只执行一次插入DB操作!! 因而没有在插入数据前没有做版本.产品类型.页面类型.接口名.接口名是否相等判断操作. 因此,若是这些条件相等,数据不是 ...
- list 分批导入db, 每1000条数据一批 , 从字符串中获取数字,小数, 版本号比较
//这个有个弊端: 分组后分批导入, 是阻塞的,我没有导入完成,别人就不能导入, 这里可以优化成异步,线程池 public static void main(String[] args) { Rand ...
- 2.0(3)MongoDB数据导入导出
——————(1)数据导出———————— 导出为JSON格式 mongoexport -d '数据库' -c '表名' -o ***.json 导出为csv mongoexport -d '数据库' ...
- jmeter读取执行case插入DB生成报表和备份记录
前言:由于通过jmeter写的接口自动化木有数据导入和统计分析功能,因此做了2次开发,目的是读取每条case获取接口名称和用例名称,通过获取的case执行结果进行计算,得到详细接口的用例通过率存入DB ...
- jmeter执行case结果插入DB数据优化
访问初始实现路径:jmeter执行case结果插入DB生成报表和备份记录 借前面实现导入DB数据先说明之前数据的缺点: 第一,若需要依赖接口的数据,会把依赖接口的case统计进去造成数据统计错误.第二 ...
- jmeter执行case结果插入DB生成报表和备份记录
前言:由于通过jmeter写的接口自动化木有数据导入和统计分析功能,因此做了二次开发,目的是读取每条case获取接口名称和用例名称,通过获取的case执行结果进行计算,得到详细接口的用例通过率存入DB ...
- metasploit 中的DB
渗透测试任务中,主机/服务/漏洞等信息如果手动维护,会带来巨大的工作量. 在metasploit中,这部分工作已经被封装的非常好,每次调用内部模块执行的任务结果都会自动存入DB.通过简单的指令即可以方 ...
随机推荐
- STL中的二分查找
本文转载于https://blog.csdn.net/riba2534/article/details/69240450 使用的时候注意:必须用在非递减的区间中 二分查找的原理非常简单,但写出的代码中 ...
- mongodb聚合命令
聚合aggregate 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成管道,可以对每个阶段的管道进行分组.过滤等功能,然后经过一系列的处理,输出相应的 ...
- Vue----常见面试题
1. 谈谈你对MVVM开发模式的理解 MVVM分为Model.View.ViewModel三者. Model 代表数据模型,数据和业务逻辑都在Model层中定义: View 代表UI视图,负责数据的展 ...
- php 5.6,7.0静态方法调用和new调用方法性能差距
windows7 64 机器I5 8G内存,128G SSD 吐槽一下,win10内存的消耗,真的可怕 测试代码 class staticTest { public function test() { ...
- 泡泡一分钟: Deep-LK for Efficient Adaptive Object Tracking
Deep-LK for Efficient Adaptive Object Tracking "链接:https://pan.baidu.com/s/1Hn-CVgiR7WV0jvaYBv5 ...
- python panda::dataframe常用操作
1.条件查询: result = df.query("((a==1 and b=="x") or c/d < 3))" print result 2.遍历 ...
- ElasticSearch - 信息聚合系列之聚合过滤
摘要 聚合范围限定还有一个自然的扩展就是过滤.因为聚合是在查询结果范围内操作的,任何可以适用于查询的过滤器也可以应用在聚合上. 版本 elasticsearch版本: elasticsearch-2. ...
- CRT乱码问题
本人在使用CRT过程中遇到乱码问题,经调试发现要把字体调整为"新宋体",编码格式用"UTF-8". 调整字体: Options à Session option ...
- div 拖拽
html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- 2018-2019-2 网络对抗技术 20165321 Exp4 恶意代码分析
1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,sys ...