Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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 3.0.0在Dapper 1.42中使用具有自定义类型处理程序的参数时会阻塞查询_C#_Postgresql_Dapper_Npgsql - Fatal编程技术网

C# Npgsql 3.0.0在Dapper 1.42中使用具有自定义类型处理程序的参数时会阻塞查询

C# Npgsql 3.0.0在Dapper 1.42中使用具有自定义类型处理程序的参数时会阻塞查询,c#,postgresql,dapper,npgsql,C#,Postgresql,Dapper,Npgsql,这个问题似乎与NPGSQL3.0.0中的某些内容有关,这些内容在Dapper1.42下发生了更改。我之所以得出这个结论,是因为在同一版本的Dapper中使用Npgsql 2.2.3时,使用了以下代码: public struct MyStruct { private readonly int _val; public MyStruct(int i) { _val = i; } public int MyInt { get { return _val; } } } p

这个问题似乎与NPGSQL3.0.0中的某些内容有关,这些内容在Dapper1.42下发生了更改。我之所以得出这个结论,是因为在同一版本的Dapper中使用Npgsql 2.2.3时,使用了以下代码:

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);
}
public struct MyStruct
{
私有只读值;
公共MyStruct(inti){u val=i;}
public int MyInt{get{return{u val;}}
}
公共类mystruchtandler:SqlMapper.TypeHandler
{
公共重写MyStruct解析(对象值)
{
if(值为int)
{
返回新的MyStruct((int)值);
}
抛出新FormatException(“到MyStruct的转换无效”);
}
public override void SetValue(IDbDataParameter参数,MyStruct值)
{
parameter.DbType=DbType.Int32;
parameter.Value=Value.MyInt;
}
}
公共静态int Main()
{
var mystruchtandler=new mystruchtandler();
AddTypeHandler(myStructHandler);
const string query=“从MyTable中选择*,其中ID=:someID”;
var queryParams=新的DynamicParameters();
Add(“someID”,新的MyStruct(3));
IDbConnection连接=新的NpgsqlConnection(connectionString);
var result=connection.Execute(查询、查询参数);
}
当我运行上述代码时,我得到一个异常消息:

查询问题:从MyTable中选择*,其中ID=:someID
字典中不存在给定的键
System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键

我已核实以下情况:

1) 传入内置类型的参数可以正常工作。例如,如果我更改行
queryParams.Add(“someID”,newmystruct(3))
to
queryParams.Add(“someID”,3),查询按预期返回。
2) 当反序列化MyStruct类型的字段时,mystruchtandler.Parse工作正常
3) 查询和DynamicParams对象之间的参数名称和大小写匹配
4) 在引发异常之前,从未调用MyStructHandler.SetValue

这个bug似乎是新引入的,只会影响具有定制简洁处理程序的类。有人知道为什么我升级到NPGSQL3.0.0后,它就停止工作了吗?更重要的是,如何修复它

--传统信息--


Npgsql.NpgsqlParameter.set_DbType(DbType值)中引发了异常,其中调用了System.Collections.Generic.Dictionary`2.get_项(TKey)。同样,这在Npgsql 2.2.3中也适用,因此我假设代码中发生了一些改变,从而破坏了此用例。

此问题已经报告并修复,请参阅

您可以立即获取一个不稳定的nuget包来解决此问题(),或者再等几天,直到我们发布带有此修复程序的Npgsql 3.0.1