基礎プログラム~JVデータ挿入編②~
⑤JV-Dataを読み込んでレコードを挿入する
ここからはフォームの作成とJV-Linkの初期化が済んでいることが前提になります。ボタンを押すとreadJvDataを呼び出してJV-Dataの読み込みを開始し、カラム名や挿入する内容を指定したパラメータをArrayListに追加していき、最後はそのArrayListを渡して挿入していく流れになっています。
Public Class DataSetupForm Private tokuumaData As JV_TK_TOKUUMA '特別登録情報構造体 Private Const DATA_SPEC_TOKUBETSU_TOROKU As String = "TOKU" Private Sub btnGetJvData_Click(sender As Object, e As EventArgs) Handles btnGetJvData.Click readJvData(DATA_SPEC_TOKUBETSU_TOROKU, 2, "20160101000000") End Sub 'パラメータを一括でセットするためのメソッド Public Sub setAllParams(paramList As ArrayList, columnName As String, dataType As MySql.Data.MySqlClient.MySqlDbType, maxLength As Integer, value As String) Dim params As New DbParams params.columnName = columnName params.dataType = dataType params.maxLength = maxLength params.value = value paramList.Add(params) End Sub 'JV-Dataを読み込むためのメソッド Private Sub readJvData(dataSpec As String, jvOption As Long, fromTime As String) DbConnector.getInstance.beginTransaction() Dim returnCode As Long Try Dim readCount As Long Dim downloadCount As Long '' JVOpen:総ダウンロードファイル数 Dim lastFileTimestamp As String '' JVOpen: 最新ファイルのタイムスタンプ゚ Const BUFFER_SIZE As Long = 110000 ''JVRead:データ格納バッファサイズ Const FILE_NAME_SIZE As Integer = 256 ''JVRead:ファイル名サイズ Dim buffer As String ''JVRead:データ格納バッファ Dim fileName As String ''JVRead:ダウンロードファイル名 returnCode = TopForm.jvLink.JVOpen(dataSpec, fromTime, jvOption, readCount, downloadCount, lastFileTimestamp) If returnCode <> 0 Then MsgBox("JVOpenエラー:" & returnCode) Else MsgBox("戻り値 : " & returnCode & vbCrLf & "読み込みファイル数 : " & readCount & vbCrLf & "ダウンロードファイル数 : " & downloadCount & vbCrLf & "タイムスタンプ : " & lastFileTimestamp) If readCount > 0 Then Do buffer = New String(vbNullChar, BUFFER_SIZE) fileName = New String(vbNullChar, FILE_NAME_SIZE) returnCode = TopForm.jvLink.JVRead(buffer, BUFFER_SIZE, fileName) Select Case returnCode Case 0 ' 全ファイル読み込み終了 Exit Do Case -1 ' ファイル切り替わり Case -3 ' ダウンロード中 Case -201 ' Init されてない MsgBox("JVInit が行われていません。") Exit Do Case -203 ' Open されてない MsgBox("JVOpen が行われていません。") Exit Do Case -503 ' ファイルがない MsgBox(fileName & "が存在しません。") Exit Do Case Is > 0 ' 正常読み込み insert(buffer) End Select Loop While (1) End If End If Catch ex As Exception DbConnector.getInstance.rollback(ex.ToString, True) Exit Sub End Try returnCode = TopForm.jvLink.JVClose() If returnCode <> 0 Then DbConnector.getInstance.rollback("ReturnCode:" & returnCode, True) MsgBox("JVClse エラー:" & returnCode) End If DbConnector.getInstance.commit() End Sub '読み込んだバッファを受け取ってレコードを挿入するためのメソッド Private Sub insert(buffer As String) Dim recordSpec As String = Mid(buffer, 1, 2) Select Case recordSpec Case "TK" '特別登録 tokuumaData.SetData(buffer) Dim paramList As ArrayList = createTokubetsuTorokuParamList() DbEditor.getInstance.insert(TableConstants.TABLE_NAME_TOKUBETSU_TOROKU, paramList) End Select End Sub '特別登録のパラメータリストを生成するためのメソッド Public Function createTokubetsuTorokuParamList() As ArrayList Dim paramList As New ArrayList setAllParams(paramList, "record_spec", MySql.Data.MySqlClient.MySqlDbType.VarChar, 2, RTrim(tokuumaData.head.RecordSpec)) setAllParams(paramList, "data_flag", MySql.Data.MySqlClient.MySqlDbType.VarChar, 1, RTrim(tokuumaData.head.DataKubun)) setAllParams(paramList, "make_date", MySql.Data.MySqlClient.MySqlDbType.VarChar, 8, RTrim((tokuumaData.head.MakeDate.Year & tokuumaData.head.MakeDate.Month & tokuumaData.head.MakeDate.Day))) setAllParams(paramList, "year", MySql.Data.MySqlClient.MySqlDbType.VarChar, 4, RTrim(tokuumaData.id.Year)) setAllParams(paramList, "month_day", MySql.Data.MySqlClient.MySqlDbType.VarChar, 4, RTrim(tokuumaData.id.MonthDay)) setAllParams(paramList, "place_code", MySql.Data.MySqlClient.MySqlDbType.VarChar, 2, RTrim(tokuumaData.id.JyoCD)) setAllParams(paramList, "hold_count", MySql.Data.MySqlClient.MySqlDbType.VarChar, 2, RTrim(tokuumaData.id.Kaiji)) setAllParams(paramList, "hold_day", MySql.Data.MySqlClient.MySqlDbType.VarChar, 2, RTrim(tokuumaData.id.Nichiji)) setAllParams(paramList, "race_number", MySql.Data.MySqlClient.MySqlDbType.VarChar, 2, RTrim(tokuumaData.id.RaceNum)) setAllParams(paramList, "week_code", MySql.Data.MySqlClient.MySqlDbType.VarChar, 1, RTrim(tokuumaData.RaceInfo.YoubiCD)) setAllParams(paramList, "race_name_main", MySql.Data.MySqlClient.MySqlDbType.VarChar, 30, RTrim(tokuumaData.RaceInfo.Hondai)) setAllParams(paramList, "race_name_sub", MySql.Data.MySqlClient.MySqlDbType.VarChar, 30, RTrim(tokuumaData.RaceInfo.Fukudai)) setAllParams(paramList, "race_name_alias", MySql.Data.MySqlClient.MySqlDbType.VarChar, 30, RTrim(tokuumaData.RaceInfo.Kakko)) setAllParams(paramList, "race_name_main_eng", MySql.Data.MySqlClient.MySqlDbType.VarChar, 120, RTrim(tokuumaData.RaceInfo.HondaiEng)) setAllParams(paramList, "race_name_short_a", MySql.Data.MySqlClient.MySqlDbType.VarChar, 10, RTrim(tokuumaData.RaceInfo.Ryakusyo10)) setAllParams(paramList, "race_name_short_b", MySql.Data.MySqlClient.MySqlDbType.VarChar, 6, RTrim(tokuumaData.RaceInfo.Ryakusyo6)) setAllParams(paramList, "race_name_short_c", MySql.Data.MySqlClient.MySqlDbType.VarChar, 3, RTrim(tokuumaData.RaceInfo.Ryakusyo3)) setAllParams(paramList, "race_name_group", MySql.Data.MySqlClient.MySqlDbType.VarChar, 1, RTrim(tokuumaData.RaceInfo.Kubun)) Dim sbHorseName As New Text.StringBuilder Dim sbBloodNumber As New Text.StringBuilder For c = 0 To tokuumaData.TokuUmaInfo.Length - 1 Dim _horseName As String = RTrim(tokuumaData.TokuUmaInfo(c).Bamei) Dim _bloodNumber As String = RTrim(tokuumaData.TokuUmaInfo(c).KettoNum) If 0 < _horseName.Length Then sbHorseName.Append(_horseName) sbHorseName.Append(",") sbBloodNumber.Append(_bloodNumber) sbBloodNumber.Append(",") End If Next sbHorseName.Remove(sbHorseName.Length - 1, 1) sbBloodNumber.Remove(sbBloodNumber.Length - 1, 1) setAllParams(paramList, "horse_name", MySql.Data.MySqlClient.MySqlDbType.Text, 3000, sbHorseName.ToString) setAllParams(paramList, "blood_number", MySql.Data.MySqlClient.MySqlDbType.Text, 3000, sbBloodNumber.ToString) setAllParams(paramList, "grade_count", MySql.Data.MySqlClient.MySqlDbType.VarChar, 3, RTrim(tokuumaData.RaceInfo.Nkai)) setAllParams(paramList, "grade_code", MySql.Data.MySqlClient.MySqlDbType.VarChar, 1, RTrim(tokuumaData.GradeCD)) setAllParams(paramList, "race_type_code", MySql.Data.MySqlClient.MySqlDbType.VarChar, 2, RTrim(tokuumaData.JyokenInfo.SyubetuCD)) setAllParams(paramList, "race_mark_code", MySql.Data.MySqlClient.MySqlDbType.VarChar, 3, RTrim(tokuumaData.JyokenInfo.KigoCD)) setAllParams(paramList, "weight_type_code", MySql.Data.MySqlClient.MySqlDbType.VarChar, 1, RTrim(tokuumaData.JyokenInfo.JyuryoCD)) setAllParams(paramList, "race_condition_code_age_2", MySql.Data.MySqlClient.MySqlDbType.VarChar, 3, RTrim(tokuumaData.JyokenInfo.JyokenCD(0))) setAllParams(paramList, "race_condition_code_age_3", MySql.Data.MySqlClient.MySqlDbType.VarChar, 3, RTrim(tokuumaData.JyokenInfo.JyokenCD(1))) setAllParams(paramList, "race_condition_code_age_4", MySql.Data.MySqlClient.MySqlDbType.VarChar, 3, RTrim(tokuumaData.JyokenInfo.JyokenCD(2))) setAllParams(paramList, "race_condition_code_age_5", MySql.Data.MySqlClient.MySqlDbType.VarChar, 3, RTrim(tokuumaData.JyokenInfo.JyokenCD(3))) setAllParams(paramList, "race_condition_code_young", MySql.Data.MySqlClient.MySqlDbType.VarChar, 3, RTrim(tokuumaData.JyokenInfo.JyokenCD(4))) setAllParams(paramList, "distance", MySql.Data.MySqlClient.MySqlDbType.VarChar, 4, RTrim(tokuumaData.Kyori)) setAllParams(paramList, "track_code", MySql.Data.MySqlClient.MySqlDbType.VarChar, 2, RTrim(tokuumaData.TrackCD)) setAllParams(paramList, "course_group", MySql.Data.MySqlClient.MySqlDbType.VarChar, 2, RTrim(tokuumaData.CourseKubunCD)) setAllParams(paramList, "handicap_date", MySql.Data.MySqlClient.MySqlDbType.VarChar, 8, RTrim((tokuumaData.HandiDate.Year & tokuumaData.HandiDate.Month & tokuumaData.HandiDate.Day))) setAllParams(paramList, "entry_number", MySql.Data.MySqlClient.MySqlDbType.VarChar, 3, RTrim(tokuumaData.TorokuTosu)) Return paramList End Function End Class
⑥実行結果
レコード挿入後、tokubetsu_torokuテーブルを参照するとレコードが挿入されていることが確認できます。JV-Dataは全て固定長なので取り出した時データの末尾に余分なスペースが入っていますが、このサンプルではRTrim()でその余白を削除してあります。
それからゼロ詰めの項目も多いので、挿入する際に予め先頭のゼロを取っておくと後で扱いやすくなると思います。