参考
前回記事
JV-LinkをC#で使ってみる(Console版) ~5.コード変換を行う~
WinForms版
JV-LinkをC#で使ってみる(WinForms版) ~6.JV-Dataの内容を読み出す 応用編(1+2)~
今回のソースコード
source – JV-LinkをC#で使ってみる(Console版) ~6.JV-Dataの内容を読み出す 応用編(1+2)~
開発環境
- Windows7 64ビット版
- Visual Studio Community 2017
- JV-Link Ver.4.5.1
各種ライブラリについて
ADOユーティリティクラスの追加
WinForms版で一度解説しましたが、 JV-Data の内容をAccessデータベースへ取り込むためには専用のクラス「ADO ユーティリティクラス」のVB版がサンプルとして公開されており、それをC#用に移植して使用いたします。「ADOユーティリティクラス」の解説についてはWinForms版の解説を参照してください。ソリューションエクスプローラーから「JVData_ADOUtility.cs」を既存の項目で追加します。(コメント等を修正していますので、WinForms版とは別に新しくアップロードしました。)
コード変換クラスの追加
前回作成した「コード変換クラス」について、コメント等を修正していますので、新しくアップロードしました。ソリューションエクスプローラーから「JVData_CodeConv.cs」を既存の項目で追加します。
JV-Data構造体の追加
『JRA-VAN Data Lab. SDK』に付属の「JV-Data構造体(JVData_Struct.cs)」を既存の項目で追加します。
メインコードの作成
データソースの追加
WinForms版と全く一緒になりますので割愛します。
メインプログラムの解説
過去から使ってきた「Program.cs」のコメントを整理して全て書き直しましたので、一からコメントしていきます。
- 11~15行目
WinForms版で使用したプログレスバーを再現した独自構造体を宣言しています。
struct ProgressBar
{
public int Maximum { set; get; }
public int Value { set; get; }
}
- 17~18行目
コンソールプログラムでのエントリーポイントです。 JV-Link はマルチスレッド動作の保証がないため、[STAThread]の記載は必須となります。(コレが無いと強制終了します。)
[STAThread]
static void Main(string[] args)
- 21行目
JV-Link オブジェクトのインスタンスを作成しています。当然ですが、 JV-Link オブジェクトのインスタンスを最初に作成していないと、後の処理で JV-Link の機能が使用できません。
var jvLink = new JVDTLabLib.JVLink();
- 25行目
JV-Link 設定ダイアログを表示しています。外部で別途設定が完了している場合、この機能の呼び出しは必須ではありません。
jvLink.JVSetUIProperties();
- 29行目
JV-Link インスタンスの初期化をしています。引数のSIDはアプリケーションを配布する場合以外は気にしなくても問題はありません。基本的には”UNKNOWN”を使用します。
jvLink.JVInit("UNKNOWN");
- 33~43行目
JV-Data をダウンロードします。JVOpen()関数のそれぞれの引数の意味については、仕様書を参照してください。
var nReadCount = 0; // JVOpen: 総読み込みファイル数
var nDownloadCount = 0; // JVOpen: 総ダウンロードファイル数
var strLastFileTimestamp = ""; // JVOpen: 最新ファイルのタイムスタンプ
jvLink.JVOpen("RACE", "20180801000000", 2, ref nReadCount, ref nDownloadCount, out strLastFileTimestamp);
Console.WriteLine(
"読み込みファイル数 : " + nReadCount + "\n" +
"ダウンロードファイル数 : " + nDownloadCount + "\n" +
"タイムスタンプ : " + strLastFileTimestamp + "\n"
);
- 47~60行目
プログレスバー構造体のインスタンスを作成しています。ダウンロード用、データ読み込み用の2つのインスタンスを作成して初期化しています。
var prgDownload = new ProgressBar();
var prgJVRead = new ProgressBar();
if (nDownloadCount == 0)
{
prgDownload.Maximum = 100;
prgDownload.Value = 100;
}
else
{
prgDownload.Maximum = nDownloadCount;
prgDownload.Value = 0;
}
prgJVRead.Maximum = nReadCount;
prgJVRead.Value = 0;
- 64~65行目
コード変換クラスのインスタンスを作成しています。使わなくても問題ありません。
var cv = new JVData_CodeConv();
cv.FileOpen("CodeTable.csv");
- 69~71行目
データセットの作成とテーブルアダプタの作成を行っています。
using (var jvdds = new DataDataSet()) // JV-Data データセット
using (var raceTA = new DataDataSetTableAdapters.RACETableAdapter()) // レース詳細のテーブルアダプタ
using (var umaRaceTA = new DataDataSetTableAdapters.UMA_RACETableAdapter()) // 馬毎レース情報のテーブルアダプタ
- 74~79行目
データベース内のデータの削除を行うか確認しています。
Console.WriteLine("データソース内のデータを削除しますか?(y/n)");
if (Console.ReadLine() == "y")
{
if (DeleteDBTable(jvdds.RACE.TableName, Properties.Settings.Default.DataConnectionString) < 0) return;
if (DeleteDBTable(jvdds.UMA_RACE.TableName, Properties.Settings.Default.DataConnectionString) < 0) return;
}
- 83~84行目
データソースからデータセットへ全てのデータを読み込んでいます。
raceTA.Fill(jvdds.RACE);
umaRaceTA.Fill(jvdds.UMA_RACE);
- 88~98行目
JV-Data を読み込んでいます。JVRead()関数のそれぞれの引数の意味については、仕様書を参照してください。
var nBuffSize = 110000; // JVRead: データ格納バッファサイズ
var nNameSize = 256; // JVRead: ファイル名サイズ
var strBuff = new string('\0', nBuffSize); // JVRead: データ格納バッファ
var strFileName = new string('\0', nNameSize); // JVRead: 読み込み中ファイル名
var raceInfo = new JV_RA_RACE(); // レース詳細情報構造体
var raceUmaInfo = new JV_SE_RACE_UMA(); // 馬毎レース情報構造体
bool flg_exit = false;
do
{
switch (jvLink.JVRead(out strBuff, out nBuffSize, out strFileName))
- 99~155行目
JV-Data の処理を行っています。
{
#region JVData 読み込み(異常系)
case -1: // ファイル切り替わり
prgJVRead.Value = prgJVRead.Value + 1;
Console.WriteLine("ファイル切り替わり: " + prgJVRead.Value + " / " + prgJVRead.Maximum + "\n");
break;
case -3: // ダウンロード中
prgDownload.Value = jvLink.JVStatus();
Console.WriteLine("ダウンロード中: " + prgDownload.Value + " / " + prgDownload.Maximum + "\n");
break;
case -201: // JVInit されてない
flg_exit = true;
Console.WriteLine("JVInit が行われていません。");
break;
case -203: // JVOpen されてない
flg_exit = true;
Console.WriteLine("JVOpen が行われていません。");
break;
case -503: // ファイルがない
flg_exit = true;
Console.WriteLine(strFileName + "が存在しません。");
break;
#endregion
#region JVData 読み込み(正常系)
case 0: // 全ファイル読み込み終了
prgDownload.Value = prgDownload.Maximum;
prgJVRead.Value = prgJVRead.Maximum;
flg_exit = true;
Console.WriteLine("全ファイル読み込み終了: " + prgJVRead.Value + " / " + prgJVRead.Maximum + "\n");
break;
case int ret when ret > 0:
switch (strBuff.Substring(0, 2))
{
case "RA":
// レース詳細構造体への展開
raceInfo.SetDataB(ref strBuff);
// 読み込んだ情報をデータセットへ格納する
SetJVDataRaceDataSet(raceInfo, jvdds);
break;
case "SE":
// 馬毎レース情報構造体への展開
raceUmaInfo.SetDataB(ref strBuff);
// 読み込んだ情報をデータセットへ格納する
SetJVDataUmaRaceDataSet(raceUmaInfo, jvdds);
break;
default:
// 読み飛ばし
jvLink.JVSkip();
prgJVRead.Value = prgJVRead.Value + 1;
Console.WriteLine("読み飛ばし: " + prgJVRead.Value + " / " + prgJVRead.Maximum + "\n");
break;
}
break;
#endregion
}
}
while (!flg_exit);
- 159行目
JV-Link オブジェクトのインスタンスを終了しています。今回のプログラムでは、これ以降は JV-Link を利用しません。
jvLink.JVClose();
- 163~170行目
データソース内へデータの書き込みを行うか確認しています。
Console.WriteLine("取得したデータをデータソース内へ反映しますか?(y/n)");
if (Console.ReadLine() == "y")
{
// レース詳細を反映
raceTA.Update(jvdds.RACE);
// 馬毎レース情報を反映
umaRaceTA.Update(jvdds.UMA_RACE);
}
- 180~181行目
データセットからレース詳細データを検索しています。
// レース詳細の検索
var raceDRs = jvdds.RACE.Select( "RaceNum = '11' AND YoubiCD = '2'" );
- 192~204行目
レース詳細構造体へデータを読み込みます。
// レース詳細を構造体にセット
SetJVDataRaceStructure(raceDR, ref raceInfo);
// 画面表示
Console.WriteLine(
"年:" + raceInfo.id.Year +
" 月日:" + raceInfo.id.MonthDay +
" 曜日:" + cv["2002", raceInfo.RaceInfo.YoubiCD, 3] +
" 場:" + cv["2001", raceInfo.id.JyoCD, 1] +
" 回次:" + raceInfo.id.Kaiji +
" 日次:" + raceInfo.id.Nichiji +
" R:" + raceInfo.id.RaceNum +
" レース名:" + raceInfo.RaceInfo.Ryakusyo10 +
"\n");
- 206~214行目
データセットから馬毎レース情報データを検索しています。レース詳細データよりも検索条件(キー)が多く必要です。
// 馬毎レース情報の検索
var raceUmaDRs = jvdds.UMA_RACE.Select(
"Year = '" + raceInfo.id.Year + "' AND " +
"MonthDay = '" + raceInfo.id.MonthDay + "' AND " +
"JyoCD = '" + raceInfo.id.JyoCD + "' AND " +
"Kaiji = '" + raceInfo.id.Kaiji + "' AND " +
"Nichiji = '" + raceInfo.id.Nichiji + "' AND " +
"RaceNum = '" + raceInfo.id.RaceNum + "'"
);
- 216~228行目
馬毎レース情報構造体へデータを読み込みます。
// 馬毎レース情報の画面表示
foreach (var raceUmaDR in raceUmaDRs)
{
// 馬毎レース情報を構造体にセット
SetJVDataUmaRaceStructure(raceUmaDR, ref raceUmaInfo);
// 画面表示
Console.WriteLine(
" 枠:" + raceUmaInfo.Wakuban +
" 馬番:" + raceUmaInfo.Umaban +
" 馬名:" + raceUmaInfo.Bamei +
" 騎手:" + raceUmaInfo.KisyuRyakusyo +
"\n");
}
動作確認
コードの編集が完了したらプログラムを実行して動作を確認します。
以上で、 JV-Data の内容のデータベース読み出しが完了となります。(ソースが整理出来たところで少し満足いたしました。)