使用Dapper和Postgres调用存储过程

时间:2014-08-13 20:08:14

标签: c# postgresql stored-procedures dapper

我一直在尝试使用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));

它正常工作并返回正确的结果。

2 个答案:

答案 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; $$;