2

我想将一组键值对作为参数传递给使用 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;

如何IDictionary<string, string>使用 Npgsql 将数据从对象传递到存储过程?这支持吗?我在网上找不到参考资料。

谢谢!

4

4 回答 4

5

杰里米!

不幸的是,Npgsql 还不支持自定义数据类型。我打算增加对此的支持。

这意味着使用 Npgsql 添加某种类型的“注册”类型转换器。这样,您的应用程序将为您的自定义类型注册一个转换器,Npgsql 将使用它来回发送数据。

更多细节可以在:cvs.npgsql.org 上的 Npgsql/src/NpgsqlTypes/NpgsqlTypeConverters.cs

请在我们的项目站点中添加一个关于它的功能请求:project.npgsql.org。

提前致谢。

于 2012-01-12T17:11:41.183 回答
1

我将 IDictionary 转换为二维数组并通过 Npgsql 将此数组传递给存储过程 - 工作正常,因为 Npgsql支持数组作为参数。像这样转换:

                string[][] columnsArray = new string[2][];
                Dictionary<string, string> fields = ...
                columnsArray[0] = fields.Keys.ToArray();
                columnsArray[1] = fields.Values.ToArray();
于 2012-06-28T16:12:06.447 回答
0

似乎它仍然不支持用户定义的对象类型。另一种方法是将对象序列化为 XML 并作为参数传递并在存储过程中解析和执行它。

用户定义对象的支持状态是否有任何变化?

于 2014-01-15T12:37:02.873 回答
-1

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

于 2016-09-05T12:56:20.703 回答