JRA-VAN Datalab JV-Link のチュートリアルを見ながら Visual Studio 2019 C# に書き直す
JRA-VAN Datalab JV-Link を Visual Studio2019 C#で使用できるようになったので、実際にデータを取得してみる。
引き続き、開発ガイドのサンプルを見ながら。機能の確認をしたいだけなので、画面の作り込みはしない(プログレスバーとか)で、デバッグコンソールに結果を表示させるだけ。
結果が以下。
準備
データ構造体を、SDKから取込む
JRA-VAN Data Lab. SDK Ver4.5.1.5\Win\JV-Data構造体\C#版\JVData_Struct.cs
ダウンロードされるデータが、Shift_JISなので、構造体定義の処理でコーデックの変換エラーが発生する。
System.ArgumentException: ”Shift_JIS’ is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. ‘
Encodeの拡張をNuGetからインストールする。
プロジェクト – NuGetパッケージの管理から、System .Text .Encoding.CodecPages をインストールし、
以下のコードを、コンストラクタにでも書いておく。
using System.Text; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
データ取得ボタンのコード
private void btnGetData_Click(object sender, EventArgs e) { // データ読み出し処理の一般的な流れ int returnCode = 0; int readCount = 0; int downloadCount = 0; try { // ①JVLinkノ初期化(JVInit) // JVLinkの初期化を行います。JVOpenを呼び出す前に最低1回呼び出す必要があります。 returnCode = this.jVLink.JVInit("UNKNOW"); if (returnCode < 0) { MessageBox.Show($"JVInitエラー。 RC={returnCode}"); return; } // ②JVDataノオープン(JVOpen) // 要求に応じたデータを読み出せるように準備します。 // 必要であればサーバーからデータをダウンロードする処理を起動します。 // JVOpenからの戻りとしてダウンロードを行なう予定ファイル数が返されます。 string dataSpec = "RACE"; // データ種別に「レース情報」を設定 string fromTime = "20201101000000"; // Fromタイムに2020年11月1日を設定 int optionFlag = 2; // オプションに「今週データ」を設定 returnCode = this.jVLink.JVOpen(dataSpec, fromTime, optionFlag, ref readCount, ref downloadCount, out string lastFileTimestamp); if (returnCode < 0) { MessageBox.Show($"JOpenエラー。 RC={returnCode}"); return; } if (readCount == 0) { MessageBox.Show($"該当データがありません。"); return; } // ③ダウンロード中のプログレスバー表示(JVStatus) // JVOpenはダウンロードスレッドを起動するとダウンロード完了前に呼び出し側に制御を返しますので、 // 呼び出し側はJVStatusを使ってダウンロード処理の進行状況を監視する必要があります。 // JVStatusはダウンロード済みのファイル数を返しますので、JVOpen時のダウンロード予定ファイル数と一致した場合にダウンロード処理の完了とします。 int count = 0; while((count = this.jVLink.JVStatus()) < downloadCount) { Debug.WriteLine($"count;{count} <= download count;{downloadCount}"); System.Threading.Thread.Sleep(10000); } // ④JVDataノ読み出し(JVRead) // データを読み出します。ダウンロードスレッドがダウンロード実行中にJVReadを呼び出すとエラーとなります。 string recordSpec = null; JVData_Struct.JV_SE_RACE_UMA uma = new JVData_Struct.JV_SE_RACE_UMA(); string buff = null; int buffSize = 1500; string fName = null; buff = new string('\0', buffSize); if (readCount > 0) { while ((returnCode = this.jVLink.JVRead(out buff, out buffSize, out fName)) != 0) { if (returnCode > 0) { recordSpec = buff.Substring(0, 2); if (recordSpec == "SE") { uma.SetDataB(ref buff); Debug.WriteLine($"開催年月日:{uma.id.Year}{uma.id.MonthDay} 競馬場:{uma.id.JyoCD} 開催回:{uma.id.Kaiji} 開催日目:{uma.id.Nichiji} R:{uma.id.RaceNum} 枠:{uma.Wakuban} 馬番:{uma.Umaban} 馬名:{uma.Bamei}"); } else { //Debug.WriteLine($"SKIP:{recordSpec}"); } } else if (returnCode == -1) { } else { MessageBox.Show($"読み込みエラー。 RC={returnCode}"); return; } } } // ⑤データ内容をテキストボックスに表示 // 一般の競馬ソフトではこの処理の代わりにデータベースへデータを反映する処理が行なわれます。 } finally { // ⑥JVDataのクローズ(JVClose) // JVOpenで確保されたリソースを開放します。 this.jVLink.JVClose(); } }
以上。