ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

在Dapper 1.42中具有自定义类型处理程序的参数的查询上的Npgsql 3.0.0阻塞

2019-11-19 23:06:26  阅读:384  来源: 互联网

标签:postgresql dapper npgsql c


此问题似乎与Npgsql 3.0.0中的某些内容(在Dapper 1.42下有所更改)有关.我得出了这个结论,因为以下代码在将Npgsql 2.2.3与相同版本的Dapper一起使用时可以正常工作:

public struct MyStruct
{
    private readonly int _val;
    public MyStruct(int i) { _val = i; }
    public int MyInt { get { return _val; } }
}



public class MyStructHandler : SqlMapper.TypeHandler<MyStruct>
{
    public override MyStruct Parse(object value)
    {
        if (value is int)
        {
            return new MyStruct((int)value);
        }
        throw new FormatException("Invalid Conversion to MyStruct");
    }

    public override void SetValue(IDbDataParameter parameter, MyStruct value)
    {
        parameter.DbType = DbType.Int32;
        parameter.Value  = value.MyInt;
    }
}



public static int Main()
{
    var myStructHandler = new MyStructHandler();
    SqlMapper.AddTypeHandler(myStructHandler);

    const string query = "SELECT * FROM MyTable WHERE ID = :someID";
    var queryParams = new DynamicParameters();
    queryParams.Add("someID", new MyStruct(3));
    IDbConnection connection = new NpgsqlConnection(connectionString);
    var result = connection.Execute(query, queryParams);
}

运行上面的代码时,出现以下消息异常:

Problem with query: SELECT * FROM MyTable WHERE ID = :someID
The given key was not present in the dictionary
System.Collections.Generic.KeyNotFoundException : The given key was not present in the dictionary.

我已验证以下内容:

1) Passing in parameters of built-in types works correctly. E.g., if I change the line queryParams.Add("someID", new MyStruct(3)); to queryParams.Add("someID", 3);, the query returns as expected.
2) MyStructHandler.Parse works correctly when deserializing a field of type MyStruct
3) The parameter name and casing matches between the query and the DynamicParams object
4) MyStructHandler.SetValue is NEVER called prior to throwing the exception

该错误似乎是新引入的,并且仅影响具有自定义Dapper处理程序的类.有谁知道为什么在我升级到Npgsql 3.0.0后,它不再起作用,更重要的是,如何解决它?

-其他信息-

该异常在Npgsql.NpgsqlParameter.set_DbType(DbType值)中引发,其中对System.Collections.Generic.Dictionary`2.get_Item(TKey)进行了一些调用.同样,这曾经在Npgsql 2.2.3中起作用,因此我假设该代码中发生了一些更改,从而打破了该用例.

解决方法:

此问题已被报告并解决,请参阅https://github.com/npgsql/npgsql/issues/694

您可以立即获取不稳定的nuget包来解决此问题(http://www.npgsql.org/install.html),或者再等几天,直到我们发布具有此修复程序的Npgsql 3.0.1.

标签:postgresql,dapper,npgsql,c
来源: https://codeday.me/bug/20191119/2039524.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有