【问题标题】:Passing array of any type to postgres stored procedures using npgsql使用 npgsql 将任何类型的数组传递给 postgres 存储过程
【发布时间】:2018-04-18 16:42:39
【问题描述】:

有没有办法使用 npgsql 将任何类型的数组从 c# 代码传递到 postgres 存储过程作为参数。

anyarray 或 anyelement 在这种情况下是否有用。

【问题讨论】:

    标签: c# postgresql npgsql


    【解决方案1】:

    “任何类型的数组”(anyarray)是一个PostgreSQL pseudo-type,它仅用于编写接受任何区域的函数。它不是一个实际存在的类型 - 你不能有 anyarray 的列。

    所以要回答您的问题,您可以使用 Npgsql 将 int、文本或任何其他数据类型的数组发送到接受 anyarray 的 PostgreSQL 函数。 npgsql对anyarray一无所知,也不关心,这只是PostgreSQL方面的细节。

    【讨论】:

      【解决方案2】:

      由于 Npgsql 中的强大数据类型,我看不出有任何好的方法可以实现这一点,但如果您想要一种攻击性最低的 hack(就动态 SQL/SQL 注入而言),您可以在 C# 中加入“anyarray”,然后在 PostgreSQL 中拆分它。

      object[] test = new object[] { "one", "two", 3, 4 };
      
      NpgsqlCommand cmd = new NpgsqlCommand(
          "select cardinality(regexp_split_to_array(:COMBINED, E'\t'))",
          Connection);
      cmd.Parameters.AddWithValue("COMBINED", string.Join("\t", test));
      
      int results = (int)cmd.ExecuteScalar();
      

      当然,您需要选择一个出现在任何值中的可能性最小的分隔符,这很糟糕。

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 2018-01-01
        • 1970-01-01
        • 2015-03-05
        • 2016-04-27
        • 1970-01-01
        • 2010-11-07
        相关资源
        最近更新 更多