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

SqlSugarCore 版本:5.1.4.170
数据库:SqlServer
当 CultureInfo.CurrentUICulture 为越南语(vi)时,执行 Updateable(集合).ExecuteComand() 时,生成的 Sql 中小数的小数点值为逗号,会提示“从数据类型 varchar 转换为 numeric 时出错”
如截图所示,10.000000 输出为 10,000000
热忱回答(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 没有可以调整的切入点,我暂时的做法先这样处理一下
希望作者大大能放出个切入点让我可以自定义格式化,谢谢
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 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();
-------------------------------------------
0 回复