Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 传递多维npgsql参数?_C#_Asp.net_Postgresql_Npgsql - Fatal编程技术网

C# 传递多维npgsql参数?

C# 传递多维npgsql参数?,c#,asp.net,postgresql,npgsql,C#,Asp.net,Postgresql,Npgsql,我在asp.net核心项目中使用了以下c代码: ... /* words is of type List<string> */ var query = $"SELECT * FROM a_table WHERE word = ANY(@words) AND token = 'some string'"; using (var connection = new NpgsqlConnection(ConnectionString)) { conne

我在asp.net核心项目中使用了以下c代码:

... /* words is of type List<string> */
var query = $"SELECT * FROM a_table WHERE word = ANY(@words) AND token = 'some string'";
using (var connection = new NpgsqlConnection(ConnectionString))
        {
            connection.Open();
            var cmd = new NpgsqlCommand(query, connection);
            cmd.Parameters.Add("@words", NpgsqlDbType.Array | NpgsqlDbType.Text).Value = words;
            var reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                ...
现在我想在c中使用它,如下所示:

... /* words was a List<> of a custom type with two string auto properties, but I changed it to List<List<string>> when that didn't work. Didn't help much. */
var query = $"SELECT * FROM a_table WHERE (word, token) IN @words";
using (var connection = new NpgsqlConnection(ConnectionString))
        {
            connection.Open();
            var cmd = new NpgsqlCommand(query, connection);
            cmd.Parameters.Add("@words", NpgsqlDbType.Array | NpgsqlDbType.Array | NpgsqlDbType.Text).Value = words;
            var reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                ...
但是我猜npgsql不能处理这个问题——没有字符串数组的类型

Microsoft.AspNetCore.Server.Kestrel[13] 连接id 0HLFDVA1DP743,请求id 0HLFDVA1DP743:00000002:应用程序引发了未经处理的异常。 异常:尝试写入数组时,其中一个元素的验证失败。您可能试图在非泛型IList中混合类型,或者编写锯齿数组。-->System.InvalidCastException:无法使用处理程序类型TextHandler写入CLR类型System.Collections.Generic.List`1[System.String] 在lambda_methodClosure,NpgsqlTypeHandler,对象,NpgsqlLengthCache&,NpgsqlParameter

有没有合适的方法传递多维数组?还是我必须自己建造,然后失去注射保护?我以为参数会让整个事情变得更简单!注意,我也不知道单词列表中有多少项

但是我猜npgsql不能处理这个问题——没有字符串数组的类型

PostgreSQL支持多维数组int[,],但不支持交错数组int[]

有没有合适的方法传递多维数组

是的,这里有一个:

这确实有效…但它不涉及任何数组。您正在一组行中搜索一行:

postgres=# SELECT ('able', 'something else');

           row
-------------------------
 (able,"something else")
(1 row)


postgres=# SELECT (0, 1) IN (u.t) FROM (SELECT unnest(ARRAY[(0, 1), (2, 3)]) AS t) AS u;

 ?column?
----------
 t
(1 row)

不涉及数组->是。。。但这就是我试图让Npgsql生成的语法,只要进行适当的转义即可。所以传递数组是错误的?接受,因为切换Word对象使我克服了该错误,我将提出一个关于将记录作为参数传递的新问题。请注意,Npgsql不会为您生成任何SQL—用户提供SQL。正如@austin drenski在上面所写的,行和数组在PostgreSQL中是非常不同的东西:你可以转换到另一个,但它们是不同的东西。@ShayRojansky你如何比较记录和数组[]?我本来想问另一个问题,但我基本上会重新发布这个问题的前2/3,然后问另一个问题。。。
[Test, Description("Roundtrips a two-dimensional array of ints")]
public void TwoDimensionalInts()
{
    using (var conn = OpenConnection())
    using (var cmd = new NpgsqlCommand("SELECT @p1, @p2", conn))
    {
        var expected = new[,] { { 1, 2, 3 }, { 7, 8, 9 } };
        var p1 = new NpgsqlParameter("p1", NpgsqlDbType.Array | NpgsqlDbType.Integer);
        var p2 = new NpgsqlParameter { ParameterName = "p2", Value = expected };
        cmd.Parameters.Add(p1);
        cmd.Parameters.Add(p2);
        p1.Value = expected;
        var reader = cmd.ExecuteReader();
        reader.Read();
        Assert.That(reader.GetValue(0), Is.EqualTo(expected));
        Assert.That(reader.GetProviderSpecificValue(0), Is.EqualTo(expected));
        Assert.That(reader.GetFieldValue<int[,]>(0), Is.EqualTo(expected));
    }
}
SELECT * 
FROM a_table 
WHERE (word, token) IN (('able', 'something else'), ('pizza', 'something else entirely'))
postgres=# SELECT ('able', 'something else');

           row
-------------------------
 (able,"something else")
(1 row)


postgres=# SELECT (0, 1) IN (u.t) FROM (SELECT unnest(ARRAY[(0, 1), (2, 3)]) AS t) AS u;

 ?column?
----------
 t
(1 row)