在当前项目中,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.DbType
是Int32
,reader.MetaData.metaDataArray(0).metaType.SqlType.Name
是SqlInt32
和reader._data(0).Int32
,reader._data(0).SqlInt32
和reader._data(0).SqlValue
都是643
。使用内置的reader.GetInt32(0)
函数,一切正常,也不例外。检查代码,这也是扩展名调用的函数。
在对扩展程序设置其他Integer
属性的其他调用中,所有内容似乎都相同,或者至少我无法发现差异。有人可以帮我找出问题所在吗?我不理解这种看似不确定的行为。