Dapper和Informix Text数据类型存在问题

时间:2018-10-10 13:55:12

标签: exception text dapper informix

我有一个.NET库,该库具有将行插入到Informix表中的功能。该表中的字段之一是TEXT数据类型。该代码使用Dapper(1.42.0)。

最近,代码自发中断,并出现以下错误。

  

错误[HY000] [Informix] [Informix ODBC驱动程序] [Informix]非法尝试转换文本/字节Blob类型。“} System.Data.Odbc.OdbcException

通过Dapper的SQLMapper类从ODBC驱动程序中冒出异常。

最终,发现该问题与Windows更新同时发生,该Windows更新似乎具有Dapper本身的功能损坏。为了检验该理论,删除了更新并恢复了功能。不幸的是,我还没有时间隔离具体更新。

更具体地说,在.NET中使用普通的ODBC类型可以正常工作。

使用动态参数和匿名键入也可以与Dapper一起使用。这只是一个控制台应用程序;

private static void TestDapperAnon()
    {
        using (OdbcConnection cn = new OdbcConnection(connectionString))
        {
            DynamicParameters dparams = new DynamicParameters();
            dparams.Add("?note?", $"Adding a note #{new Random().Next(1000)}", System.Data.DbType.String, System.Data.ParameterDirection.Input);

            cn.Open();
            int result = cn.Execute(query, dparams);
            Console.WriteLine("result was " + result);
            Console.ReadLine();


        }
    }

破坏代码的是在Dapper中使用查询的强类型版本:

private static void TestDapperStronglyTyped()
    {
        Notepad pad = new Notepad
        {
            id = 0,
            note_id = 999,
            created = DateTime.Now,
            user = "USER",
            note = "meh"
        };
        using (OdbcConnection cn = new OdbcConnection(connectionString))
        {
            cn.Open();
            int result = cn.Execute(query, pad);
            Console.WriteLine("result was " + result);
            Console.ReadLine();
        }
    }

出于安全原因,我无法显示记事本类型,但是根据Dapper的文档,其属性名称与字段名称完全匹配。我怀疑这与Dapper如何将类型属性映射到参数值有关。

我的问题是,最近是否有人遇到过此问题,他们是否对修复有任何建议?

更新

花了一些时间研究这个问题,我很偶然地发现,如果我调整命令参数的Size属性,就可以避免该异常。 Dapper生成的动态参数的Size属性为4000。偶然地,我发现如果使用调试工具将此属性设置为8001,则可以避免该异常。我不知道为什么是8001。

我正在猜测,但是我怀疑Dapper逻辑根据字符串类型生成动态参数时会将默认大小设置为4000。 (例如,请参阅SqlMapper.cs,第2648行)。

我现在想知道是否有可能覆盖此默认行为。

0 个答案:

没有答案