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