0

データリーダーからコンボボックスにデータを入力していないこのコードがあります。あらゆる種類のチェックを行い、データベースが接続されており、クエリも正しいことを確認しました。Databaseconnections は、接続文字列と datareader(Public dr As SqlDataReader) を含むすべての変数を宣言したモジュールです。デバッグ中はすべてがスムーズに進みますが、Wh​​ile ループにヒットすると、エラーなしでループの最後にジャンプします。何が欠けているのか理解できません。助けてください。

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
4

3 に答える 3

0

SQL Server プロファイラーでクエリをチェックしてから、SSMS でクエリを実行して、何が起こっているかを確認します。AMgdy と David Osborne が気づいたことは正しいですが、1 行以上を期待していると思います (そうでなければ、while ループを使用していないでしょう)。

もう 1 つの提案は、文字列連結の代わりにパラメーターを使用することです。これは 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));
于 2013-03-21T10:26:55.063 に答える
0

リーダーから 2 回読んだようです。1 回目はチェックしIF dr.Read() THEN、2 回目はオンにWhile dr.Readしていて、1 つの項目がある場合は追加されません。

解決策:DO ... WHILE呼び出してから最初に読み取ることができる条件を使用できますIf dr.Read() Then (申し訳ありませんが、私は VB.NET に精通していないため、完全なコードを書くことはできませんが、要点を理解していただければ幸いです)。

于 2013-03-20T12:52:34.497 に答える
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

ブロックを使用して接続、コマンド、リーダーをラップして、それらが正しく破棄されるようにすることもできます。

于 2013-03-20T13:38:43.563 に答える