【发布时间】:2018-04-18 16:42:39
【问题描述】:
有没有办法使用 npgsql 将任何类型的数组从 c# 代码传递到 postgres 存储过程作为参数。
anyarray 或 anyelement 在这种情况下是否有用。
【问题讨论】:
标签: c# postgresql npgsql
有没有办法使用 npgsql 将任何类型的数组从 c# 代码传递到 postgres 存储过程作为参数。
anyarray 或 anyelement 在这种情况下是否有用。
【问题讨论】:
标签: c# postgresql npgsql
“任何类型的数组”(anyarray)是一个PostgreSQL pseudo-type,它仅用于编写接受任何区域的函数。它不是一个实际存在的类型 - 你不能有 anyarray 的列。
所以要回答您的问题,您可以使用 Npgsql 将 int、文本或任何其他数据类型的数组发送到接受 anyarray 的 PostgreSQL 函数。 npgsql对anyarray一无所知,也不关心,这只是PostgreSQL方面的细节。
【讨论】:
由于 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();
当然,您需要选择一个出现在任何值中的可能性最小的分隔符,这很糟糕。
【讨论】: