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

编写通用Dapper服务实现数据库连接与SQL表数据读取

修正后的通用Dapper表数据读取方法

你的代码存在几个关键问题,导致无法正常运行,以下是修正后的完整实现:

public class DapperService : IDapperService
{        
    private readonly string _dbConnectionString;

    public DapperService(IOptions<ProjectSettings> config)
    {
        _dbConnectionString = config.Value.DbConnection;
    }

    // 异步方法返回类型需改为Task<List<T>>
    public async Task<List<T>> GetTableData<T>(string tableName, CommandType commandType = CommandType.Text)
    {
        // 安全验证表名,避免SQL注入风险(基础验证,可根据需求扩展)
        if (string.IsNullOrWhiteSpace(tableName) || tableName.Contains(";") || tableName.Contains("--"))
        {
            throw new ArgumentException("无效的表名");
        }

        // 构造安全的查询语句,用方括号包裹表名避免关键字冲突
        string sql = $"SELECT * FROM [{tableName}]";

        using IDbConnection db = new SqlConnection(_dbConnectionString);
        // 正确传入SQL语句、命令类型,转换为列表返回
        var result = await db.QueryAsync<T>(sql, commandType: commandType);
        return result.ToList();
    }
}

关键修正说明:

  • 方法签名修正:异步方法必须返回Task<T>类型,因此将返回值从async List<T>改为async Task<List<T>>,同时添加泛型参数<T>指定返回的实体类型。
  • SQL语句补充:QueryAsync需要具体查询逻辑,这里构造SELECT * FROM [表名]语句,用方括号包裹表名避免与SQL关键字冲突。
  • 参数拼写修正:原代码中commondaType是拼写错误,改为正确的commandType。
  • 异步逻辑修正:QueryAsync返回Task<IEnumerable<T>>,需先await获取结果,再调用ToList()转换为List<T>。
  • 注入防护:添加基础表名验证,避免恶意输入导致SQL注入,生产环境可根据数据库类型进一步加强验证。

内容的提问来源于stack exchange,提问作者user14806829

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:15:03