コード Private Sub Cmd_FileInput_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cmd_FileInput.Click Dim i As Integer = 0
Try 'データの挿入 ファイル名+現在の日付 For i = 0 To ListBox1.Items.Count - 1 'テキストファイル名の取得 FileName = ListBox1.Items(i) ' 別スレッドでのデータの取込を開始 Me.BackgroundWorker1.RunWorkerAsync() Next i
Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub
' このメソッドは別スレッドで実行される Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Dim Reader As New IO.StreamReader(FileName, System.Text.Encoding.Default) Dim Line As String = Reader.ReadLine 'CSVの一行 Dim Cnt As Integer = 0
Try Do Until IsNothing(Line)
'テキストファイルからDBへインポートする処理
Line = Reader.ReadLine '次の行を読み込む。 Cnt = Cnt + 1
Loop 'テキストの読み込みを終了 Reader.Close()
Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub
分類:[.NET]
フォルダからテキストファイルを取得して、csvデータをデータベースに書き込む
プログラムを作成しています。
1.フォルダからテキストファイル名を取得します。
2.ファイル名一覧をリストBOXに表示します。
3.リストBOXに表示されたファイル名を取得して、テキストのインポートをします。
4.テキストファイルは13万行あるので、中止ができるようにスレッドを使います。
5.ファイルリストの上から順に自動的にテキストをDBにインポートしたい。
6.スレッドは、2.0から使用できる BackgroundWorkerを使いました。
上記の動作を実現するために、リストBOX、ボタンをフォーム上に配置し、
下記のコードを記述しましたが、フォームのイベントが先に走ってしまい
BackgroundWorkerが複数起動してしまいエラーが発生します。
mutexを使えばいいかもと思いましたが、スレッド間ではない為、使用方法がわかりません。
ご教授をよろしくお願いいたします。
コード
Private Sub Cmd_FileInput_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cmd_FileInput.Click
Dim i As Integer = 0
Try
'データの挿入 ファイル名+現在の日付
For i = 0 To ListBox1.Items.Count - 1
'テキストファイル名の取得
FileName = ListBox1.Items(i)
' 別スレッドでのデータの取込を開始
Me.BackgroundWorker1.RunWorkerAsync()
Next i
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
' このメソッドは別スレッドで実行される
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim Reader As New IO.StreamReader(FileName, System.Text.Encoding.Default)
Dim Line As String = Reader.ReadLine 'CSVの一行
Dim Cnt As Integer = 0
Try
Do Until IsNothing(Line)
'テキストファイルからDBへインポートする処理
Line = Reader.ReadLine '次の行を読み込む。
Cnt = Cnt + 1
Loop
'テキストの読み込みを終了
Reader.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub