Sqlsuger批量插入或更新报错 返回

SqlSugar
15 140
该叫什么 🐾 发布于6天前
悬赏:0 飞吻

当我使用sqlsuger 进行批量更新的时候会报错,提示update必须要where条件



var x = db.Storageable<T>(t).As(TableName).WhereColumns(WhereColumns).ToStorage();

            int I = x.AsInsertable.ExecuteCommand(); //执行插入

            int U = x.AsUpdateable.ExecuteCommand(); //再此行报错


热忱回答15

  •  按模版提供完整用例 https://www.donet5.com/Home/Doc?typeId=2366

    0 回复
  • 🐾 🐾 VIP0
    6天前

    @fate sta:我修改了一下实现方法,现在进行批量插入的时候报错提示必须要有where条件,我传入的参数是个t是个list出现这种问题的原因是因为我写法的错误吗。但我是按照官方示例写的啊。

    0 回复
  • 🐾 🐾 VIP0
    6天前

    image.png

    0 回复
  • 写个DEMO自个验证一下,有问题发我, 因为上面的功能是稳定功能,你问了我这边也没办法给你重现

    0 回复
  • 🐾 🐾 VIP0
    6天前

    @fate sta:我找到问题所在了,如果数据库内主键是字符串类型的话就会出现这种情况

    demo需要我发给你吗

    0 回复
  • @🐾: 610262374@qq.com 

    0 回复
  • 🐾 🐾 VIP0
    6天前

    @fate stay night:发给你了


    0 回复
  • @🐾:我这边测试没问题

    0 回复
  • ---------

    0 回复
  • ----------

    0 回复
  • --------------

    0 回复
  •              db.Aop.OnExecutingChangeSql = (sql, pars) => //SQL执行前 可以修改SQL

                        {

                           if (sql.TrimStart().IndexOf("update ", StringComparison.CurrentCultureIgnoreCase) == 0)

                            {

                                if (sql.IndexOf("where", StringComparison.CurrentCultureIgnoreCase) <= 0)

                                {

                                    throw new Exception("update更新方法需要有where条件!!");

                                }

                            }


                            return new KeyValuePair<string, SugarParameter[]>(sql, pars);

                        };

    找到原因了你自写的AOP有问题

    0 回复
  • UPDATE S SET S.[id]=T.[id],S.[goodscount]=T.[goodscount],S.[goodsprice]=T.[goodsprice],S.[goodsname]=T.[goodsname] FROM [goods] S    INNER JOIN             (
                  
     SELECT N'0' AS [id],N'F005' AS [goodsno],N'测试sqlsuger' AS [goodsspec],N'1' AS [goodscount],N'309' AS [goodsprice],N'5' AS [goodsname]		
    UNION ALL 
     SELECT N'0' AS [id],N'F006' AS [goodsno],N'测试sqlsuger' AS [goodsspec],N'1' AS [goodscount],N'309' AS [goodsprice],N'6' AS [goodsname]		
    UNION ALL 
     SELECT N'0' AS [id],N'F007' AS [goodsno],N'测试sqlsuger' AS [goodsspec],N'1' AS [goodscount],N'309' AS [goodsprice],N'7' AS [goodsname]
    
    
                ) T ON S.[goodsno]=T.[goodsno] AND S.[goodsspec]=T.[goodsspec]
                    ;

    ORM生成的SQL没有WHERE ET 用的是联表 ON , 所你的 AOP扔出错误, 正确的是验证是否有 ON或者有 WHERE

    0 回复
  •            var x = db.Storageable<T>(t).As(TableName).WhereColumns(WhereColumns).ToStorage();
                int I = x.AsInsertable .ExecuteCommand(); //执行插入
                int U = x.AsUpdateable .ExecuteCommand();

    代码你也可以简化一下

    0 回复
  • 🐾 🐾 VIP0
    5天前

    @fate sta:好的,谢谢给您添麻烦了。


    0 回复