IDataRecord.IsDBNull导致System.OverflowException(算术溢出)
我有一个OdbcDataReader从数据库获取数据并返回一组记录。IDataRecord.IsDBNull导致System.OverflowException(算术溢出)
执行查询的代码如下所示:
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驱动程序。
有没有人遇到过这个?关于如何解决/解决此问题的任何建议?
非常感谢!
对于任何一个遇到同样的问题,我解决这个问题的方法是从ODBC *类切换到它们的OleDb *同行。这当然要求您的数据驱动程序支持OleDb连接。
哪个DB你想说话?如果它使用可能导致问题的某些“专用”列类型。这并不适用于过程的SQL服务器:-)
也检查你的编译和运行的x64(Process Explorer中会告诉你thsi,甚至普通的粘性管理器显示它)。 devenv.exe仍然是x86,但您的实际二进制文件应该以x64运行。我提到的原因是跨越32/64位边界对于破坏第三方ODBC驱动程序而言是臭名昭着的。
的是在正处于第4索引获取列的SQL数据类型? – HotTester 2010-03-30 12:44:48
这是一个GRAPHIC()CCSID 13488(2),无论是(?)。 – Ciddan 2010-03-30 13:23:34