【问题标题】:SqlDataReader getting rows when no dataSqlDataReader 在没有数据时获取行
【发布时间】:2010-07-29 09:16:30
【问题描述】:

这非常紧急,我需要在 3 个半小时内提交此申请。

我的应用程序检查数据源以查看数据库中是否存在值,并根据是否找到相关值来更改值。 问题是我已经在 SSMS 中使用有问题的值运行 sql 查询,并且没有返回任何行,但是,我的 DataReader 说它有行。

这意味着我的应用程序报告不准确。 这是我的代码:

Using conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=Testing;       Integrated Security=True;")
    Dim cmd As New SqlCommand(sql, conn)

    conn.Open()
    Dim reader As SqlDataReader = cmd.ExecuteReader

    If reader.HasRows Then
       Value = True
       AcctNumber = reader(1)
    End If

    reader.Close()
End Using

我已删除与本文无关的代码,但您可能想知道的是:

值为布尔值 AcctNumber 是一个字符串

由于这是一个工作应用程序,我宁愿不包含 SQL 查询。问题出在读者身上。如果我注释掉Value = True,我会得到正确的信息,但如果不注释掉这意味着在 Value 应该为 True 的情况下,它也会报告不准确。

提前致谢!

编辑:完整源代码:

Case "Business"
    ' Change the number format to local because that's what it is in the db
    If Microsoft.VisualBasic.Left(NumberToCheck, 2) = "27" Then
        NumberToCheck = NumberToCheck.Replace(Microsoft.VisualBasic.Left(NumberToCheck, 2), "0")
    End If

    Dim sql As String = "SELECT a.TelNumber, c.AccountNumber " & _
            "FROM TelInfo a " & _
            "INNER JOIN Customers b ON a.CustID = b.pkguidId " & _
            "INNER JOIN Accounts c ON b.pkguidId = c.CustID " & _
            "WHERE a.TelNumber = '" & NumberToCheck & "'"
    Using conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=Testing; Persist Security Info=True; " & _
        "User Id=JoeSoap; Password=paoseoj;")
        Dim cmd As New SqlCommand(sql, conn)

        conn.Open()
        Dim reader As SqlDataReader = cmd.ExecuteReader

        If reader.Read Then
            Value = True
            AcctNumber = reader(1)
         End If

        reader.Close()
    End Using

关于以下 08/02/10 (mm/dd/yy) 之前制造的 cmets:

Value 只是一个由函数返回的布尔值,表示搜索到的电话号码 (NumberToCheck) 存在于数据库中。

所以...

Private AcctNumber As String

Dim val As Boolean = False
val = CheckNumber("3235553469")
If val Then
    ' AcctNumber will have been set by CheckNumber
    Label1.Text = AcctNumber
End If

val 只有在 NumberToCheck(在本例中为 3235553469)存在于数据库中时才会返回 True。

将 NumberToCheck 的值复制到 SSMS 并在那里测试查询后,我可以验证查询是否按预期工作。

不,由于表中的信息量很大(+/- 950 万行),我无法填充数据集。即使使用“WHERE”过滤器,查询的资源也太繁重,最终以OutOfMemory Exception 结尾,这就是我使用DataReader 的原因。

我将尝试使用 Darryl 现在作为答案建议的 ExecuteScalar 选项,并将更新结果。

【问题讨论】:

  • 你能告诉我们SQL吗?
  • 我知道编辑中的 ConnectionString 与原始内容不同。出于法律目的,我不得不更改某些内容...我正在使用的信息非常敏感。
  • 连接字符串是最不可能出现的问题。
  • 如果 value = true,您也可以检查 AcctNumber 吗?它是来自您的数据库的有效帐号吗?
  • 哦,您确定"WHERE a.TelNumber = '" & NumberToCheck & "'" 可以按预期工作吗?您正在测试的NumberToCheck 的值是多少?

标签: sql sql-server vb.net sqldatareader


【解决方案1】:

尝试将您的 If 语句更改为

If reader.Read() Then
   Value = True
   AcctNumber = reader(1)  
End If

HasRows 在某些情况下会表现出strange behavior,因此最好完全避免它。

【讨论】:

  • +1 - 因为阅读器没有被移动到第一行,所以基本上是崩溃了。
  • 好建议,但没有改善
  • @Logan 确保您使用的是正确的 sql 并针对正确的数据库发出此语句 - 这里没有其他问题。
  • 我只是不明白...... sql 是正确的,因为当我直接在数据库上运行它时它可以工作,并且我从我知道可以工作的应用程序中复制了连接字符串。跨度>
  • @Logan 我认为如果你在这里发布完整的源代码会更好。
【解决方案2】:

这并不能解决问题,但可以帮助您完成演示。使用“ExecuteScalar”,当您返回单个值时它应该可以工作。

    AcctNumber = ""
    AcctNumber = cmd.ExecuteScalar
    If AcctNumber = "" Then
        Value = False
    Else
        Value = True
    End If

【讨论】:

    【解决方案3】:

    为了确保这不是数据问题,请参数化您的 SQL。换个说法:

    Dim sql As String = "SELECT a.TelNumber, c.AccountNumber " & _
            "FROM TelInfo a " & _
            "INNER JOIN Customers b ON a.CustID = b.pkguidId " & _
            "INNER JOIN Accounts c ON b.pkguidId = c.CustID " & _
            "WHERE a.TelNumber = @telNumber"
    

    然后这样做:

    Dim cmd As New SqlCommand(sql, conn)
    cmd.Parameters.AddWithValue("@telNumber", NumberToCheck) ' <==== added line
    

    编辑

    我认为我们找错地方了。在if reader.Read()之前添加这个:

    Value = false
    AcctNumber = ""
    

    这将确保您没有变量范围的问题。 (你正在使用Option Strict On,对吗?)

    【讨论】:

    • 我们可能遇到了重叠编辑问题,您的代码仍然看起来像 "'" &amp; NumberToCheck &amp; "'"...?
    • 嗯...不,我没有添加那个编辑,我的评论是在您的帖子上建议我稍微混淆代码以便我可以发布...
    • 好的,我已经添加了参数,没有任何改进
    【解决方案4】:

    用荷马辛普森的不朽话语......“DOH!!”

    我刚刚查看了我的应用程序搜索电话号码的数据库,我不知道我怎么会错过它,但我正在搜索的值确实存在。

    因此,问题可能与我的代码无关,而与数据有关...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多