C#中如何编写通用方法处理数值与可空数值类型适配SQL插入
问题分析
你现有编写的代码存在几个潜在风险,会导致生产环境出现故障:
- 泛型参数T与输入参数object类型脱节,调用时需要手动指定T,若T与实际传入的obj类型不匹配会出现逻辑错误甚至运行时异常
- 非可空数值类型的0值没有被识别处理,会直接返回"0"而非预期的"NULL",不符合需求
- 采用字符串比较判断是否为0的逻辑不可靠,例如decimal类型的0值ToString结果可能是"0.00",无法匹配"0"的判断条件
- 无输入类型校验,若传入非数值类型参数会产生不符合预期的结果
优化后实现代码
public string GetNumericForSQL<T>(T value, string textIfZero = "NULL") { // 处理null情况 if (value == null) { return textIfZero; } // 校验输入是否为数值类型 Type actualType = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); if (!actualType.IsPrimitive && actualType != typeof(decimal)) { throw new ArgumentException("仅支持数值类型(含可空数值类型)作为参数"); } // 统一转decimal判断是否为0,避免字符串比较的精度/格式问题 decimal numericValue = Convert.ToDecimal(value); if (numericValue == 0) { return textIfZero; } // 返回原始值的字符串形式,保留原有精度/格式 return value.ToString(); }
支持类型说明
完全覆盖你提到的所有数值类型,同时支持其他C#常见数值类型:
- 整数类型:
int/int?、short/short?、long/long?、byte/byte? - 浮点类型:
float/float?、double/double? - 高精度类型:
decimal/decimal?
调用示例
- 输入
GetNumericForSQL(0)→ 输出NULL - 输入
GetNumericForSQL((int?)null)→ 输出NULL - 输入
GetNumericForSQL(1024)→ 输出1024 - 输入
GetNumericForSQL(3.1415d)→ 输出3.1415 - 输入
GetNumericForSQL(0.000m)→ 输出NULL
注意事项
该方法仅用于处理数值类型参数生成SQL拼接值,字符串、日期等其他类型不要使用该方法,生产环境使用前建议补充对应业务场景的单元测试覆盖边界情况。
内容的提问来源于stack exchange,提问作者MSBI-Geek
相关产品推荐
相关产品推荐

