2010-07-29 78 views
1

这非常紧迫,我需要在3个半小时内呈现此应用程序。SqlDataReader在没有数据时获取行

我的应用程序根据数据源检查数据库中是否存在值,并根据是否找到有问题的值更改值。 问题是我已经在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是一个String

由于这是一个工作的应用程序,我宁愿不包括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)下面提出的意见:

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)数据库中存在才会返回真。

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

不,我无法填充数据集,因为表中的信息量(+/- 9.5m行)。即使使用“WHERE”过滤器,查询对资源来说过于沉重,最终以OutOfMemory Exception结尾,这就是我使用DataReader的原因。

我打算尝试ExecuteScalar选项,现在由Darryl建议作为答案,将更新结果。

+0

您能向我们展示SQL吗? – egrunin 2010-07-29 09:48:41

+0

我知道编辑中的ConnectionString与原始的不同。为了合法目的,我必须改变某些事情......我正在使用的信息非常敏感。 – 2010-07-29 10:03:11

+0

连接字符串是最不可能的问题。 – egrunin 2010-07-29 10:14:13

回答

0

在荷马辛普森的不朽的话......“DOH !!”

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

因此,问题不在于我的代码,而在于数据...

3

试着改变你的If声明

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

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

+0

+1没有什么区别 - 它基本上是因为读者没有被移动到第一行而折断。 – 2010-07-29 09:25:12

+0

好的建议,但没有改进 – 2010-07-29 09:31:33

+0

@Logan确保你使用了正确的'sql'并且发出这个声明反对一个正确的数据库 - 这里没有其他的东西可以出错。 – 2010-07-29 09:34:56

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,对不对?)

+0

我做了,检查编辑我的OP – 2010-07-29 10:16:06

+0

我们可能会有一个重叠编辑的问题,你的代码仍然看起来像'''“&NumberToCheck&”'“'...? – egrunin 2010-07-29 10:21:59

+0

嗯...不,我没有添加该编辑,我的评论是在你的帖子上,暗示我混淆了一些代码以便我可以发布... – 2010-07-29 11:07:00

1

这不能解决问题,但它可能会让你通过你的演示文稿。使用“ExecuteScalar”,当你返回一个值时,它应该可以工作。

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