C# 平时碰见的问题【1】
1. SqlBulkCopy
可以利用这个类实现快速大批量新增数据的效果, 但在使用过程中发现了一个问题: 无法将数据源中的DateTime类型转换成数据库中的int类型
看起来就是数据列不对应导致的, 不过一开始也不确定,后面试验确定 SqlBulkCopy 自建的DataTable数据源writeToServer在未添加列与列的映射(ColumnMappings)时候即使列名一致 也并不是按列名写入数据的,而是按列的索引进行添加的.
故解决方法有二个:
(1) 在自建的数据源DataTable中补充前面的列 (若列处于需要添加的字段后面 则不用);
(2) SqlBulkCopy 列映射集合中添加 sqlBulkCopy.ColumnMappings.Add(sourceColumn, destinationColumn); 将每列与目标数据库中的表关联;
代码如下:
public bool BulkAddData(string recordsString)
{
string[] records = recordsString.Split('$');
bool boolIsSuccess = false;
DataTable dtTemp = new DataTable();
dtTemp.Columns.Add(new DataColumn("ID", typeof(int))); //(1)ID在目标表中是自增列,并且是第一列
dtTemp.Columns.Add(new DataColumn("ScanUserID", typeof(int)));
dtTemp.Columns.Add(new DataColumn("ScanDate", typeof(DateTime)));
dtTemp.Columns.Add(new DataColumn("PO", typeof(string)));
dtTemp.Columns.Add(new DataColumn("SerialNumber", typeof(string)));
dtTemp.Columns.Add(new DataColumn("Container", typeof(string)));
dtTemp.Columns.Add(new DataColumn("ModelName", typeof(string)));
dtTemp.Columns.Add(new DataColumn("ModelID", typeof(int))); foreach (string record in records)
{
DataRow dr = dtTemp.NewRow();
string[] strModel = record.Split(',');
if (strModel.Length == )
{
// ID是自增列,不用赋值
dr["ScanUserID"] = int.Parse(strModel[]);
dr["ScanDate"] = DateTime.Parse(strModel[]);
dr["PO"] = strModel[];
dr["SerialNumber"] = strModel[];
dr["Container"] = strModel[];
dr["ModelName"] = strModel[];
dr["ModelID"] = int.Parse(strModel[]);
}
dtTemp.Rows.Add(dr);
}
string strConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString.ToString();
using (SqlConnection conn = new SqlConnection(strConnectionString))
{
conn.Open();
SqlTransaction tran = conn.BeginTransaction();
SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran);
sqlBulkCopy.DestinationTableName = "T_DeliveryRecord";
sqlBulkCopy.BatchSize = dtTemp.Rows.Count;
//(2) SqlBulkCopy 的表映射默认是按索引来和目标表对应的, 可通过以下方法强制对应
//sqlBulkCopy.ColumnMappings.Add("ScanUserID", "ScanUserID");
//sqlBulkCopy.ColumnMappings.Add("ScanDate", "ScanDate");
//sqlBulkCopy.ColumnMappings.Add("PO", "PO");
//sqlBulkCopy.ColumnMappings.Add("SerialNumber", "SerialNumber");
//sqlBulkCopy.ColumnMappings.Add("Container", "Container");
//sqlBulkCopy.ColumnMappings.Add("ModelName", "ModelName");
//sqlBulkCopy.ColumnMappings.Add("ModelID", "ModelID"); try
{
sqlBulkCopy.WriteToServer(dtTemp);
tran.Commit();
boolIsSuccess = true;
}
catch
{
tran.Rollback();
boolIsSuccess = false;
}
finally
{
sqlBulkCopy.Close();
}
} return boolIsSuccess;
}
ID是我的主键自增的列,位于表的第一位, 所以dtTemp中没有ID列的时候 ScanDate的数据 将插入数据库中的ScanUserID这个int类型的字段中出现上面提到的类型错误; 也就是列的不对应;
所以用方法(1) 解决本问题时, 临时数据表的字段名及顺序需要与目标表一致, 有默认值或者自增的字段不需要赋值; 当然这种情况的列只是作为占位,字段名不用对应也可以:如上面的dtTemp.Columns.Add(new DataColumn("ID", typeof(int))) 改成 dtTemp.Columns.Add(new DataColumn("AA", typeof(int))) 一样也是可以的 );
attention: 注意如果给自增列赋值且SqlBulkCopyOptions.KeepIdentity 将导致目标表该自增列的自增失效;
C# 平时碰见的问题【1】的更多相关文章
- C# 平时碰见的问题【6】
EF Code First 设置复合主键的方法 除了单纯多对多的关系表外, 我们可能在关系表上加其他的属性: 比如[订单行] 对应的[订单]和[商品]就需要多一个数量字段 而又不想在这个[订单行]表上 ...
- C# 平时碰见的问题【5】
vs按F5启动调试,项目不会编译的解决办法 工具 -> 选项 -> 项目和解决方案 -> 运行时, 当项目过期(下拉框) -> 不要选[从不生成] 附英文版的:
- C# 平时碰见的问题【4】
1. 模糊查询 like的参数化写法 string keyword="value"; // 要模糊匹配的值 错误示范: sql: string strSql=" ...
- C# 平时碰见的问题【3】
今天发现一个问题纳闷了半个小时, 需求是处理project文件里边的数据内容,其中需要判断任务名称不存在重复; 在测试的时候弄了两行一样的任务,如预想: 任务[xxx]重复 然后删掉重复的任务行,继续 ...
- C# 平时碰见的问题【2】
问题1 修改命名空间后 .ashx 类型创建失败 [情景] 在调整前后台项目结构的时候,修改了默认命名空间(XXX.Admin 修改成XXX.Web),结果调试的时候发现XXX.Admin.Ajax. ...
- Android使用静默安装时碰见的问题
升级时碰见的异常 private void installPackage(String appName,final File apk) { if (!apk.exists()) { setHasNew ...
- 使用karma测试平时写的小demo(arguments为例)
有人说前端自动化测试非常困难,我觉得确实如此.在项目中,我个人也不放心写的测试,还是要手动测试.但是我们平时写demo学习时,完全可以使用自动化测试. 传统demo 1,新建一个html 2,写入js ...
- CSS3动画几个平时没注意的属性
一.timing-function: steps() 一开始在使用CSS3的时候并没有太注意这个timing-function,只是注意到自定义贝塞尔曲线. 1)一个项目中的实例 先来看看左边加了st ...
- 这些HTML、CSS知识点,面试和平时开发都需要 No1-No4
系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...
随机推荐
- 使用eclipse集成开发环境开发第一个嵌入式Linux驱动
转载学习 http://blog.csdn.net/cp1300/article/details/8266806
- java枚举使用
1.开发中如何使用枚举,一般在开发中使用消息提示.枚举可以继承,实现接口等.public enum Result { SUCCESS(1,"201 ok") { @Override ...
- Socket网络编程例子
1.为了安全的进行通信,基于ACK确认机制----重传机制 使用selector机制的多路复用的IO通信机制,此外还有epoll控制 业务挂接点或者接入点: 常见的接入点: RDBMS进行CRUD M ...
- cocos2d-x 中 TTF 字体文件的位置
cocos2d-x 中,字体文件需要保存在 fonts 文件夹中,如果字体路径中没有 fonts/ 会自动添加上这个文件夹. 如果字体名称没有 .ttf 后缀,也会自动加上这个后缀. unsigned ...
- Android 媒体键监听以及模拟媒体键盘的实现 demo
有时我们需要程序模拟按钮或点击,而手机本身又没有,哪么可以采取其它方式 模拟实现,最后再去实际设备去测试(前期一般都拿不到设备): 如上一首,下一首,暂停等,手机上是没有的,但有些设备上是有的,所以我 ...
- github添加ssh认证
总概:在使用git的时候,和目标仓库建立关系有两种方式https,ssh.一般用的是https认证(这样简单方便),但有个缺点,pull,push等操作需要频繁输入用户验证.虽然可以把用户验证账号密码 ...
- 学习总结 vs软件简单了解
using System;using System.Collections.Generic;using System.Linq;using System.Text;//调用命名空间 using Sys ...
- ubuntu解压zip文件乱码问题
我的zip文件里的内容是有中文名,也有密码,在网上找到几种解决办法只有一种可以,所以在这里记录一下: 首先是安装7zip来解压,7zip的解决办法在这里,但是无法解决我的问题,仍然有乱码问题 最后是在 ...
- 几款超实用的 CSS 开发工具
当你开发一个网站或 web 应用程序的时候,有合适的工具,绝对可以帮助您节省大量的时间.在这篇文章中,我为大家收集了超有用的 CSS 开发工具. 对于 Web 开发人员来说,找到有用的 css 开 ...
- select,poll,epoll的归纳总结区分
Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...