多语言(越南语)SqlServer 数据库更新decimal类型小数点变逗号 返回

SqlSugar 待处理
5 210

SqlSugarCore 版本:5.1.4.170

数据库:SqlServer


当 CultureInfo.CurrentUICulture 为越南语(vi)时,执行 Updateable(集合).ExecuteComand() 时,生成的 Sql 中小数的小数点值为逗号,会提示“从数据类型 varchar 转换为 numeric 时出错”

如截图所示,10.000000 输出为 10,000000



image.png

image.png


热忱回答5

  • 写意 写意 VIP0
    1个月前

    这个问题的场景是:

    1、前端可以切换中(zh-cn)、英(en)、越南(vi),请求时 http header 加上 Accept-Language: vi

    2、SqlServer数据库和后端服务都在同一台服务器,默认语言区域都是 zh-cn,中、英文执行 Updateable(集合).ExecuteComand(),没有问题

    3、当切换为越南语,小数分隔符 SqlServer 无法识别,因为SqlServer默认的语言区域是 zh-cn


    代码中 UtilMethods.IsErrorDecimalString() 也无法支持切换线程语言区域的情况,缓存了第一次判断是否转换出错

    InsertBuilder 和 UpdateBuilder 的 FormatValue 没有可以调整的切入点,我暂时的做法先这样处理一下


    希望作者大大能放出个切入点让我可以自定义格式化,谢谢

    image.png

    image.png

    0 回复
  • 写意 写意 VIP0
    1个月前

    最终从下面的地方进行拦截替换处理



            db.Aop.OnExecutingChangeSql = (sql, pars) =>

            {

                // 当前语言的小数分隔符为逗号

                if (CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator == ",")

                {

                    // 匹配小数分隔符为逗号的数字和百分比

                    const string pattern = @"\'-?(\d+?(\.\d{3})*)(,\d+)?%?\'";

                    sql = Regex.Replace(sql, pattern, match =>

                    {

                        var arr = match.Value.Split(",");

                        // 分离整数部分和小数部分

                        string integerPart = arr[0];

                        string decimalPart = arr.Length == 2 ? arr[1] : "";


                        // 去掉整数部分中的千位分隔符(句号)

                        integerPart = integerPart.Replace(".", "");


                        // 组合整数部分和小数部分

                        return string.IsNullOrEmpty(decimalPart) ? integerPart : (integerPart + "." + decimalPart);

                    });  

                }


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

            };


    0 回复
  • fate sta fate sta VIP0
    1个月前

    SqlSugarCore 5.1.4.173-preview10


    更新到预览版本已修复

    0 回复
  • 写意 写意 VIP0
    1个月前

    谢谢大佬,晚点试试

    0 回复
  • 写意 写意 VIP0
    1个月前

    5.1.4.174-preview01,这个版本 insert 也有问题,float,double 的 insert 和 update 不知道需不需要也处理一下

    -------------------------------------------

    INSERT [StkTaskEntry]  ([EntryStatus],[MaterialId],[BatchNo],[ProduceDate],[ExpiryDate],[SrcWhAreaId],[SrcWhLocId],[SrcContainerId],[DestWhAreaId],[DestWhLocId],[DestContainerId],[Qty],[ExecQty],[RemainExecQty],[UnitId],[OwnerId],[GrossWeight],[PackingVolume],[PackingQty],[SrcBillEntrySeq],[SrcBillEntryId],[IsAllowLocReplace],[IsAllowBatchNoReplace],[RelLockInvId],[RelPreInInvId],[ManualCloseTime],[ManualCloseUserId],[ManualCloseUserName],[EntryMemo],[UsedRuleNumber],[UsedRuleName],[LockQty],[ReleaseLockQty],[EntryId],[Id],[Seq])

     SELECT N'0' AS [EntryStatus],N'609470272905285' AS [MaterialId],NULL AS [BatchNo],NULL AS [ProduceDate],NULL AS [ExpiryDate],NULL AS [SrcWhAreaId],NULL AS [SrcWhLocId],NULL AS [SrcContainerId],N'609469463302213' AS [DestWhAreaId],N'609469463576645' AS [DestWhLocId],NULL AS [DestContainerId],N'200,000000' AS [Qty],N'0' AS [ExecQty],N'200,000000' AS [RemainExecQty],N'609466429571141' AS [UnitId],N'609469142331461' AS [OwnerId],N'0,000000000000' AS [GrossWeight],N'0,000000000000' AS [PackingVolume],N'30000' AS [PackingQty],N'1' AS [SrcBillEntrySeq],N'633164339413062' AS [SrcBillEntryId],1 AS [IsAllowLocReplace],1 AS [IsAllowBatchNoReplace],NULL AS [RelLockInvId],N'633192498057285' AS [RelPreInInvId],NULL AS [ManualCloseTime],NULL AS [ManualCloseUserId],NULL AS [ManualCloseUserName],NULL AS [EntryMemo],N'SCHLL' AS [UsedRuleNumber],N'分配' AS [UsedRuleName],N'0' AS [LockQty],N'0' AS [ReleaseLockQty],N'633192502403141' AS [EntryId],N'633192491282501' AS [Id],N'1' AS [Seq]

    UNION ALL

     SELECT N'0' AS [EntryStatus],N'609496994644037' AS [MaterialId],NULL AS [BatchNo],NULL AS [ProduceDate],NULL AS [ExpiryDate],NULL AS [SrcWhAreaId],NULL AS [SrcWhLocId],NULL AS [SrcContainerId],N'609469463302213' AS [DestWhAreaId],N'609469463576645' AS [DestWhLocId],NULL AS [DestContainerId],N'100,000000' AS [Qty],N'0' AS [ExecQty],N'100,000000' AS [RemainExecQty],N'609466429571141' AS [UnitId],N'609469142331461' AS [OwnerId],N'0,000000000000' AS [GrossWeight],N'0,000000000000' AS [PackingVolume],N'0' AS [PackingQty],N'4' AS [SrcBillEntrySeq],N'633164340006981' AS [SrcBillEntryId],1 AS [IsAllowLocReplace],1 AS [IsAllowBatchNoReplace],NULL AS [RelLockInvId],N'633192501125189' AS [RelPreInInvId],NULL AS [ManualCloseTime],NULL AS [ManualCloseUserId],NULL AS [ManualCloseUserName],NULL AS [EntryMemo],N'SCHLL' AS [UsedRuleNumber],N'分配' AS [UsedRuleName],N'0' AS [LockQty],N'0' AS [ReleaseLockQty],N'633192502403142' AS [EntryId],N'633192491282501' AS [Id],N'2' AS [Seq]

    ;

    select SCOPE_IDENTITY();

    -------------------------------------------

    image.png

    0 回复