使用 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 端的细节。
有没有办法使用 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 端的细节。