【问题标题】:Dapper AddDynamicParams for IN query with IEnumerable parameter in Postgres在 Postgres 中使用 IEnumerable 参数进行 IN 查询的 Dapper AddDynamicParams
【发布时间】:2014-08-14 22:40:24
【问题描述】:

首先,我遇到了与讨论过的相同的问题,据称大约两年前已解决。有关该问题,请参阅以下问题:

Dapper AddDynamicParams for IN statement with "dynamic" parameter name

我遇到的问题是,当我对我的 Postgres 9.3 数据库执行类似查询 (SELECT * FROM MyTable WHERE MyId IN @myIds) 时,我收到以下异常:

Npgsql.NpgsqlException : ERROR: 42883: operator does not exist: integer = integer[]

我执行此查询的代码如下:

List<MyTable> result;

var query = "SELECT * FROM MyTable WHERE MyId IN @myIds";
var queryParams = new Dictionary<string, object> {
    { "myIds", new [] { 5, 6 } }
};

var dynamicParams = new DynamicParameters(queryParams);
using (var connection = new NpgsqlConnection(connectionString)) {
    result = connection.Query<MyTable>(query, dynamicParams).ToList();
}

return result;

如果相反,我在 Dapper 的 (v1.29) SqlMapper.PackListParameters 函数的 if (FeatureSupport.Get(command.Connection).Arrays) 行上放置一个断点并手动将执行移至 else 部分,然后查询运行并返回预期结果。

我注意到.Arrays 属性明确将 Postgres 称为受支持的数据库,所以我想知道:这是我的代码、Dapper 代码、Dapper 配置还是 Postgres 配置的问题?是否有无需修改 Dapper 代码库的解决方法?谢谢。

【问题讨论】:

    标签: c# dapper postgresql-9.3


    【解决方案1】:

    是的,这看起来像是一个与 postgres 中的数组类型处理相关的错误;这是特定于 postgres 的,因此与您所指的“据称已修复”的帖子无关。老实说:我对 postgres 数组了解不多——该代码来自用户贡献,IIRC。如果您使用本机 postgres 语法,我很想知道它是否有效,即

    WHERE MyId = ANY(@myIds)
    

    但是,我同意如果我们可以在任一 RDBMS 上使用相同的语法,那就太好了。

    但实际上,它已经标记了该代码中需要修复的另一个错误(在 FeatureSupport 查找中)。

    【讨论】:

    • WHERE MyId = ANY(@myIds) 有效。使用FeatureSupport {Arrays = false} 重新编译也允许常规WHERE MyId IN @myIds 工作。 (这是问题 #150:github.com/StackExchange/dapper-dot-net/issues/150
    • 这是否限制为 1000 行?
    • 它对我不起作用:Npgsql.PostgresException (0x80004005): 22P03: invalid array flags;有什么想法吗?
    猜你喜欢
    • 2019-03-15
    • 2020-07-25
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多