我一直在尝试使用Dapper调用Postgresql存储过程,我见过的每个例子都有相同的东西,但由于某种原因它不适合我。它似乎正在调用存储过程但它永远不会返回任何结果。这是我的代码:
using (PgSqlConnection c = new PgSqlConnection(Configuration.ConnectionString("database_string")))
{
var values = c.Query<TagValue>("get_values", new { _tag = tag, _start = start, _end = end }, commandType: CommandType.StoredProcedure);
}
我不能让它返回任何结果,但它也不会抛出任何错误。请帮助至少指出我的方向看。如果我使用如下字符串运行查询:
values = c.Query<TagValue>(string.Format(@"select * from get_values('{0}', '{1}', '{2}');", tag, start, end));
它正常工作并返回正确的结果。
答案 0 :(得分:1)
这就是我使用Dapper调用存储过程的方法
public class Parameters : DynamicParameters
{
public new void Add(string name, object value = null, DbType? dbType = null, ParameterDirection? direction = null, int? size = null)
{
if (dbType == null && value is string)
{
if (size == null)
{
dbType = DbType.AnsiString;
}
else
{
dbType = DbType.AnsiStringFixedLength;
}
}
base.Add(name, value, dbType, direction, size);
}
}
const string query = @"yourquery"
Parameters p = new Parameters();
p.Add("@Tag", tag);
p.Add("@Start", start);
p.Add("@End", end);
var values = c.Query<TagValue>("get_values", p,CommandType.StoredProcedure);
DynamicParameters是Dapper程序集的一部分。
希望这有帮助。
答案 1 :(得分:1)
这是一个如何调用函数并返回结果集的示例。
public IEnumerable<Account> Login(string code)
{
using (IDbConnection database = new NpgsqlConnection("yourConnectionString"))
{
var parameters = new DynamicParameters();
parameters.Add("_code", code);
return database.Query<Account>("AccountAuthenticate", parameters, commandType: CommandType.StoredProcedure);
}
}
这是他们的 postgresql 函数
CREATE OR REPLACE FUNCTION AccountAuthenticate(_code VARCHAR)
RETURNS TABLE (
Code VARCHAR
,Password VARCHAR
,Salt VARCHAR
)
LANGUAGE plpgsql AS $$ DECLARE
BEGIN
RETURN QUERY
SELECT
a.code
,a.password
,a.salt
FROM account a
WHERE a.code = _code
END; $$;