Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
SqlDataReader在没有数据时获取行_Sql_Sql Server_Vb.net_Sqldatareader - Fatal编程技术网

SqlDataReader在没有数据时获取行

SqlDataReader在没有数据时获取行,sql,sql-server,vb.net,sqldatareader,Sql,Sql Server,Vb.net,Sqldatareader,这是非常紧急的,我需要在3个半小时内提交这份申请 我的应用程序检查数据源,查看数据库中是否存在值,并根据是否找到有问题的值来更改值。 问题是,我在SSMS中使用有问题的值运行sql查询,没有返回任何行,但我的DataReader说它有行 这意味着我的申请报告不准确。 这是我的密码: Using conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=Testing; Integrated Securit

这是非常紧急的,我需要在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,我会得到正确的信息,但如果不注释,则意味着在值应该为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之前作出的以下评论:

值只是一个布尔值,由函数返回以指示数据库中存在搜索的电话号码NumberToCheck

所以

仅当数据库中存在本例中的NumberToCheck 3235553469时,val才会返回True

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

不,我无法填充数据集,因为表中的信息量为+/-950万行。即使使用“WHERE”过滤器,查询也会占用大量资源,最终导致OutOfMemory异常,这就是我使用DataReader的原因

我将尝试Darryl建议的ExecuteScalar选项,该选项将随结果更新。

尝试将If语句更改为

If reader.Read() Then
   Value = True
   AcctNumber = reader(1)  
End If
HasRows在某些情况下会出现,因此最好完全避免它。

尝试将If语句更改为

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

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

为了确保它不是数据问题,请将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

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

为了确保这不是数据问题,请参数化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

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

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

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

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

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

用荷马·辛普森不朽的话来说。。。啊

我刚刚查看了我的应用程序搜索电话号码的数据库,我不知道我怎么会错过它,但我搜索的值实际上就在那里


因此,问题不可能与我的代码有关,而是数据…

用荷马·辛普森不朽的话来说。。。啊

我刚刚查看了我的应用程序搜索电话号码的数据库,我不知道我怎么会错过它,但我搜索的值实际上就在那里



因此,问题不可能与我的代码有关,而是与数据有关…

+1-基本上是中断的,因为读者尚未移动到第一行。好建议,但是没有improvement@Logan确保您使用的是正确的sql,并针对正确的DB发出此语句-这里没有其他可能出错的地方。我只是不明白。。。sql是正确的,因为当我直接在db上运行它时,它可以工作,并且我从一个我知道可以工作的应用程序中复制了连接字符串。@Logan我认为如果你在这里发布完整的源代码会更好。+1-它基本上被破坏了,因为读者还没有移动到第一行。好建议,但是没有improvement@Logan确保您使用的是正确的sql,并针对正确的DB发出此语句-这里没有其他可能出错的地方。我只是不明白。。。sql是正确的,因为当我直接在db上运行它时,它可以工作,并且我从一个我知道可以工作的应用程序复制了连接字符串。@Logan我认为如果你在这里发布完整的源代码会更好。你能给我们看sql吗?我知道编辑中的连接字符串与原始的不同。为了法律目的我不得不改变某些事情。。。我正在处理的信息非常敏感。连接字符串是最不可能出现的问题。如果value=true,您是否也可以检查AcctNumber?它是来自您数据库的有效帐号吗?哦,您确定a.TelNumber='&NumberToCheck&'按预期工作吗?NumberToChec的价值是多少
你在用什么进行测试?你能给我们看看SQL吗?我知道编辑中的连接字符串与原始的不同。为了法律目的我不得不改变某些事情。。。我正在处理的信息非常敏感。连接字符串是最不可能出现的问题。如果value=true,您是否也可以检查AcctNumber?它是来自您数据库的有效帐号吗?哦,您确定a.TelNumber='&NumberToCheck&'按预期工作吗?您正在测试的NumberToCheck的值是多少?我们可能遇到了重叠编辑问题,您的代码看起来仍然像“&NumberToCheck&”…?嗯。。。不,我没有添加编辑,我的评论是在你的帖子上,建议我对代码进行一些模糊处理,以便发布…好的,我添加了参数,但没有任何改进。我们可能存在重叠编辑问题,你的代码看起来仍然像“&NumberToCheck&”…?嗯。。。不,我没有添加编辑,我的评论是在你的帖子上,建议我对代码进行一些模糊处理,以便发布…好的,我添加了参数,没有任何改进