• Skip to main content
  • Skip to primary sidebar
  • Skip to footer
  • Home
  • 日記
  • 競馬でプログラミング
    • JV-LinkをC#で使ってみる(WinForms版)
    • JV-LinkをC#で使ってみる(Console版)
  • このはとウェブログ
    • JavaScriptの話
    • WordPressの話
  • 私のバヌーシー出資馬について

sae-suki-blog.

  • メール
  • Instagram
  • RSS
  • Twitter

JV-LinkをC#で使ってみる(Console版) ~6.JV-Dataの内容を読み出す 応用編(1+2)~

2018-10-19 by さえきさん

目次

  • 参考
    • 前回記事
    • WinForms版
    • 今回のソースコード
  • 開発環境
  • 各種ライブラリについて
    • ADOユーティリティクラスの追加
    • コード変換クラスの追加
    • JV-Data構造体の追加
  • メインコードの作成
    • データソースの追加
    • メインプログラムの解説
  • 動作確認

参考

前回記事

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 の内容のデータベース読み出しが完了となります。(ソースが整理出来たところで少し満足いたしました。)

Filed Under: JV-LinkをC#で使ってみる(Console版), 競馬でプログラミング 関連タグ:C#, JRA-VAN, 競馬

最初のサイドバー

More to See

csvファイルの配列化がおかしい、、、

2020-09-11 By さえきさん

エターナルハートが転厩するのはまあいいとして、、、

2020-09-09 By さえきさん

フォルダー構成のみなおしがメンドイ( 一一)

2020-09-09 By さえきさん

Tags

C# ConoHa WING CSS Genesis JavaScript JRA-VAN Magazine Pro THE THOR WordPress エターナルハート ギエナー2019 バヌーシー フランクエトワール 競馬

Categories

  • このはとウェブログ (3)
    • JavaScriptの話 (2)
    • WordPressの話 (1)
  • 日記 (17)
  • 競馬でプログラミング (14)
    • JV-LinkをC#で使ってみる(Console版) (6)
    • JV-LinkをC#で使ってみる(WinForms版) (7)

Footer

Profile

avatar
初音ミクが大好きな40代のおじさんです。
最近、バヌーシーで一口馬主を始めました。

Search

Copyright © 2021 · Magazine Pro on Genesis Framework · WordPress