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();
}
}
以上。




