编写通用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
相关产品推荐
相关产品推荐

