使用Dapper的通用参数化SQL查询

4
我正在使用这个通用方法:
protected IEnumerable<T> ExecuteSprocQuery<T>(string sproc, object objectParams)
{
    using (var conn = OpenConnection())
    {
    var list = conn.Query<T>(sproc, null, commandType: CommandType.StoredProcedure);
    return list;
    }
}

要像这样调用存储过程:

ExecuteSprocQuery<SomePoco>("SomeSproc", new { P1 = p1, P2 = p2 }).ToList().FirstOrDefault();

我正在尝试为参数化SQL查询实现类似的功能:

protected IEnumerable<T> ExecuteQuery<T>(string sqlString, object objectParams)
{
    using (var conn = OpenConnection())
    {
    var list = conn.Query<T>(sqlString, null, commandType: CommandType.Text);
    return list;
    }
}

但是像这样的东西会抛出一个错误:
ExecuteQuery<int?>("Select id from [dbo].[TableName] where [X] = @x ", new { @x  = 1}).FirstOrDefault();

有什么想法吗?

PS:

错误信息为:

Additional information: Must declare the scalar variable "@x".

尝试将@x替换为x - Tim Schmelter
2
您没有将 objectParams 传递到 Query 调用中。这是一个打字错误吗? - juharr
1个回答

4

看起来你从未在方法中向Query()传递params对象。没有存储过程的代码很难确定,但它可能会接受null作为参数,因此不会失败,而原始SQL则很可能会崩溃。

var list = conn.Query<T>(sproc, objectParams, commandType: CommandType.StoredProcedure);

var list = conn.Query<T>(sqlString, objectParams, commandType: CommandType.Text);

谢谢。毕竟今天是星期一 (-: - cs0815

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接