【发布时间】: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