数据阅读器有行但没有填充组合框
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
。你Read
If
中的第一项,然后从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));
【讨论】:
以上是关于数据阅读器有行但没有填充组合框的主要内容,如果未能解决你的问题,请参考以下文章