Npgsql从存储过程中获取记录

时间:2018-02-02 06:54:17

标签: c# sql .net postgresql

我尝试执行以下代码来搜索用户名

using (var cmd = new NpgsqlCommand("search_users", conn))
{
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@username", NpgsqlTypes.NpgsqlDbType.Text, "xxx");

    using (var reader = cmd.ExecuteReader())
        while (reader.Read())
            x.Add(reader["loginname"].ToString());
}

cmd.ExecuteReader()的行上我收到此错误

  

Npgsql.PostgresException:'42601:列定义列表是   返回“记录”'

的函数需要

我是否以正确的方式阅读返回的记录?这是存储过程

CREATE FUNCTION search_users(username TEXT) RETURNS RECORD AS $$
DECLARE 
  ret RECORD;
BEGIN
      SELECT * from public."Users" as t1
      WHERE t1."LoginName" = username INTO ret;
RETURN ret;
END;$$ LANGUAGE plpgsql;

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果要返回与public."Users"布局匹配的记录,那么我认为您需要做的就是在返回类型中指定:

CREATE FUNCTION search_users(username TEXT) RETURNS public."Users" AS $$
DECLARE 
  ret RECORD;
BEGIN
      SELECT * from public."Users" as t1
      WHERE t1."LoginName" = username INTO ret;
RETURN ret;
END;$$ LANGUAGE plpgsql;

就C#代码而言......我看到你要做的是什么,我认为如果这是Oracle,那么这种方法可以完美地运作。在PostgreSQL中,函数和存储过程之间的界限有点​​模糊(在我看来),执行函数和返回结果的最简单方法是使用简单的select语句。因此,您的C#看起来如下:

using (var cmd = new NpgsqlCommand("select * from search_users(:USER_NAME)", conn))
{
    cmd.Parameters.AddWithValue("USER_NAME", "xxx");

    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
            x.Add(reader["loginname"].ToString());
    }
}

使用@:完全没关系......我只是为了个人风格偏好而切换到冒号。