0

У меня есть эта часть кода, которая не заполняет combobox из datareader. Я сделал все виды проверок и подтвердил, что база данных подключается, и запрос также верен. Databaseconnections - это модуль, где я объявил все мои переменные, включая строку соединения и datareader (Public dr As SqlDataReader). Когда debbuging все идет гладко, но когда я нажимаю цикл While, он переходит в конец цикла без каких-либо ошибок. Я не могу понять, чего не хватает. Пожалуйста помоги.У читателя данных есть строки, но не заполняется combobox

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

Это не ответ, но вы всегда, по крайней мере, пропускаете первый элемент, потому что вы делаете дополнительный 'Read'. Вы «читаете» первый элемент в 'If', а затем читаете, начиная со второго элемента в' While'. – tcarvin

ответ

0

Кажется мне, что вы читаете от читателя дважды, первый один, когда и проверить его IF dr.Read() THEN и второй один на While dr.Read и если у вас есть один элемент не будет добавлен.

Решение: вы можете использовать условие DO ... WHILE, которое позволяет вам читать в первую очередь с тех пор, как вы вызвали If dr.Read() Then (Извините, я не знаком с VB.NET, поэтому я не могу написать полный код для вас, но я надеюсь, что вы получили точка)

+0

Спасибо, позвольте мне попробовать цикл .... – Vic

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 

Возможно, ваше соединение, команда и считывающее устройство могут быть использованы в блоках, чтобы обеспечить их правильное удаление.

+0

Привет, спасибо за ответ. Я пробовал вышеуказанный код, но он все еще перескакивает цикл While. У datareader есть строки, поэтому другая часть оператора If ... Else выполняется, но тогда цикл While не выполняется. Его запутывают, какие-либо дальнейшие мысли? – Vic

+0

Так что dr.Read() возвращается False? –

+0

Да, dr.read() возвращает false. Я не могу понять, что случилось. – Vic

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));