使用 npgsql 将任何类型的数组传递给 postgres 存储过程

Passing array of any type to postgres stored procedures using npgsql

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

Will anyarray or anyelement can be of any use in this scenario.

由于 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();

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

一个"array of any type"(anyarray)是一个PostgreSQL pseudo-type,它只是用来编写接受任何区域的函数。它不是实际存在的类型 - 你不能有一列 anyarray.

因此,为了回答您的问题,您可以使用 Npgsql 将 int 数组、文本数组或任何其他数据类型发送到接受 anyarray 的 PostgreSQL 函数。 Npgsql 不了解 anyarray 并且不关心它,它只是 PostgreSQL 端的细节。