用SqlBulkCopy将数据复制到有自增字段的表中怎么办?结果的顺序不对怎么办?

来源:互联网 发布:知远战略研究所招聘 编辑:程序博客网 时间:2024/06/08 01:17

最近做一个项目要向数据库中写入大量数据,考虑到用insert to效率太低了,上网搜索之发现有SqlBulkCopy方法,于是参考了以下几篇文章进行操作

http://blog.csdn.net/cqulyk/article/details/8511207

上面的文章都是将A表中的内容复制到B表中去,可是问题来了,我是想将用户自己生成的数据插入到B表中。

于是想到了自己构造一个DataTable dutyinfoDt然后将dutyinfoDt插入到B表中

于是参考了下面的文章:

http://blog.csdn.net/fenfangnaicha/article/details/1882045

http://blog.csdn.net/maonongwu/article/details/8562483

数据库中B表(也就是要插入数据的表)的定义如下:

然后我就进行操作了

 DataTable dutyinfoDt = new DataTable("DutyInfo");        DataColumn diC1 = new DataColumn("dutyDate", Type.GetType("System.String"));        DataColumn diC2 = new DataColumn("department", Type.GetType("System.String"));        DataColumn diC3 = new DataColumn("dayTime", Type.GetType("System.String"));        DataColumn diC4 = new DataColumn("nightTime", Type.GetType("System.String"));        //dutyinfoDt.Columns.Add(diC0);        dutyinfoDt.Columns.Add(diC1);        dutyinfoDt.Columns.Add(diC2);        dutyinfoDt.Columns.Add(diC3);        dutyinfoDt.Columns.Add(diC4);        for (int i = 0; i < DTI.Length; i++)        {            DataRow dutyinfoDtRow = dutyinfoDt.NewRow();            dutyinfoDtRow["department"] = DTI[i].department;            dutyinfoDtRow["dutyDate"] = DTI[i].dutyDate;            dutyinfoDtRow["dayTime"] = DTI[i].dayTime;            dutyinfoDtRow["nightTime"] = DTI[i].nightTime;            dutyinfoDt.Rows.Add(dutyinfoDtRow);        }
我的XH字段设置的自增,于是我就没有管它,结果就出现了错误

+ 已记录步骤 $exception = {"不能将值 NULL 插入列 'nightTime',表 'DDS.dbo.DutyInfo';列不允许有 Null 值。INSERT 失败。\r\n语句已终止。"}, this = {Duty}, dep = "电务处", days = 3, date = "2015-08-19", names = {string[4]}, ex = {"不能将值 NULL 插入列 'nightTime',表 'DDS.dbo.DutyInfo';列不允许有 Null 值。INSERT 失败。\r\n语句已终止。"}, strSql = {}, groups = {Group[4]}, DTI = {DutyInfo[3]}, dutyinfoDt = {DutyInfo}, diC1 = {department}, diC2 = {dutyDate}, diC3 = {dayTime}, diC4 = {nightTime}, sbc = {System.Data.SqlClient.SqlBulkCopy}, sqlCon = {System.Data.SqlClient.SqlConnection}, sqlCom = {System.Data.SqlClient.SqlCommand}

于是我在上边的代码中加入了

DataColumn diC0 = new DataColumn("XH", Type.GetType("System.Int32"));dutyinfoDt.Columns.Add(diC0);dutyinfoDtRow["XH"] = DTI[i].XH;//<span style="background-color: rgb(255, 0, 0);">由于XH是自增字段,所以我给他们赋空值,注意此处的DTI[i].XH是空值</span>
变成了

DataTable dutyinfoDt = new DataTable("DutyInfo");        DataColumn diC0 = new DataColumn("XH", Type.GetType("System.Int32"));        DataColumn diC1 = new DataColumn("dutyDate", Type.GetType("System.String"));        DataColumn diC2 = new DataColumn("department", Type.GetType("System.String"));        DataColumn diC3 = new DataColumn("dayTime", Type.GetType("System.String"));        DataColumn diC4 = new DataColumn("nightTime", Type.GetType("System.String"));        dutyinfoDt.Columns.Add(diC0);        dutyinfoDt.Columns.Add(diC1);        dutyinfoDt.Columns.Add(diC2);        dutyinfoDt.Columns.Add(diC3);        dutyinfoDt.Columns.Add(diC4);        for (int i = 0; i < DTI.Length; i++)        {            DataRow dutyinfoDtRow = dutyinfoDt.NewRow();            dutyinfoDtRow["XH"] = DTI[i].XH;            dutyinfoDtRow["department"] = DTI[i].department;            dutyinfoDtRow["dutyDate"] = DTI[i].dutyDate;            dutyinfoDtRow["dayTime"] = DTI[i].dayTime;            dutyinfoDtRow["nightTime"] = DTI[i].nightTime;            dutyinfoDt.Rows.Add(dutyinfoDtRow);        }

然后执行,但是得到了如下结果:


也就是depar和dutyDate字段反了,于是我查看调试结果:


我想是不是改变一下列的顺序就可以了呢?

于是我改变了DataTable中列的添加顺序

<span style="white-space:pre"></span>dutyinfoDt.Columns.Add(diC1);        dutyinfoDt.Columns.Add(diC2);
改为
<pre name="code" class="csharp"><span style="white-space:pre"></span>dutyinfoDt.Columns.Add(diC2);        dutyinfoDt.Columns.Add(diC1);
//即先添加部门,后添加日期

结果运行正常了:

//原谅我没有删除错误的数据

综上思考得出结论:将DataTable中的数据写入数据库的B表中时,不是将自己定义的列名和B表中的列名相对应然后将相应的DataTable中的数据插入B中,而是按列的顺序插入的,即:DataTable的列0插入B表的列0,列1插入B表列1,列2插入B表列2,。。。。。;要想使他们的列对应起来就应该调整DataTable中列的次序,让他们与目标表中列的次序相同;如果碰到目标表中有自增字段,可以在DataTable中加入该列并且给他们赋空值就可以了;最重要的:列次序(也即列序号一定要对应起来)

0 0
原创粉丝点击