見出し画像

【競馬】Visual C# で JRA-VAN DataLab. のデータを取得する

Visual C# で JV-Link を操作することにより、JRA-VAN DataLab. が提供する競馬データを取得することができます。

今回は Visual C# を使って簡単な競馬ソフトを作りたいと思います。

1. 動作環境

  • OS : Windows

どこまで古いバージョンで動作するかは分からないですが、Windows 10 以降であれば問題ないはずです。

私の使っている環境は

  • Windows 11 Home (64bit 版)

です。

2. JV-Link のインストール

こちらのページの [動作確認 (JV-Link)] のタブからインストーラーをダウンロードしてインストールおよび初期設定を行って下さい。
※ 使用するには JRA-VAN DataLab. の会員登録が必要です。

3. Visual Studio 2019 のインストール

Visual Studio Installer を使って Visual Studio Community 2019 をインストールします。
ワークロードには [デスクトップとモバイル] > [.NET デスクトップ開発] を選択します。
※ Visual Studio 2019 を使用して下さい。Visual Studio 2020 は IDE 自体が 64bit 化されたためか、この記事の手順ではうまくいきません。

4. 新規プロジェクトの作成

Visual Studio 2019 を起動し、[新しいプロジェクトの作成] をクリックします。

プロジェクト テンプレートから C# 用の [Windows フォーム アプリケーション (.NET Framework)] を選択し、[次へ] ボタンをクリックします。
※ [Windows フォーム アプリ] の方ではないので注意して下さい。

プロジェクト名、場所、ソリューション名を設定し、[作成] ボタンをクリックします。
プロジェクト名、ソリューション名はデフォルトの [WindowsFormsApp1] としています。

新規のプロジェクトが作成されました。

画面左端の [ツールボックス] タブをクリックします。

ツールボックス パネルが開いたら、ピンマークをクリックしツールボックス パネルを固定します。

5. JVLink Class の表示(初回のみ)

ツールボックス内の [全般] を右クリックし、[アイテムの選択] をクリックします。

ツールボックス アイテムの選択画面が開きます。

[COM コンポーネント] タブを開き、[JVLink Class] にチェックを入れ、[OK] ボタンをクリックします。

ツールボックス内に [JVLink Class] が表示されれば OK です。

※ JVLink Class の表示は一度行えば設定が保存されます。

6. プロジェクトの作成

ツールボックス内の [コモン コントロール] > [Button] をフォーム上に配置します。

IDE 画面右下のプロパティの Name はデフォルトの [button1] としています。

ツールボックス内の [全般] > [JVLink Class] をフォーム上に配置します。
※ JVLink Class は実行時に表示されないので、レイアウトを気にする必要はありません。

Name はデフォルトの [axJVLink1] としています。

デザインビューのフォームを選択し、プロパティをイベント タブに切り替え、[Load] の右側の空欄をダブルクリックします。

Form1_Load メソッドが追加された状態でコードエディタが開きます。

Form1_Load メソッドの中身を下記コードで上書きします。

        private void Form1_Load(object sender, EventArgs e)
        {
            string sid = "UNKNOWN";
            int returnCode;

            // JVLink初期化
            returnCode = axJVLink1.JVInit(sid);

            // JVInitエラー処理
            if (returnCode != 0)
            {
                MessageBox.Show("JVInitエラー:" + returnCode);
                return;
            }
        }

デザインビューのフォーム上の button1 をダブルクリックします。

button1_Click メソッドが追加されます。

button1_Click メソッドの中身を下記コードで上書きします。

        private void button1_Click(object sender, EventArgs e)
        {
            int returnCode;
            int buffSize = 40000;
            string buff;
            string fileName;
            string raceName;
            string raceNames = "";

            // 速報系データの0B12を呼び出し
            // 日付は直近の土日を指定して下さい
            returnCode = axJVLink1.JVRTOpen("0B12", "20230430");

            // JVRTOpenエラー処理
            if (returnCode != 0)
            {
                MessageBox.Show("JVRTOpen エラー:" + returnCode);
                return;
            }

            returnCode = 1;
            while (returnCode != 0)
            {
                returnCode = axJVLink1.JVRead(out buff, out buffSize, out fileName);

                // JVReadエラー処理
                if (returnCode < -1)
                {
                    MessageBox.Show("JVRead エラー:" + returnCode);
                    break;
                }
                else if (returnCode == -1)
                {
                    continue;
                }
                else if (returnCode == 0)
                {
                    break;
                }

                if (buff.Substring(0, 2) == "RA")
                {
                    // レース名を抽出し末尾のスペースを除去
                    raceName = buff.Substring(32, 30).TrimEnd();
                    // レース名が空文字でなければレース名一覧に結合
                    if (raceName != "")
                    {
                        raceNames += raceName + Environment.NewLine;
                    }
                }
            }

            // レース名一覧を表示
            MessageBox.Show(raceNames);

            // JVLink 終了処理
            returnCode = axJVLink1.JVClose();
        }

12 行目の

            returnCode = axJVLink1.JVRTOpen("0B12", "20230430");

の日付部分は直近の土日(中央競馬のレースが開催された日)を yyyymmdd 形式で指定して下さい。
※ このコードで取得している速報系データはレース後 1 週間程で配信されなくなるので、古い開催日を指定してもデータは取得できません。

7. 動作確認

[開始] ボタンをクリックします。

Form1 が表示されたら、button1 をクリックします。

メッセージボックスにレース名が表示されれば OK です。

レース開催が無い日や、古い開催日をコード内で指定している場合は下図のようなエラーが発生します。

この記事が気に入ったらサポートをしてみませんか?