SqlBulkCopy 批量导入数据 转换表字段类型
在使用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 批量导入数据 转换表字段类型的更多相关文章
- java使用POI实现Excel批量导入数据
1.准备工作 1.1 创建模板表头与数据库表字段一一对应,示例如下 1.2将模板放入项目中,如下图所示: 2.前端页面 2.1 使用超链接提供模板下载地址 <html lang="zh ...
- sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下. 其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...
- csv文件批量导入数据到sqlite。
csv文件批量导入数据到sqlite. 代码: f = web.input(bs_switch = {}) # bs_switch 为from表单file字段的namedata =[i.split( ...
- 使用python向Redis批量导入数据
1.使用pipeline进行批量导入数据.包含先使用rpush插入数据,然后使用expire改动过期时间 class Redis_Handler(Handler): def connect(self) ...
- SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法
原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkC ...
- Cassandra使用pycassa批量导入数据
本周接手了一个Cassandra系统的维护工作,有一项是需要将应用方的数据导入我们维护的Cassandra集群,并且为应用方提供HTTP的方式访问服务.这是我第一次接触KV系统,原来只是走马观花似的看 ...
- Redis批量导入数据的方法
有时候,我们需要给redis库中插入大量的数据,如做性能测试前的准备数据.遇到这种情况时,偶尔可能也会懵逼一下,这里就给大家介绍一个批量导入数据的方法. 先准备一个redis protocol的文件( ...
- 项目总结04:SQL批量导入数据:将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库
将具有多表关联的Excel数据,通过sql语句脚本的形式,导入到数据库 写在前面:本文用的语言是java:数据库是MySql: 需求:在实际项目中,经常会被客户要求,做批量导入数据:一般的简单的单表数 ...
- 批量导入数据到mssql数据库的
概述 批量导入数据到数据库中,我们有好几种方式. 从一个数据表里生成数据脚本,到另一个数据库里执行脚本 从EXCEL里导入数据 上面两种方式,导入的数据都会生成大量的日志.如果批量导入5W条数据到数据 ...
随机推荐
- Cloud Foundry技术全貌及核心组件分析
原文链接:http://www.programmer.com.cn/14472/ 历经一年多的发展,Cloud Foundry的架构设计和实现有了众多改进和优化.为了便于大家了解和深入研究首个开源Pa ...
- Compass(更新中。。。)
compass Compass是Sass的工具库,就好像jQuery是js的库一样. sass有了compass的配合,就会更加事半功倍. Sass本身只是一个编译器,Compass在它的基础上,封装 ...
- 阅读笔记:A Few useful things to Know About machine Learning
这是Machine Learning领域的经典论文,文中提到了ML相关的12个keys,并自称这些keys是“black art”,我觉得有点像ML的“最佳实践”. 网上有此文的中文翻译,写得很详细, ...
- mysql数据库新插入数据,需要立即获取最新插入的id
在MySQL中,使用auto_increment类型的id字段作为表的主键.通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况, ...
- windows dos 常用命令行
有关某个命令的详细信息,请键入 HELP 命令名 dir (directory) :列出当前目录下的文件以及文件夹 md (make directory): 创建目录 rd (remove direc ...
- 删除 Linux /tmp 目录下的临时文件
使用 tmpreaper How to install and use tmpreaper How to Remove Files Older than N days using tmpreaper ...
- 07.Curator计数器
这一篇文章我们将学习使用Curator来实现计数器.顾名思义,计数器是用来计数的,利用ZooKeeper可以实现一个集群共享的计数器.只要使用相同的path就可以得到最新的计数器值,这是由Zo ...
- 170803、springboot jar包启动提示没有主清单属性
问题:SpringBoot打包成jar后运行提示没有主清单属性 解决: 补全maven中的bulid信息 <plugin> <groupId>org.springframewo ...
- HDU_5517_Triple
Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Oracle HA 之 SERVICE和DRM实战
第一部分:service实战 --oracle 11gR2中创建service的方法:db console和srvctl两种方法. --db console创建service方法-略 --srvctl ...