这非常紧急,我需要在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 Query。问题是读者。如果我注释掉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):
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
只有在数据库中存在NumberToCheck(在此示例中为3235553469)时, val
才会返回True。
将NumberToCheck的值复制到SSMS并在那里测试查询后,我可以验证查询是否按预期工作。
不,由于表中的信息量(+/- 9.5m行),我无法填充DataSet。即使使用'WHERE'过滤器,查询对资源的影响也太大,最终以OutOfMemory Exception
结束,这就是我使用DataReader的原因。
我将尝试使用ExecuteScalar
选项作为Darryl现在的答案,将更新结果。
答案 0 :(得分:3)
尝试将If
语句更改为
If reader.Read() Then
Value = True
AcctNumber = reader(1)
End If
HasRows
在某些情况下展示strange behavior,因此最好完全避免它。
答案 1 :(得分:1)
这不能解决问题,但它可能会引导您完成演示。使用“ExecuteScalar”,它在返回单个值时应该有效。
AcctNumber = ""
AcctNumber = cmd.ExecuteScalar
If AcctNumber = "" Then
Value = False
Else
Value = True
End If
答案 2 :(得分:0)
为了确保它不是数据问题,请参数化您的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
,对吧?)
答案 3 :(得分:0)
在荷马辛普森不朽的话语中......“DOH !!”
我刚看了一下我的应用程序搜索电话号码的数据库,我不知道怎么会错过它,但我正在搜索的值实际上就是那里。
因此,问题不一定与我的代码有关,而是数据......