You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:25:38