在使用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. shell ln

    功能:ln命令为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 ...

  2. ShowDoc 搭建 (未成功....)

    官方教程:https://www.showdoc.cc/help?page_id=13732 下载了showdoc,服务器映射本地磁盘的时候,服务器用户名和密码忘了... 远程服务器用户名和密码修改 ...

  3. 使用jhipster搭建微服务--简单demo

    简介 jhipster简单来说是一个基于nodejs+yeoman的java代码生成器.往大了说是基于java的一套微服务解决方案.请注意是一整套的微服务解决方案.jhipster在整个程序架构上都做 ...

  4. [USB] Windows USB/DVD Download Tool

    此工具为微软官方U盘启动盘制作工具 Windows USB/DVD Download Tool 说明:https://www.microsoft.com/en-us/download/windows- ...

  5. Spring AOP依赖包

    Spring4和2.5发生了很大的变化,原来的spring2.5很多倚赖的jar包都是随着spring一起发布的,现在spring4已 经不再发布倚赖包,需要你自己去导入 1.org.springfr ...

  6. INSERT高级应用

    INSERT INTO departments VALUES (departments_seq.nextval, 'Entertainment', 162, 1400); INSERT INTO em ...

  7. 删除Linux的用户

    vipw : root@ www.linuxidc.com :/home# vipw 找到你之前创建的用户,用dd删除那行(记得保存:wq or :x)..之后. root@ www.linuxidc ...

  8. Oracle数据类型之nchar

    nchar(size)  nvarchar2(size) n 代表的意思是编码格式为unicode编码,无论中文或者英文都以一个字符来存放数据. 举例: 比如“a” ,占用一个字符 比如“月”,占用一 ...

  9. HDU 1103 Flo's Restaurant(模拟+优先队列)

    Flo's Restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. Javascript计算星座

    今天看群里一哥们折腾得挺热乎,手痒随便写了一个DEMO,供初学者参考. 重点,写程序先定注释,明确思路后再写具体代码. //星座定义 var constellations = [ {"Sta ...