0

ComboBox の AutocompleteCustomSource として SQLite データベースからのクエリを使用しています。また、別のスレッドでデータをロードしたい。私の LoadData メソッドは、直接呼び出された場合は正常に動作しますが、BackgroundWorker スレッドから呼び出された場合は失敗します。Specified cast is not validバックグラウンド スレッドから呼び出されると、その行で例外がスローされcsearch.AutoCompleteCustomSource.Add(hh("Taj"))ます。以下は私のコードです:

Sub LoadData()

        Dim connetionString As String
        Dim cnn As SQLiteConnection
        connetionString = "Data Source=" + Application.StartupPath + "\Mydatabase.db;"
        cnn = New SQLiteConnection(connetionString)
        cnn.Open()
        Dim sqlComm88 As New SQLiteCommand("SELECT Taj FROM Taj_deu ", cnn)
        Dim hh As SQLiteDataReader = sqlComm88.ExecuteReader()
        While hh.Read()
            csearch.AutoCompleteCustomSource.Add(hh("Taj"))
        End While

    End Sub



Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

        Call loaddata()

    End Sub



 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        BackgroundWorker1.RunWorkerAsync()

    End Sub
4

4 に答える 4

0

キャスト エラーが発生するのは奇妙ですが、問題はワーカー スレッドから ComboBox のプロパティにアクセスしていることです。別のスレッドからコントロールやフォームにアクセスすることは想定されていません。UI スレッドですべての UI 作業を行う必要があります。これを行う典型的な方法は、フォームまたはコントロールのInvokeメソッドを使用することです。

于 2012-05-03T15:06:29.280 に答える
0

変化する:

 csearch.AutoCompleteCustomSource.Add(hh("Taj"))

に:

 csearch.AutoCompleteCustomSource.Add(hh("Taj").ToString())
于 2012-05-03T14:24:20.983 に答える
0

どの行で失敗したかを知る必要がありますが、一見すると、プラス記号の代わりにアンパサンドを使用して、VB で文字列を連結してみてください。

connetionString = "Data Source=" & Application.StartupPath & "\Mydatabase.db;"
于 2012-05-03T14:04:04.387 に答える
-1

はい、プラスの代わりにアンパサンドを使用してください。VB.net は + を連結として解釈しません (プラスは C ベースの言語で使用されます)。これでエラーが解決されない場合は、コードの周りに「try catch」ブロックを使用してテストします。例については、以下を参照してください。

キャッチの上にブレーク ポイントを追加します。時計を使用して、エラーに関するすべての情報を調べます。

于 2012-05-03T14:18:15.163 に答える