VisualStudio C#とMySQL or SQLiteで競馬ソフトを作ってみる。そのメモ。

基本情報

JV-Dataの読み込み

【構文】

Long JVGets( Byte Array 型 buff , Long 型 size , String 型 filename );

【パラメータ】

buff
データが格納されたBYTE型配列がセットされるポインタを指定します。
size
コピーするデータの長さを指定します。この値がレコード長よりも小さい場合には残りのデータは切り捨てられ、データ格納バッファの最後の1バイトがストリング終端文字 NULL となります。
filename
現在読み込み中のファイル名が JVGets から返されます。

【戻り値】

正常にレコードを読み込んだ場合はバッファーにセットされたデータのバイト数が返ります。
読み込んでいるファイルが次のファイルに切り替わる際には−1が返ります。
全てのファイルを読み終わると0が返ります。
エラーが発生した場合にはエラーの理由コードとして負の数が返されます。(「コード表」参照)
−1の戻り値は実際には物理ファイルの終わりに返されるので、全てのファイルの終わりには一度−1が返った後、次の呼び出しで0が返されます。
戻り値意味原因と対処
0以上正常(バッファにセットしたデータのサイズ)
全ファイル読み込み終了(EOF)JVOpen で取得した全てのデータの終わりを示しています。
読み込み処理を終了してください。
−1ファイル切り替わりエラーではありません。
物理ファイルの終わりを示しています。
バッファーにはデータが返されませんのでそのまま読み込み処理を続行してください。
−3ファイルダウンロード中読み出そうとするファイルがダウンロードの最中です。
少し待ってから読み込みを再開してください。
−201JVInitが行なわれていないJVRead/JVGets に先立ってJVInit/JVOpen が呼ばれていないと思われます。
必ずJVInit/JVOpenを先に呼び出してください。
−202前回のJVOpen/JVRTOpen/JVMVOpen に対してJVClose が呼ばれていない(オープン中)前回呼び出したJVOpen/JVRTOpen/JVMVOpen がJVClose によってクローズされていないと思われます。
JVOpen/JVRTOpen/JVMVOpen を呼び出した後、別のOpenを呼び出す場合、先にJVCloseを呼び出してください。
−203JVOpenが行なわれていないJVRead/JVGets に先立ってJVOpen が呼ばれていないと思われます。
必ずJVOpenを先に呼び出してください
−402ダウンロードしたファイルが異常(ファイルサイズ=0)ダウンロード中に何らかの問題が発生しファイルが異常な状態になったと思われます。
JVFileDeleteで該当ファイル(JVRead/JVGets から戻されたファイル名)を 削除し、再度JVOpen からの処理をやりなおしてください。
−403ダウンロードしたファイルが異常(データ内容)同上
−502ダウンロード失敗(通信エラーやディスクエラーなど)ダウンロード処理に失敗しました。エラーの原因を除去しないかぎり解決しないと思われます。
原因を除去できたらJVClose を呼び出し、JVOpen からの処理をやりなおしてください。
サーバーが混雑している場合のタイムアウトでもこの戻り値が返されることがあります。
−503ファイルが見つからないJVOpen からJVRead/JVGets までの間に読み出すべきファイルが削除された、または該当ファイルが使用中と思われます。
JVOpen からやりなおせば解消しますが、削除された原因を除去するを除去する必要があります。

【解説】

JVOpen / JVRTOpen で準備した JV-Data を現在のファイルポインタから1行分読み出します。
JVOpen / JVRTOpen を行なわずに JVGets メソッドを呼び出すとエラーが返ります。

JVOpen ではデータ種別IDが複数指定できるため、JVGets メソッドは物理的には複数のファイルであっても1つのファイルであるかのように連続してデータを読み出します。
ただし、ファイル間をまたぐごとに戻り値としてファイル切り替わり(−1)が返り、全てのファイルを読 み終わった際に戻り値として EOF(0)が返ります。

例えば「2002 年 11 月 10 日以降現在までの RACE データ」を指定して読み出した場合に、レース詳細データが36件存在したとすると1回目から36回目の呼出しまではレース詳細のレコードが 1行ずつバッファにセットされ、37回目の呼び出しでファイル切り替わり(−1)が返されます。
38回目以降の呼出しには馬毎レース情報がセットされます。
全てのレコードが無くなった時点で EOF(0)が返されます。
JVGets について
JVGets は従来の JVRead と互換性のあるメソッドとして、Ver2.1.0 で新たに追加された公開メソッドです。
従来の JVRead は、内部で渡されたメモリを解放し、SJIS で開いたファイルを UNICODE 変換して新たに確保したメモリエリアに渡す処理をしていることから、パフォーマンス低下の原因となっていました。

JVGets では、メモリ受け渡しをバイト配列型のポインタで行い、そのポインタに対してメモリエリアを確保して渡す方法になります。
その際、SJIS は SJIS のまま渡すことにより、JV-Link 内部での変換およびアプリケーション側での UNICODE→SJIS 変換が不要になりコード変換におけるオーバーヘッドがなくなりました。

VB以外の言語では、VARIANT*によってバイト型 SafeArray のポインタを受け取り、Return する際に JV-Link 内部で確保した Byte SafeArray をセットして返します。
途中の動作はすべて JVRead と共通しているので、JVGets → JVRead → JVGets というように交互に呼ばれたとしても、矛盾なくレコードが取得できるように構成されています。

また、JVGets ではメモリの解放を行わないので、アプリケーション側で読み出しの度に解放する必要があります。

【 VisualBasic6 での JVGets 読み出し方法 】

Dim BuffSize As Long ‘バッファサイズ
Dim BuffName As String ‘バッファ名
Dim ReturnCode As Long ‘JV-Link 返値
Dim bytData() As Byte ‘JVGets 用Byte型配列ポインタ
ReturnCode = frmMain.JVLink1.JVGets(bytData, BuffSize, BuffName)
Debug.Print bytData ‘データを表示します。
Erase bytData ‘読み込みで確保されたメモリを明示的に削除します

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます