【问题标题】:Why am I getting a "no data is present" error after passing the "HasRows" test?为什么通过“HasRows”测试后出现“无数据”错误?
【发布时间】:2017-08-13 12:13:51
【问题描述】:

我有这个代码:

Protected Function GetArgValsForCompanyName(coName As String) As String()
    Dim args(2) As String
    Dim sqlConnection1 As New SqlConnection("SERVER=PLATYPUS42;DATABASE=duckbilldata;UID=durante;PWD=pondscum")
    Dim cmd As New SqlCommand
    Dim reader As SqlDataReader

    cmd.CommandText = "select Unit, MemberNo, CustNo from Customers WHERE CompanyName = @CoName"
    cmd.CommandType = CommandType.Text
    cmd.Parameters.Add("@CoName", SqlDbType.VarChar, 50).Value = coName
    cmd.Connection = sqlConnection1
    sqlConnection1.Open()

    reader = cmd.ExecuteReader()
    If reader.HasRows Then
            args(0) = reader.Item(0).ToString()
            args(1) = reader.Item(1).ToString()
            args(2) = reader.Item(2).ToString()
    End If
    reader.Close()
    sqlConnection1.Close()

    Return args
End Function

...这行失败:

args(0) = reader.Item(0).ToString()

...与:

*System.InvalidOperationException was unhandled
  HResult=-2146233079
  Message=Invalid attempt to read when no data is present.*

它怎么可能是“HasRows”却没有数据存在?

注意:当我尝试这个(而不是使用“0”索引)时,它也会失败并出现同样的错误:

args(0) = reader.Item("Unit").ToString()

更新

已接受的答案在现代应用程序(例如,我的“沙盒”Windows 窗体应用程序)中运行良好,但在旧应用程序中,例如使用 .NET 史前的陈旧、陈旧的网站,它就不行了——“使用”显然无法识别;我明白了:

Server Error in '/EMS/customerreportingnet' Application.
--------------------------------------------------------------------------------

Compilation Error 
Description: An error occurred during the compilation of a resource required to service this request. 

Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: BC30203: Identifier expected.

Source Error:

Line 90:         Dim args(2) As String
Line 91: 
Line 92:         Using con As New SqlConnection("SERVER=PLATYPUS42;DATABASE=duckbilldata;UID=durante;PWD=pondscum"),
Line 93:               cmd As New SqlCommand("select Unit, MemberNo, CustNo from Customers WHERE 

CompanyName = @CoName", con)
Line 94: 

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.5485; ASP.NET Version:2.0.50727.5491 

【问题讨论】:

  • 要解决无法处理 Using 的过时编译器的问题,您可以使用 Try-Finally 手动实现它。

标签: vb.net invalidoperationexception no-data


【解决方案1】:

正如您在answer 中所说,需要致电.Read

If reader.HasRows 但不是必需的。 Do While reader.Read 将处理此问题。如果有行则进入循环,否则绕过。

作为补充说明,我认为实现Using 会有所帮助:

Protected Function GetArgValsForCompanyName(coName As String) As String()
    Dim args(2) As String

    Using con As New SqlConnection("SERVER=PLATYPUS42;DATABASE=duckbilldata;UID=durante;PWD=pondscum"),
          cmd As New SqlCommand("select Unit, MemberNo, CustNo from Customers WHERE CompanyName = @CoName", con)

        con.Open()

        cmd.CommandType = CommandType.Text
        cmd.Parameters.Add("@CoName", SqlDbType.VarChar, 50).Value = coName

        Using reader As SqlDataReader = cmd.ExecuteReader

            While reader.Read
                args(0) = reader.Item(0).ToString()
                args(1) = reader.Item(1).ToString()
                args(2) = reader.Item(2).ToString()
            End While

        End Using

    End Using

    Return args
End Function

使用Using,您不必担心调用.Close 或处理对象。我也觉得它读起来更好。

【讨论】:

    【解决方案2】:

    还需要调用“读取”;这有效(可以使用返回的字段名称或其索引):

    If reader.HasRows Then
        Do While reader.Read
            'args(0) = reader.Item(0).ToString()
            args(0) = reader.Item("Unit").ToString()
            args(1) = reader.Item(1).ToString()
            args(2) = reader.Item(2).ToString()
        Loop
    End If
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多