2012-05-03 3 views
0

SQLite 데이터베이스의 쿼리를 ComboBox의 AutocompleteCustomSource로 사용하고 있습니다. 또한 별도의 스레드에서 데이터를로드하려고합니다. 내 LoadData 메서드는 직접 호출하면 잘 작동하지만 BackgroundWorker 스레드에서 호출하면 실패합니다. 백그라운드 스레드에서 호출 될 때 줄에 Specified cast is not valid 예외가 발생합니다. 다음은 내 코드입니다 : 우리는이에 실패한 줄 알아야합니다 것VB.NET의 백그라운드 작업자를 사용하여 백그라운드 모드로 데이터로드

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 
+0

어떤 줄에서 실패합니까? –

+0

이것을'hh ("Taj")로 변경해보십시오 ToString' – LarsTech

+0

백그라운드 작업자가 아닌 LoadData를 직접 호출하면이 작업이 실패하지 않는다는 말입니까? –

답변

0

하지만, 한 눈에, VB에서 문자열을 연결하는 대신 앰퍼샌드 더하기 기호를 사용해보십시오.

connetionString = "Data Source=" & Application.StartupPath & "\Mydatabase.db;" 
+0

그것은 여기 실패 : csearch.AutoCompleteCustomSource.Add (hh ("Taj")) –

+0

'hh ("Taj"). ToString'을 사용해 보시겠습니까? –

+0

빠른 답장을 보내 주셔서 대단히 감사합니다. 그러나 저는 이것을 시도했습니다. 오류는 동일하게 유지됩니다. –

-1

예 더하기 대신에 앰퍼샌드를 사용하십시오. VB.net은 +를 연결로 해석하지 않습니다 (더하기는 C 기반 언어로 사용됩니다). 이 방법으로 오류를 분류하지 않으면 테스트를 위해 코드 주위에 'catch catch'블록을 사용하십시오. 아래 예제를 참조하십시오.

캐치 위에 중단 점을 추가하십시오. 시계를 사용하여 오류와 관련된 모든 정보를 검사하십시오.

+0

플러스 기호는 VB.NET에서 연결되며 완벽하게 안전합니다. 내 마음 속에서'Option Strict On '을 사용한다면 더 좋습니다. 앰퍼샌드는 VB6에서는 필수적 이었지만 닷넷에서는 VB6 구문에 대한 하위 호환성을위한 약간의 해킹입니다. .NET에서 제공하는 표준 연산자 오버로딩 기능을 우회합니다. –

+0

더하기 기호에는 문제가 없지만 'backgroundworker'에 문제가 있습니다. 'LoadData()'OnFormLoad 또는 onClick 이벤트를 호출하면 잘 돌아갑니다. 'BackgroundWorker1.RunWorkerAsync()'를 통해이 하위 항목을 실행해야합니다. –

+0

오류 스크린 샷을 http://i.stack.imgur.com/BluqU에서 확인하십시오.png –

0

변경 :

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

사람 :

csearch.AutoCompleteCustomSource.Add(hh("Taj").ToString()) 
+0

빠른 답장을 보내 주셔서 감사합니다. 하지만이 모든 일을했지만 오류는 동일하게 유지됩니다 : ( –

+0

'Option Strict On '을 파일의 맨 위에 추가하여 더 유용한 메시지가 있는지 확인하십시오. –

+0

오류 스크린 샷을 http : //에서 확인하십시오. i.stack.imgur.com/BluqU.png –

0

그것은 그 캐스팅 오류가 발생 것이 이상한, 그러나 문제는 작업자 스레드에서 콤보 상자의 속성에 액세스하는 것입니다. 다른 스레드의 컨트롤이나 양식에 액세스하지 않아야합니다. UI 스레드에서 모든 UI 작업을 수행해야합니다. 이를 수행하는 일반적인 방법은 폼이나 컨트롤의 Invoke 메서드를 사용하는 것입니다.

관련 문제