我想使用Npgsql将一组键值对作为参数传递给PostgreSQL函数。我定义了以下类型:
drop type if exists key_value_pair
create type key_value_pair as (
k varchar(250),
v text
);
我想写一个这样的函数:
create or replace function persist_profile(
_user_id integer,
_key_value_pairs key_value_pair[]
) returns boolean as $$
begin;
...
return true;
end;
$$ language plpgsql;
如何使用Npgsql将数据从IDictionary<string, string>
对象传递到存储过程?这支持吗?我在网上找不到参考资料。
谢谢!
答案 0 :(得分:4)
杰里米!
不幸的是,Npgsql还不支持自定义数据类型。我打算加入对此的支持。
这意味着使用Npgsql添加某种类型的“注册”类型转换器。这样,您的应用程序将为您的自定义类型注册转换器,Npgsql将使用它来回发送数据。
可以获取更多详细信息:cvs.npgsql.org上的Npgsql / src / NpgsqlTypes / NpgsqlTypeConverters.cs
请在我们的项目网站上添加一个有关该功能的请求:project.npgsql.org。
提前致谢。
答案 1 :(得分:0)
我将IDictionary转换为2维数组,并通过Npgsql将此数组传递给存储过程 - 作为参数,可以正常工作Npgsql supports数组。像这样转换:
string[][] columnsArray = new string[2][];
Dictionary<string, string> fields = ...
columnsArray[0] = fields.Keys.ToArray();
columnsArray[1] = fields.Values.ToArray();
答案 2 :(得分:0)
似乎它仍然不支持用户定义的对象类型。另一种方法是将对象序列化为XML并作为参数传递并解析并在存储过程中执行它。
用户定义对象的支持状态是否有任何变化?
答案 3 :(得分:0)
Npg确实支持它(至少在3.1.7中)
说你正在执行像
这样的事情INSERT INTO some_table (key, value) SELECT key, value FROM UNNEST(@key_value_pairs);
其中key_value_pairs
是您的key_value_pair
类型的数组,并且您有类似
class key_value_pair
{
string key;
string value;
}
你有一个这些对象的数组
key_value_pair[] params = {...};
然后您将参数添加到命令,如
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
...
cmd.Parameters.Add("key_value_pairs", NpgsqlDbType.Array | NpgsqlDbType.Composite).Value = params;
cmd.ExecuteNonQuery();
}
这里的关键点是将参数类型设置为NpgsqlDbType.Array | NpgsqlDbType.Composite
。我没有尝试调用一个采用用户定义类型的函数,但它应该与上面相同。有关示例,请参阅this。