SqlDataReader在没有数据时获取行
这是非常紧急的,我需要在3个半小时内提交这份申请 我的应用程序检查数据源,查看数据库中是否存在值,并根据是否找到有问题的值来更改值。 问题是,我在SSMS中使用有问题的值运行sql查询,没有返回任何行,但我的DataReader说它有行 这意味着我的申请报告不准确。 这是我的密码: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
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&”…?嗯。。。不,我没有添加编辑,我的评论是在你的帖子上,建议我对代码进行一些模糊处理,以便发布…好的,我添加了参数,没有任何改进