原生sql创建表 并执行 BulkCopy ,重复操作数据会丢失列。 返回
winyi 发布于2023/2/17
我有个需求是根据导入的excel文件动态创建数据库表并导入数据。后台接口有两个参数,1.要创建的表名称,2.excel文件。
由于excel文件列数不确定,每次调用的时候,我会根据表名称判断表是否存在,如果存在则 drop掉,然后重新创建表再使用BulkCopy 方法批量插入数据,
测试时发现,如果调用接口两次,每次表名相同,excel不同的情况下,第一次成功,第二次创建表成功但插入数据有丢失,做了一个demo可复现:
麻烦看下是不是BulkCopy 的bug。
热忱回答(31)
-
fate sta VIP0
2023/2/17bulkcopy禁止并行,性能只会更差。
0 回复 -
winyi VIP0
2023/2/17@fate sta:没有并行啊,最开始是逐条插入,发现性能较差后采用bulkcopy。麻烦运行下demo,能复现问题
0 回复 -
fate sta VIP0
2023/2/17DEMO执行成功,并没有报错
0 回复 -
fate sta VIP0
2023/2/17你 看看是不是逻辑问题 sqlsugar并没有报错
0 回复 -
winyi VIP0
2023/2/17@fate sta:可能我描述的不清楚,程序不报错,但是,循环两次执行,第一次表结构和数据都没问题,第二次表结构没问题,执行也通过了,但是查看数据库发现表中数据只有一列有数据。
0 回复 -
fate sta VIP0
2023/2/17@winyi:应该是你逻辑问题
0 回复 -
fate sta VIP0
2023/2/17不报错就是成功的
0 回复 -
fate sta VIP0
2023/2/17数据变少了,好像给删掉了
0 回复 -
fate sta VIP0
2023/2/17你自个看一下,第二次执行bulkcopy你上面的逻辑把数据清掉了
0 回复 -
winyi VIP0
2023/2/17@fate sta:调试两天了,这个简单的需求....应该不是逻辑的问题,代码都在for循环里,如果是逻辑问题的话,为何第一次成功第二次失败?
0 回复 -
fate sta VIP0
2023/2/17在执行bulkcopy前数据就没有了
0 回复 -
fate sta VIP0
2023/2/17你明了吗,你逻有问题
0 回复 -
fate sta VIP0
2023/2/17断点还没有走数据库没有了
0 回复 -
winyi VIP0
2023/2/17@fate sta:是要清数据啊,因为需求就是根据excel结构创建表并导入数据,两次调用传递的excel表结构不同,但是表名称相同,所以我先drop掉表,再创建,再导入
0 回复 -
fate sta VIP0
2023/2/17第一次bulkcopy插入是 3000多条
第二次bulkcopy还没执行就0条明白了吗?
0 回复 -
fate sta VIP0
2023/2/17
ORM功能数据都对的
0 回复 -
fate sta VIP0
2023/2/17Console.WriteLine("bulk前"+_db.Queryable<object>().AS(tableName).Count()+",这次插入"+ dataTable.Rows.Count); _db.Fastest<System.Data.DataTable>().AS(tableName).BulkCopy(dataTable); Console.WriteLine("bulk后"+_db.Queryable<object>().AS(tableName).Count());0 回复 -
winyi VIP0
2023/2/17@fate sta:

第二次,DataTable中是有2个DataRow,并且每一列都有数据,为何执行BulkCopy之后,数据库表中只有一列有数据?
0 回复 -
winyi VIP0
2023/2/17@fate sta:每次循环都是 删除表,创建表,插入数据的过程,第二次循环的时候,表是新创建的,并且DataTable中的数据也是对的。
0 回复 -
fate sta VIP0
2023/2/17@winyi:你就看我截图就行了,这个错不了的。输出数量和插入数量是对的
0 回复 -
fate sta VIP0
2023/2/17至于你什么我都不用看,我只要看现有表里面有几条 要插入几条,插入后几条
0 回复 -
winyi VIP0
2023/2/17@fate sta:大神,数据行数是没问题,但是列有问题啊
0 回复 -
fate sta VIP0
2023/2/17字段名是不是多了一个下划线
0 回复 -
winyi VIP0
2023/2/17@fate sta:字段名是excel的列名转拼音,因为列名有可能数字开头,所以前面加了下划线,但是不影响创建表,而且这两个excel导入顺序不管怎么变,都是第一次成功,第二次无数据。
0 回复 -
fate sta VIP0
2023/2/17@winyi:我研究一下 ,确实只有一列数据
0 回复 -
fate sta VIP0
2023/2/17_db.Fastest<System.Data.DataTable>().AS(tableName).RemoveDataCache().BulkCopy(dataTable);
我知道了你表列变了
0 回复 -
fate sta VIP0
2023/2/17@fate sta:有问题一会我发布个版本吧
0 回复 -
winyi VIP0
2023/2/17@fate sta:嗯嗯,感谢大佬~~
0 回复 -
fate sta VIP0
2023/2/17@winyi:更新到最新预览版本已修复
0 回复 -
fate sta VIP0
2023/2/1751 previeww08
0 回复 -
winyi VIP0
2023/2/17@fate sta:已测试,没问题了,感谢~
0 回复