数据读取器有行但不填充组合框

时间:2013-03-20 12:25:45

标签: sql-server vb.net visual-studio-2010 sqlcommand datareader

我有这段代码没有从datareader填充组合框。我做了各种检查,并确认数据库正在连接,查询也是正确的。 Databaseconnections是一个模块,我已经声明了我的所有变量,包括连接字符串和datareader(Public dr As SqlDataReader)。当debbuging一切顺利但当我点击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

3 个答案:

答案 0 :(得分:0)

我觉得你从读者那里读了两次,第一次是你检查IF dr.Read() THEN而第二次是While dr.Read,如果你有一个项目就不会被添加。

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

答案 1 :(得分: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

也许将你的连接,命令和读者包裹在使用块中,以确保它们也被正确处理掉。

答案 2 :(得分: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));