我有一个.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行)。
我现在想知道是否有可能覆盖此默认行为。