0

我有这段代码没有从 datareader 填充组合框。我做了各种检查,确认数据库正在连接,查询也正确。Databaseconnections 是一个模块,我在其中声明了所有变量,包括连接字符串和数据读取器(Public dr As SqlDataReader)。调试时一切都很顺利,但是当我点击 While 循环时,它会跳到循环的末尾而没有任何错误。我无法理解遗漏了什么。请帮忙。

Public Sub loadLocatns()

    Try
        Openconn()
        cmd.CommandText = "SELECT distinct jobs.[file] FROM [BERVSDB].[dbo].[jobQueue] as jobs where (jobs.form_status<>'c') and (jobs.CI = '" & Ccode & "') and (jobs.[file]  in( SELECT dts.[file] from [BERVSDB].[dbo].[master]  as dts where  (dts.[status] is null) or (dts.[status] <> 'X')  ))"
        cmd.Connection = conn
        Databaseconnections.dr = cmd.ExecuteReader()
        If IsNothing(dr) Then
            MessageBox.Show("No Data found")
        Else
            If dr.Read() Then
                While dr.Read
                    Me.ComboBox1.Items.Add(dr(0))
                End While
            Else
                MessageBox.Show("Not reading!")
            End If
            dr.Close()
            conn.Close()
        End If

    Catch ex As Exception
        MessageBox.Show("Error:" & ex.Message)
    End Try

End Sub
4

3 回答 3

0

在我看来,您从读者那里阅读了两次,第一次是在您检查时IF dr.Read() THEN,第二次是打开While dr.Read,如果您有一个项目,则不会添加。

解决方案:您可以使用DO ... WHILE允许您在调用后首先阅读的条件If dr.Read() Then (对不起,我不熟悉 VB.NET,所以我无法为您编写完整的代码,但我希望您明白这一点)

于 2013-03-20T12:52:34.497 回答
0

试试这个。@AMgdy 已经暗示过了。

Try
    Openconn()
    cmd.CommandText = "SELECT distinct jobs.[file] FROM [BERVSDB].[dbo].[jobQueue] as jobs where (jobs.form_status<>'c') and (jobs.CI = '" & Ccode & "') and (jobs.[file]  in( SELECT dts.[file] from [BERVSDB].[dbo].[master]  as dts where  (dts.[status] is null) or (dts.[status] <> 'X')  ))"
    cmd.Connection = conn
    Databaseconnections.dr = cmd.ExecuteReader()
    If Not dr.HasRows Then
        MessageBox.Show("No Data found")

    Else
        While dr.Read()
            Me.ComboBox1.Items.Add(dr(0))
        End While
    End If

    dr.Close()
    conn.Close()

Catch ex As Exception
    MessageBox.Show("Error:" & ex.Message)
End Try

也许将您的连接、命令和阅读器包装在使用块中,以确保它们也被正确处理。

于 2013-03-20T13:38:43.563 回答
0

我会尝试通过 SQL Server Profiler 检查查询,然后通过 SSMS 执行它以查看发生了什么。AMgdy 和 David Osborne 注意到的是正确的,但我猜您期望的不仅仅是一行(否则您不会使用 while 循环)。

另一个建议是使用参数而不是字符串连接,因为这很容易被 SQL 注入攻击,并且运行速度也比参数化查询慢。

SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT distinct jobs.[file] FROM 
[BERVSDB].[dbo].[jobQueue] as jobs where (jobs.form_status<>'c') and
(jobs.CI = @CCode) and (jobs.[file]  in( SELECT dts.[file] from
[BERVSDB].[dbo].[master]  as dts where  (dts.[status] is null) or 
(dts.[status] <> 'X')  ))";
cmd.Parameters.Add(new SqlParameter("@CCode", Ccode));
于 2013-03-21T10:26:55.063 回答