Vb.net DbDataReader GetIn32溢出
在当前项目中,Vb.net DbDataReader GetIn32溢出,vb.net,sqldatareader,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 reade
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
公共函数GetIntegerNumber(ByVal reader作为DbDataReader,ByVal columnName作为String)作为字节
Dim columnNumber=reader.GetOrdinal(columnName)
选择Case reader.GetFieldType(columnNumber)
Case GetType(System.Byte)
返回读取器.GetByte(columnNumber)
Case GetType(System.Int16)
Return reader.GetInt16(columnNumber)
Case GetType(System.Int32)
返回读取器.GetInt32(columnNumber)
Case GetType(System.Int64)
Return reader.GetInt64(columnNumber)
结束选择
抛出新ArgumentException($“列”{columnName}“不包含任何整数类型的值。”)
端函数
对于大多数调用,扩展都能按预期工作,但有一个扩展抛出了一个系统。OverflowException
:“算术运算导致了溢出。”我不明白为什么
在错误情况下,它的调用方式如下:object.ID=reader.GetIntegerNumber(“ObjectID”)
,
其中,ID
定义为Public Property ID()作为整数
。检查读者
是reader.MetaData.metaDataArray(0).metaType.DbType
Int32
是reader.MetaData.metaDataArray(0).metaType.SqlType.Name
,并且SqlInt32
,reader.\u数据(0).Int32
和reader.\u数据(0).SqlInt32
都是reader.\u数据(0).SqlValue
643
reader.GetInt32(0)
函数,一切正常,无一例外。检查代码时,这也是扩展调用的函数
在为设置其他
Integer
属性而调用扩展时,一切似乎都是一样的,或者至少我看不出有什么不同。有人能帮我找出问题出在哪里吗?我不理解这种看似不确定的行为。您的代码试图返回字节
、短
、整数
或长
,但您的方法被声明为返回类型字节
。为什么在尝试将大于字节的内容作为字节
返回时不会出现溢出?您的方法实际上没有意义。为了支持所有类型,您必须将返回类型声明为最大类型,但是无论实际的数据类型如何,您都会得到一个Long
值,这是不可取的。基本上,您应该总是知道数据的类型,并使用代码获取该类型的数据。简言之,你的方法相对无用。@jmcilhinney假设你是对的,那么为什么它在大多数情况下都有效呢?我只是这样做,因为VB.net会自动加宽(如中所述),所以代码应该是正确的?它将适用于任何可以放入字节的值,而不管数据类型如何。这意味着不超过255。当您尝试将其放入字节时,任何大于该值的内容都将溢出,因为有太多的数据无法容纳。为了使代码能够编译,您必须禁用选项strictoff
,这一点从一开始就不好。在项目属性和IDE选项中,您应该将选项严格打开
,并将其保持为打开
,除非您特别需要关闭选项,这是非常罕见的。编译器会发现您的错误并拒绝进一步操作。@jmchiliney您是对的,选项Strict
被设置为Off
。而且我得到了那篇关于隐式加宽的文章,所以谢谢你帮我澄清。你应该把你最后的评论作为回答,这样我就可以接受了。