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】的更多相关文章

  1. C# 平时碰见的问题【6】

    EF Code First 设置复合主键的方法 除了单纯多对多的关系表外, 我们可能在关系表上加其他的属性: 比如[订单行] 对应的[订单]和[商品]就需要多一个数量字段 而又不想在这个[订单行]表上 ...

  2. C# 平时碰见的问题【5】

    vs按F5启动调试,项目不会编译的解决办法 工具 -> 选项 -> 项目和解决方案 -> 运行时, 当项目过期(下拉框) -> 不要选[从不生成] 附英文版的:

  3. C# 平时碰见的问题【4】

    1. 模糊查询 like的参数化写法 string keyword="value"; // 要模糊匹配的值 错误示范:   sql:    string strSql=" ...

  4. C# 平时碰见的问题【3】

    今天发现一个问题纳闷了半个小时, 需求是处理project文件里边的数据内容,其中需要判断任务名称不存在重复; 在测试的时候弄了两行一样的任务,如预想: 任务[xxx]重复 然后删掉重复的任务行,继续 ...

  5. C# 平时碰见的问题【2】

    问题1 修改命名空间后 .ashx 类型创建失败 [情景] 在调整前后台项目结构的时候,修改了默认命名空间(XXX.Admin 修改成XXX.Web),结果调试的时候发现XXX.Admin.Ajax. ...

  6. Android使用静默安装时碰见的问题

    升级时碰见的异常 private void installPackage(String appName,final File apk) { if (!apk.exists()) { setHasNew ...

  7. 使用karma测试平时写的小demo(arguments为例)

    有人说前端自动化测试非常困难,我觉得确实如此.在项目中,我个人也不放心写的测试,还是要手动测试.但是我们平时写demo学习时,完全可以使用自动化测试. 传统demo 1,新建一个html 2,写入js ...

  8. CSS3动画几个平时没注意的属性

    一.timing-function: steps() 一开始在使用CSS3的时候并没有太注意这个timing-function,只是注意到自定义贝塞尔曲线. 1)一个项目中的实例 先来看看左边加了st ...

  9. 这些HTML、CSS知识点,面试和平时开发都需要 No1-No4

    系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...

随机推荐

  1. HTML控件-Select

    从今天开始,编写对于html控件的特性的探索文章,会广泛的引用网络的资源,所以本文的版权属于广大人民群众,欢迎转载,也同样禁止商业应用. [高手勿喷,标签页点击红色叉叉] select控件有一个特性: ...

  2. (Loadrunner)Error: Failed to send data by channels - post message failed.(转)

    把Diagnotics-configure-Web Page Diagnotics 设置为 转自: http://www.51testing.com/html/64/371664-3708254.ht ...

  3. 如何让 Drupal 使用 Wordpress 形式的编辑代码?

    如果你曾有过将 Wordpress 网站迁移到 Drupal 的经验,很可能客户会问的第一件事就是如何为 Drupal 添加编辑代码. Wordpress 中的 Shortcodes 插件让使用者可以 ...

  4. 慕课网-安卓工程师初养成-2-12 如何在Java中使用注释

    来源:http://www.imooc.com/code/1274 在编写程序时,经常需要添加一些注释,用以描述某段代码的作用. 一般来说,对于一份规范的程序源代码而言,注释应该占到源代码的 1/3 ...

  5. VC获取并修改计算机屏幕分辨率(MFC)

    //检测当前分辨率 int Width = GetSystemMetrics(SM_CXSCREEN); int Height = GetSystemMetrics(SM_CYSCREEN); DEV ...

  6. My Rules of Information

    http://www.infotoday.com/searcher/jan02/block.htm I often suggested to students that information is ...

  7. 华为OJ平台——首次不重复字符

    题目描述: 输入一个字符串,输出字符串中第一个没有重复的字符,若没有满足条件的字符存在,则输出“.” 思路: 这题很简单,直接逐次比较就好了,但是没有考虑到更好效率的方法,以后想到的话再加上来 imp ...

  8. JS ​ ZERO WIDTH SPACE

    如上编码 ZERO WIDTH SPACE  在各个语言的表达. JS中使用 var b = a.replace(/\u200B/g,''); 来替换,去掉 ZERO WIDTH SPACE . ht ...

  9. android屏幕基础知识

    首先,先来上一张图,看看android屏幕分辨率的占比情况 什么是dp,dip,dpi,sp.px ?之间的关系是什么? px:构成图像的最小单位 dp/dip:密度无关像素 以160dpi为基准 1 ...

  10. C++: std::string 与 Unicode 结合

    一旦知道 TCHAR 和_T 是如何工作的,那么这个问题很简单.基本思想是 TCHAR 要么是char,要么是 wchar_t,这取决于_UNICODE 的值: // abridged from tc ...