我有一个OdbcDataReader,它从数据库中获取数据并返回一组记录。
执行查询的代码如下所示:
OdbcDataReader reader = command.ExecuteReader();
while (reader.Read())
{
yield return reader.AsMovexProduct();
}
该方法返回自定义类型(MovexProduct
)的IEnumerable。从IDataRecord到我的自定义类型MovexProduct的转换发生在一个看起来像这样的扩展方法(缩写):
public static MovexProduct AsMovexProduct(this IDataRecord record)
{
var movexProduct = new MovexProduct
{
ItemNumber = record.GetString(0).Trim(),
Name = record.GetString(1).Trim(),
Category = record.GetString(2).Trim(),
ItemType = record.GetString(3).Trim()
};
if (!record.IsDBNull(4))
movexProduct.Status1 = int.Parse(record.GetString(4).Trim());
// Additional properties with IsDBNull checks follow here.
return movexProduct;
}
当我点击if (!record.IsDBNull(4))
时,我收到一个OverflowException,异常消息“算术运算导致溢出。”
堆栈跟踪:
System.OverflowException was unhandled by user code
Message=Arithmetic operation resulted in an overflow.
Source=System.Data
StackTrace:
at System.Data.Odbc.OdbcDataReader.GetSqlType(Int32 i)
at System.Data.Odbc.OdbcDataReader.GetValue(Int32 i)
at System.Data.Odbc.OdbcDataReader.IsDBNull(Int32 i)
at JulaAil.DataService.Movex.Data.ExtensionMethods.AsMovexProduct(IDataRecord record)
[...]
我之前从未遇到过这个问题,我无法弄清楚为什么会得到它。我已经验证记录存在并且它包含数据并且我提供的索引是正确的。我还应该提一下,如果我将if-statemnt更改为:if (record.GetString(4) != null)
,我会得到相同的异常。什么工作将属性赋值封装在try {} catch (NullReferenceException) {}
块中 - 但这可能导致性能损失(不是吗?)。
我正在运行Visual Studio的x64版本,而且我使用的是64位odbc驱动程序。
还有其他人遇到过这个吗?关于如何解决/解决这个问题的任何建议?
非常感谢!
答案 0 :(得分:0)
对于遇到相同问题的任何人,我解决这个问题的方法是从Odbc *类切换到他们的OleDb *对应物。这当然要求您的数据驱动程序支持OleDb连接。
答案 1 :(得分:0)
您想与哪个数据库交谈?如果它使用一些可能导致问题的“私有”列类型。当然,这不适用于SQL Server: - )
同时检查您是否正在编译并以x64格式运行(Process Explorer将向您展示,甚至简单的大头钉管理器也会显示它)。 devenv.exe仍然是x86但你的实际二进制文件应该以x64运行。我提到的原因是,跨越32/64位边界因打破第三方ODBC驱动程序而臭名昭着。