【问题标题】:How to provide Npgsql with a custom data type as a parameter?如何为 Npgsql 提供自定义数据类型作为参数?
【发布时间】:2012-02-08 09:12:44
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c# postgresql npgsql


    【解决方案1】:

    杰里米!

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

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

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

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

    提前致谢。

    【讨论】:

    • 有时 pgfoundry 会遇到一些问题。请再试一次,它应该可以工作。我现在刚刚在这里测试过,还可以。
    • Npgsql代码可以在github上找到:github.com/npgsql/Npgsql 希望对你有帮助。
    【解决方案2】:

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

                    string[][] columnsArray = new string[2][];
                    Dictionary<string, string> fields = ...
                    columnsArray[0] = fields.Keys.ToArray();
                    columnsArray[1] = fields.Values.ToArray();
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 不幸的是,我们仍然不支持自定义类型 :( 但我开始编写有关如何执行此操作的文档:github.com/npgsql/Npgsql/wiki/… 这是一个非常早期的版本,但它为您提供了一些关于哪里的指针你用 Npgsql 代码开始工作。我希望它有帮助。请检查一下,让我知道你的想法。
      【解决方案4】:

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 2010-11-15
        • 2018-01-28
        • 2020-11-11
        • 2017-12-06
        相关资源
        最近更新 更多