原生sql创建表 并执行 BulkCopy ,重复操作数据会丢失列。 返回

SqlSugar 老数据
31 1456
该叫什么 winyi 发布于2023/2/17
悬赏:5 飞吻

我有个需求是根据导入的excel文件动态创建数据库表并导入数据。后台接口有两个参数,1.要创建的表名称,2.excel文件。

由于excel文件列数不确定,每次调用的时候,我会根据表名称判断表是否存在,如果存在则 drop掉,然后重新创建表再使用BulkCopy 方法批量插入数据,

测试时发现,如果调用接口两次,每次表名相同,excel不同的情况下,第一次成功,第二次创建表成功但插入数据有丢失,做了一个demo可复现:

SqlsugarTest.zip

麻烦看下是不是BulkCopy 的bug。

热忱回答(31)

  • fate sta fate sta VIP0
    2023/2/17

     bulkcopy禁止并行,性能只会更差。

    0 回复
  • winyi winyi VIP0
    2023/2/17

    @fate sta:没有并行啊,最开始是逐条插入,发现性能较差后采用bulkcopy。麻烦运行下demo,能复现问题

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    DEMO执行成功,并没有报错


    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    你 看看是不是逻辑问题 sqlsugar并没有报错

    0 回复
  • winyi winyi VIP0
    2023/2/17

    @fate sta:可能我描述的不清楚,程序不报错,但是,循环两次执行,第一次表结构和数据都没问题,第二次表结构没问题,执行也通过了,但是查看数据库发现表中数据只有一列有数据。

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    @winyi:应该是你逻辑问题


    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    不报错就是成功的

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    数据变少了,好像给删掉了

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    你自个看一下,第二次执行bulkcopy你上面的逻辑把数据清掉了

    0 回复
  • winyi winyi VIP0
    2023/2/17

    @fate sta:调试两天了,这个简单的需求....应该不是逻辑的问题,代码都在for循环里,如果是逻辑问题的话,为何第一次成功第二次失败?

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    在执行bulkcopy前数据就没有了

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    你明了吗,你逻有问题

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

     断点还没有走数据库没有了

    image.png

    0 回复
  • winyi winyi VIP0
    2023/2/17

    @fate sta:是要清数据啊,因为需求就是根据excel结构创建表并导入数据,两次调用传递的excel表结构不同,但是表名称相同,所以我先drop掉表,再创建,再导入

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    第一次bulkcopy插入是 3000多条

    第二次bulkcopy还没执行就0条明白了吗?

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    image.png

    ORM功能数据都对的

    0 回复
  • fate sta fate sta VIP0
    2023/2/17
        Console.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 winyi VIP0
    2023/2/17

    @fate sta:image.png



    第二次,DataTable中是有2个DataRow,并且每一列都有数据,为何执行BulkCopy之后,数据库表中只有一列有数据?



    image.png

    0 回复
  • winyi winyi VIP0
    2023/2/17

    @fate sta:每次循环都是 删除表,创建表,插入数据的过程,第二次循环的时候,表是新创建的,并且DataTable中的数据也是对的。

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    @winyi:你就看我截图就行了,这个错不了的。输出数量和插入数量是对的

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    至于你什么我都不用看,我只要看现有表里面有几条 要插入几条,插入后几条

    0 回复
  • winyi winyi VIP0
    2023/2/17

    @fate sta:大神,数据行数是没问题,但是列有问题啊

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    字段名是不是多了一个下划线

    0 回复
  • winyi winyi VIP0
    2023/2/17

    @fate sta:字段名是excel的列名转拼音,因为列名有可能数字开头,所以前面加了下划线,但是不影响创建表,而且这两个excel导入顺序不管怎么变,都是第一次成功,第二次无数据。

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    @winyi:我研究一下 ,确实只有一列数据

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

     _db.Fastest<System.Data.DataTable>().AS(tableName).RemoveDataCache().BulkCopy(dataTable);


    我知道了你表列变了

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    @fate sta:有问题一会我发布个版本吧

    0 回复
  • winyi winyi VIP0
    2023/2/17

    @fate sta:嗯嗯,感谢大佬~~

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    @winyi:更新到最新预览版本已修复

    0 回复
  • fate sta fate sta VIP0
    2023/2/17

    51 previeww08

    0 回复
  • winyi winyi VIP0
    2023/2/17

    @fate sta:已测试,没问题了,感谢~

    0 回复