競馬ブログ「ギャンブルからの脱却」

自作の予想ソフトを駆使して投資的競馬に挑戦。

基礎プログラム~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テーブルを参照するとレコードが挿入されていることが確認できます。
f:id:last3f:20160211193153p:plain

JV-Dataは全て固定長なので取り出した時データの末尾に余分なスペースが入っていますが、このサンプルではRTrim()でその余白を削除してあります。
それからゼロ詰めの項目も多いので、挿入する際に予め先頭のゼロを取っておくと後で扱いやすくなると思います。