C#中SQL数据类型转换代码优化及高效数据处理咨询
优化SQL数据转换逻辑的几种方案
1. 封装通用扩展方法,简化类型转换与DBNull处理
把重复的DBNull检查、类型转换逻辑封装成DataRow的扩展方法,避免代码冗余:
public static class DataRowExtensions { // 获取double类型值,为空则返回默认值 public static double GetDoubleOrDefault(this DataRow row, string columnName, double defaultValue = 0) { if (row.IsNull(columnName)) return defaultValue; return Convert.ToDouble(row[columnName]); } // 可扩展其他类型的处理方法,比如int、decimal public static int GetIntOrDefault(this DataRow row, string columnName, int defaultValue = 0) { if (row.IsNull(columnName)) return defaultValue; return Convert.ToInt32(row[columnName]); } }
优化后的示例代码:
double sum = 0; foreach (DataRow row in sampleDataTable.Rows) { double value1 = row.GetDoubleOrDefault("value1"); double value2 = row.GetDoubleOrDefault("value2"); // 增加除零判断避免异常 if (value2 != 0) { sum += (double)Global.Calculate(value1 / value2, 2); } }
2. 映射为强类型实体类
将DataTable数据转换为自定义的强类型实体,提升代码可读性和可维护性:
定义实体类
public class SampleData { public double Value1 { get; set; } public double Value2 { get; set; } }
转换与处理
// 将DataTable转换为实体集合 List<SampleData> sampleList = sampleDataTable.AsEnumerable() .Select(row => new SampleData { Value1 = row.GetDoubleOrDefault("value1"), Value2 = row.GetDoubleOrDefault("value2") }) .ToList(); // 后续业务处理 double sum = 0; foreach (var data in sampleList) { if (data.Value2 != 0) { sum += (double)Global.Calculate(data.Value1 / data.Value2, 2); } }
如果项目规模较大,还可以用AutoMapper这类工具自动完成映射,进一步减少手动代码。
3. 替换DataTable为ORM框架(从根源解决问题)
直接使用ORM框架(如Dapper、EF Core)从数据库查询时返回强类型对象,彻底避免object类型的繁琐处理:
Dapper示例
// 假设已建立数据库连接conn string sql = "SELECT value1, value2 FROM YourTargetTable"; List<SampleData> sampleList = conn.Query<SampleData>(sql).ToList(); double sum = 0; foreach (var data in sampleList) { if (data.Value2 != 0) { sum += (double)Global.Calculate(data.Value1 / data.Value2, 2); } }
ORM框架会自动处理DBNull映射(转为对应类型的默认值)和类型转换,无需手动编写检查逻辑。
额外优化:封装Calculate的类型转换
如果Global.Calculate的返回值始终需要转为double,可以封装一个包装函数简化代码:
public static double CalculateDouble(double input, int param) { return (double)Global.Calculate(input, param); }
后续使用时直接调用CalculateDouble,省去每次强制转换的代码。
内容的提问来源于stack exchange,提问作者user19435153
相关产品推荐
相关产品推荐

