通用参数化的SQL查询与短小精悍 [英] generic parameterised sql query with dapper

查看:246
本文介绍了通用参数化的SQL查询与短小精悍的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用这个泛型方法:

 保护了IEnumerable< T> ExecuteSprocQuery< T>(字符串存储过程,对象objectParams)
{使用(VAR康恩= OpenConnection的())
{
无功名单= conn.Query<
; T>(存储过程,空,命令类型:CommandType.StoredProcedure);
返回列表;
}
}

要调用这样的存储过程:



  ExecuteSprocQuery< SomePoco>(SomeSproc,新的{P1 = P1,P2 = P2})了ToList()FirstOrDefault()。 



我想实现的参数化的SQL查询类似的东西:

 保护了IEnumerable< T>的executeQuery< T>(字符串的SqlString,对象objectParams)
{使用
(VAR康恩= OpenConnection的())
{
无功名单= conn.Query< T>(的SqlString,空,命令类型:CommandType.Text);
返回列表;
}
}



但像这样将引发一个错误:

 的executeQuery<诠释>?(从[DBO] ID [表名],其中[X] = @x,新{ @x = 1})FirstOrDefault(); 



任何想法



PS:<? / p>

该错误是:

 附加信息:必须声明标量变量@X。 


解决方案

看起来你永远不会传递params对象来查询()你的方法里面。如果没有你的SP代码很难说,但它可能会被接受空值作为参数,因此不会失败的,而原始的SQL将最有可能只是崩溃。

  VAR列表= conn.Query< T>(存储过程,objectParams,命令类型:CommandType.StoredProcedure); 

无功名单= conn.Query< T>(的SqlString,objectParams,命令类型:CommandType.Text);


I am using this generic method:

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;
    }
}

to invoke stored procedures like this:

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

I am trying to implement something similar for parameterised sql queries:

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;
    }
}

but something like this throws an error:

ExecuteQuery<int?>("Select id from [dbo].[TableName] where [X] = @x ", new { @x  = 1}).FirstOrDefault();

Any ideas?

PS:

The error is:

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

解决方案

It looks like you are never passing the params object to Query() inside your methods. Without the code for your SP it's hard to tell, but it might be accepting nulls as parameters and thus not failing, while raw SQL will most probably just crash.

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

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

这篇关于通用参数化的SQL查询与短小精悍的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆