SqlDataReader 在没有数据时获取行

标签 sql sql-server vb.net sqldatareader

这件事非常紧急,我需要在 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

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

值为 bool 值 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

关于 2010 年 8 月 2 日(月/日/年)之前发表的以下评论:

Value 只是函数返回的 bool 值,表示数据库中存在搜索到的电话号码 (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 选项,并将更新结果。

最佳答案

尝试将 If 语句更改为

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

HasRows 展示 strange behavior在某些情况下,所以最好完全避免它。

关于SqlDataReader 在没有数据时获取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3360952/

相关文章:

sql-server - Sql Server 的时间数据类型中的精度和小数位数意味着什么?

sql - 递归地从同一个表父子表中获取最后一条记录

vb.net - 如何读取制表符分隔的值并将它们放入列表中?

mysql - 如何在 DataGridView 的标题单元格中添加复选框

c# - 从选择查询返回 bool 值

sql - 通过外键从另一个表获取值

sql - SQL select 中列的顺序重要吗?

mysql - 我应该删除还是禁用关系数据库中的一行?

vb.net - 将值从 Default.aspx 传递到 silverlight3 中的应用程序或主页

java - 执行更新语句