我尝试执行以下代码来搜索用户名
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;
非常感谢任何帮助。
答案 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());
}
}
使用@
与:
完全没关系......我只是为了个人风格偏好而切换到冒号。