如何为自定义数据类型的Npgsql提供参数?

时间:2012-01-12 01:27:21

标签: c# postgresql npgsql

我想使用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>对象传递到存储过程?这支持吗?我在网上找不到参考资料。

谢谢!

4 个答案:

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