在使用SqlBulkCopy导入数据时,要有一个跟数据库里面同样的DataTable

要赋值表名

要求每个列跟数据库中列同名,并且列的类型要赋值跟数据库中列的类型对应的NET类型

要求数据库中为Null的数据,赋值DBNull.Value

代码:

        [AcceptVerbs(HttpVerbs.Post)]
public JsonResult Upload(HttpPostedFileBase fileData)
{
if (fileData != null)
{
try
{
Guid UserID = (Session["User"] as User).UserID;
List<string> columns = GetColumns();
string fileName = Path.GetFileName(fileData.FileName);// 原始文件名称
string fileExtension = Path.GetExtension(fileName); // 文件扩展名
DataTable dt = new DataTable(); IWorkbook workbook = null;
if (fileExtension == ".xlsx")
{
workbook = new XSSFWorkbook(fileData.InputStream); // .xlsx
}
else
{
workbook = new HSSFWorkbook(fileData.InputStream); // .xls
} ISheet sheet = workbook.GetSheetAt();
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
int cellCount = columns.Count();
foreach (var col in columns)
{
dt.Columns.Add(col.Trim());
}
//用于跳出2层循环
var isT = false;
for (int i = (sheet.FirstRowNum + ); i <= sheet.LastRowNum; i++)
{
if (isT) { break; }
IRow row = sheet.GetRow(i);
DataRow dataRow = dt.NewRow();
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (j == )
{
string num = row.GetCell(j).ToString();
if (string.IsNullOrEmpty(row.GetCell(j).ToString()))
{
isT = true; break;
}
if (row.GetCell(j) != null)
dataRow[j] = Guid.NewGuid(); }
else
{
if (row.GetCell(j) != null)
dataRow[j] = row.GetCell(j).ToString();
}
}
if (!isT)
{
dt.Rows.Add(dataRow);
}
}
dt.Columns.Remove("合计");
dt.Columns.Add("InsuranceCompany");
dt.Columns.Add("IsDelete");
dt.Columns.Add("CreateTime");
dt.Columns.Add("CreateBy");
dt.Columns.Add("UpdateTime");
dt.Columns.Add("UpdateBy");
for (var i = ; i < dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];
dr["IsDelete"] = false;
dr["CreateTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
dr["CreateBy"] = UserID;
dr["UpdateTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
dr["UpdateBy"] = UserID;
string state = dr["State"].ToString().Trim();
if (state == "在修")
{
dr["State"] = ;
}
else
{
//已结算
dr["State"] = ;
}
string InsuranceCompany = "";
string str1 = dr["中保"].ToString().Trim();
string str2 = dr["太保"].ToString().Trim();
string str3 = dr["平安"].ToString().Trim();
string str4 = dr["其他"].ToString().Trim();
if (!string.IsNullOrEmpty(str1))
{
InsuranceCompany = "中保";
}
else if (!string.IsNullOrEmpty(str2))
{
InsuranceCompany = "太保";
}
else if (!string.IsNullOrEmpty(str3))
{
InsuranceCompany = "平安";
}
else if (!string.IsNullOrEmpty(str4))
{
InsuranceCompany = "其他";
}
dr["InsuranceCompany"] = InsuranceCompany;
}
dt.Columns.Remove("中保");
dt.Columns.Remove("太保");
dt.Columns.Remove("平安");
dt.Columns.Remove("其他");
dt.TableName = "T_DMSMaintenance";
DataTable dt2 = ConvertDataType(dt);
BizCenter biz = new BizCenter();
var isS = biz.SqlBulkCopyData(dt2, "ID", "CJGreenWay");
if (isS)
{
return Json(new { Success = true, Message = "导入数据成功!" }, JsonRequestBehavior.AllowGet);
}
else
{
return Json(new { Success = false, Message = "导入数据失败!" }, JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{
return Json(new { Success = false, Message = ex.Message }, JsonRequestBehavior.AllowGet);
}
}
else
{
return Json(new { Success = false, Message = "请选择要上传的文件!" }, JsonRequestBehavior.AllowGet);
}
} public DataTable ConvertDataType(DataTable dt)
{
var conn = new SqlConnection(ConnectionInstance.Instance.ConnectionNodes["CJGreenWay"].connectionString);
conn.Open();
if (dt.Rows.Count == ) return null;
DataTable result = new DataTable();
//获取数据库表结构
var res = new string[];
res[] = dt.TableName;
DataTable dtTemp = conn.GetSchema("Columns", res);
foreach (DataRow row in dtTemp.Rows)
{
string colName = row["COLUMN_NAME"].ToString();
string dataType = row["DATA_TYPE"].ToString();
bool isNull = row["IS_NULLABLE"].ToString().Trim() == "YES" ? true : false;
foreach (DataColumn dc in dt.Columns)
{
if (dc.ColumnName == colName)
{
result.Columns.Add(colName, GetCSharpType(dataType));
}
}
}
foreach (DataRow row in dt.Rows)
{
DataRow nRow = result.NewRow();
foreach (DataColumn col in dt.Columns)
{
if (string.IsNullOrEmpty(row[col.ColumnName].ToString()))
{
nRow[col.ColumnName] = DBNull.Value;
}
else
{
nRow[col.ColumnName] = row[col.ColumnName];
}
}
result.Rows.Add(nRow);
}
result.TableName = dt.TableName;
conn.Close();
return result;
}
public List<string> GetColumns()
{ string arr = @" ID ,State
,WorkOrderNO
,CustomerName
,CarNo
,ServiceAdvisor
,ElectricalLaborHour
,ElectricalParts
,SheetSprayLaborHour
,SheetSprayParts
,SheetSprayPayType
,SheetSprayTransLaborHour
,OilChangeLaborHour
,OilChangeParts
,WarrantyLaborHour
,WarrantyParts
,WarrantyTransLaborHour
,InternalElectricalLaborHour
,InternalParts
,InternalSheetSprayLaborHour
,InternalOil
,InternalPayDept
,ZeroWorkOrder
,合计
,中保
,太保
,平安
,其他";
return arr.Replace("\r\n", "").Replace (" ","").Split(',').ToList();
} public Type GetCSharpType(string type, bool isNull = false)
{
Type tp;
switch (type.ToLower())
{
case "uniqueidentifier":
if (isNull) { tp = typeof(Guid?); } else { tp = typeof(Guid); } break;
case "nvarchar":
case "varchar":
case "nchar":
case "text":
tp = typeof(string); break;
case "bit":
if (isNull) { tp = typeof(bool?); } else { tp = typeof(bool); } break;
case "datetime":
case "timestamp":
if (isNull) { tp = typeof(DateTime?); } else { tp = typeof(DateTime); } break;
case "tinyint":
case "int":
case "bigint":
case "float":
case "decimal":
case "numeric":
if (isNull) { tp = typeof(decimal?); } else { tp = typeof(decimal); } break;
default:
tp = typeof(string); break; }
return tp;
}

先是导入Excel中数据,然后将Excel生成的DataTable转换成跟数据库中对应的,

使用新的表,因为有数据的表的列不能转换列的类型

conn.GetSchema("Columns", res); 获取表字段信息

查看具体的ConvertDataType方法,就是具体的给表的列赋值类型
表的类型不需要转换成C#中带null的类型,比如DateTime不需要让表的字段类型转成DateTime?,有null直接赋值DBNull.Value;

SqlBulkCopy 批量导入数据 转换表字段类型的更多相关文章

  1. java使用POI实现Excel批量导入数据

    1.准备工作 1.1 创建模板表头与数据库表字段一一对应,示例如下 1.2将模板放入项目中,如下图所示: 2.前端页面 2.1 使用超链接提供模板下载地址 <html lang="zh ...

  2. sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

  3. csv文件批量导入数据到sqlite。

    csv文件批量导入数据到sqlite. 代码: f = web.input(bs_switch = {})  # bs_switch 为from表单file字段的namedata =[i.split( ...

  4. 使用python向Redis批量导入数据

    1.使用pipeline进行批量导入数据.包含先使用rpush插入数据,然后使用expire改动过期时间 class Redis_Handler(Handler): def connect(self) ...

  5. SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

    原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...

  6. Cassandra使用pycassa批量导入数据

    本周接手了一个Cassandra系统的维护工作,有一项是需要将应用方的数据导入我们维护的Cassandra集群,并且为应用方提供HTTP的方式访问服务.这是我第一次接触KV系统,原来只是走马观花似的看 ...

  7. Redis批量导入数据的方法

    有时候,我们需要给redis库中插入大量的数据,如做性能测试前的准备数据.遇到这种情况时,偶尔可能也会懵逼一下,这里就给大家介绍一个批量导入数据的方法. 先准备一个redis protocol的文件( ...

  8. 项目总结04:SQL批量导入数据:将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库

    将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库 写在前面:本文用的语言是java:数据库是MySql: 需求:在实际项目中,经常会被客户要求,做批量导入数据:一般的简单的单表数 ...

  9. 批量导入数据到mssql数据库的

    概述 批量导入数据到数据库中,我们有好几种方式. 从一个数据表里生成数据脚本,到另一个数据库里执行脚本 从EXCEL里导入数据 上面两种方式,导入的数据都会生成大量的日志.如果批量导入5W条数据到数据 ...

随机推荐

  1. 【jdk源码学习】HashMap

    package com.emsn.crazyjdk.java.util; /** * “人”类,重写了equals和hashcode方法...,以id来区分不同的人,你懂的... * * @autho ...

  2. Python GUI--Tkinter实践

    之前写了Testlink自动执行程序,现使用Tkinter加上GUI试试,想要实现如下图功能 可以实现通过选择要执行的url及报告url自动执行用例,或可以直接写报告结果内容 因项目原因,只列出部分代 ...

  3. 牛客网多校赛第七场A--Minimum Cost Perfect Matching【位运算】【规律】

    链接:https://www.nowcoder.com/acm/contest/145/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  4. Oracle Schema Objects——Index

    索引主要的作用是查询优化. Oracle Schema Objects 查看执行计划的权限:查看执行计划plustrace:set autotrace trace exp stat(SP2-0618. ...

  5. zabbix debug and vulnerability https://www.zabbix.com/documentation/3.0/manual/concepts/sender

    https://www.zabbix.com/documentation/3.0/manual/concepts/sender zabbix--- zabbix_sender -vv -z 172.2 ...

  6. No module named pip.req

    https://stackoverflow.com/questions/25192794/no-module-named-pip-req#

  7. Python开发【模块】:CSV文件 数据可视化

    CSV模块 1.CSV文件格式 要在文本文件中存储数据,最简单的方式是讲数据作为一系列逗号分隔的值(CSV)写入文件,这样的文件成为CSV文件,如下: AKDT,Max TemperatureF,Me ...

  8. django的framework优化

    1.优化framework的性能,解决restapi调用慢的问题 ①预加载,关联查询时做缓存,序列化前简单调用setup_eager_loading ,这个需要确定sql查询调用情况(根据数据库结构确 ...

  9. 洛谷P1613 跑路 图论

    正解:倍增+图论 解题报告: 传送门! 话说这题是真滴很妙啊,,,大概港下QwQ 首先看懂这道题,它是说,只要是1<<k的都能1s跑过,而且每条边的长度都是1,就是说一秒可以跑过1< ...

  10. mysql 约束条件 外键 forigen key 介绍

    外键 forigen key作用 :建立表之间的关系 什么是外键 员工信息表有这些字段:id号  姓名 性别 员工所在部门名 部门描述信息 公司有3个部门,但是有1个亿的员工,那意味着 员工所对应的部 ...