用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中加入该列并且给他们赋空值就可以了;最重要的:列次序(也即列序号一定要对应起来)
- 用SqlBulkCopy将数据复制到有自增字段的表中怎么办?结果的顺序不对怎么办?
- 没有id的表,查询结果要求有id怎么办?
- SqlBulkCopy—将数据表一次性复制到指定的数据表中
- 使用SqlBulkCopy类批量复制数据到数据库表中
- Excel做好的图表复制到PPT中变颜色了怎么办
- Oracle数据库中,如何给已有很多数据的表填充自增序列字段
- oracle复制表tabel1,修改某个字段后将修改后的数据追加到tabel1
- 将刚插入的记录的自增Id,插入到另一个字段中
- mysql将一张表中的字段复制到不存在的表中
- 很重要的数据被误删后怎么办
- UTF8编码的文件中有中文怎么办?~
- 自定义变量不能用怎么办,将文件中的数据直接读取到普通变量中
- 对有自增长字段的表导入数据注意事项
- xcode 自带的svn不好用怎么办
- 将一个列表的数据复制到另一个列表中。
- 当你有1000甚至更多字段要更新数据库,怎么办?看我的
- sql语句插入的数据中含有单引号怎么办?
- sql语句插入的数据中含有单引号怎么办?
- Activity的onPause()官方文档翻译
- dm368用的mt9p031 sensor datasheet名词详解
- 编程这几天出现的很2的问题!!!
- Android中外部程序调用方法总结
- USACO 2008 Dec Silver 1.Hay For Sale
- 用SqlBulkCopy将数据复制到有自增字段的表中怎么办?结果的顺序不对怎么办?
- android 外挂字幕接口
- iOS文件操作NSFileManager和NSFileHandle
- ajax跨域三种方案
- Andorid-15k+的面试题
- Cocoapods安装及使用
- new HashMap 发生了什么事情?
- httpclient模拟登陆,不支持https的问题
- c++实现数据结构1.顺序表