DbDataReader GetIn32溢出

时间:2017-04-25 06:42:41

标签: vb.net sqldatareader

在当前项目中,SqlDataReader用于从数据库查询接收数据。为方便起见,我创建了以下扩展名来接收任何整数:

<Extension()>
Public Function GetIntegerNumber(ByVal reader As DbDataReader, ByVal columnName As String) As Byte
    Dim columnNumber = reader.GetOrdinal(columnName)
    Select Case reader.GetFieldType(columnNumber)
        Case GetType(System.Byte)
            Return reader.GetByte(columnNumber)
        Case GetType(System.Int16)
            Return reader.GetInt16(columnNumber)
        Case GetType(System.Int32)
            Return reader.GetInt32(columnNumber)
        Case GetType(System.Int64)
            Return reader.GetInt64(columnNumber)
    End Select
    Throw New ArgumentException($"The column ""{columnName}"" does not contain a value of any integer type.")
End Function

对于大多数调用,扩展按预期工作,但是对于一种情况,它会抛出System.OverflowException:&#34;算术运算导致溢出。&#34;我不明白为什么。

在错误的情况下,它被调用如下:object.ID = reader.GetIntegerNumber("ObjectID"), 其中ID定义为Public Property ID() As Integer。检查读者,

  • reader.MetaData.metaDataArray(0).metaType.DbTypeInt32
  • reader.MetaData.metaDataArray(0).metaType.SqlType.NameSqlInt32
  • reader._data(0).Int32reader._data(0).SqlInt32reader._data(0).SqlValue都是643

使用内置的reader.GetInt32(0)函数,一切正常,也不例外。检查代码,这也是扩展名调用的函数。

在对扩展程序设置其他Integer属性的其他调用中,所有内容似乎都相同,或者至少我无法发现差异。有人可以帮我找出问题所在吗?我不理解这种看似不确定的行为。

0 个答案:

没有答案