Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net DbDataReader GetIn32溢出_Vb.net_Sqldatareader - Fatal编程技术网

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
。而且我得到了那篇关于隐式加宽的文章,所以谢谢你帮我澄清。你应该把你最后的评论作为回答,这样我就可以接受了。