数据阅读器有行但没有填充组合框

Posted

技术标签:

【中文标题】数据阅读器有行但没有填充组合框【英文标题】:Data reader has rows but not populating combobox 【发布时间】:2013-03-20 12:25:44 【问题描述】:

我有这段代码没有从 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

【问题讨论】:

这不是答案,但您至少总是跳过第一项,因为您正在做一个额外的Read。你ReadIf中的第一项,然后从While中的第二项开始阅读。 【参考方案1】:

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

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

【讨论】:

谢谢,让我试试 Do...while 循环。【参考方案2】:

试试这个。 @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

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

【讨论】:

您好,感谢您的回复。我已经尝试了上面的代码,但它仍然会跳转 While 循环。数据读取器有行,这就是为什么执行 If...Else 语句的 else 部分但没有执行 While 循环的原因。它令人困惑,还有什么进一步的想法吗? 所以 dr.Read() 返回 False? dr 和 Databaseconnections.dr 是一回事吗?你有明确的选项吗?【参考方案3】:

我会尝试通过 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));

【讨论】:

以上是关于数据阅读器有行但没有填充组合框的主要内容,如果未能解决你的问题,请参考以下文章

组合框选项的部分刷新

如何从数据库查询中填充组合框?

似乎无法在 Extjs 中远程填充组合框

Visual Basic - 使用组合框将 Access 表中的数据填充到文本框

单击时在JavaFX中填充组合框

组合框是自动填充选项,如何让它为空