2

IBM i (AS/400) を使用するのは初めてです。JTOpen/JT400経由でDDMファイルを書きたいです。ここからjtopenlite.jar内のクラスを使用して、私がすでに行ったことは次のとおりですhttp://sourceforge.net/projects/jt400/files/JTOpen-full/8.5/

    final String HELLO_WORLD = "Hello World";
    final String LOREM_IPSUM_DOLORES = "lorem ipsum dolores"; 
    String library = "KEKRU1";
    String file = "QRPGLESRC3";
    String member = "DDSTEST2";

    DDMConnection connection = DDMConnection.getConnection("myas400.de", "username", "password");
    DDMRecordFormat recordFormat = connection.getRecordFormat(library, file);

    DDMWriteCallback writeCallback = new DDMWriteCallback() {

        @Override
        public int getRecordDataOffset(DDMCallbackEvent event, int recordIndex) {
            System.out.println(recordIndex);
            return 0;
        }

        @Override
        public byte[] getRecordData(DDMCallbackEvent event, int recordIndex) {              
            byte[] result = new byte[120]; //120 is the ddmfile.getRecordLength()

            byte[] src;
            if (recordIndex == 0){
                src = HELLO_WORLD.getBytes();
            }else{
                src = LOREM_IPSUM_DOLORES.getBytes();
            }

            System.arraycopy(src, 0, result, 0, src.length); //Copy from src to result
            return result;
        }

        @Override
        public int getNumberOfRecords(DDMCallbackEvent event) {
            return 2;
        }

        @Override
        public boolean[] getNullFieldValues(DDMCallbackEvent event, int recordIndex) {
            return null;
        }
    };

    DDMFile ddmFile = connection.open(library, file, member, recordFormat.getName(), DDMFile.WRITE_ONLY, false, 10, 1);

    System.out.println(ddmFile.getRecordLength()); //prints 120     

    connection.write(ddmFile, writeCallback);
    connection.close();

プログラムは connection.write(ddmFile, writeCallback); に入ります。データをストリームに書き込み、最終的に handleReply(file, "ddmS38PUTM", null) に到達します。(connection.write 内) サーバーの応答を待ちます。

ライブラリからの書き込み方法は次のとおりです

public class DDMConnection extends HostServerConnection
{
...

 public void write(DDMFile file, DDMWriteCallback listener) throws IOException
  {
final DDMCallbackEvent event = file.getEventBuffer();
event.setEventType(DDMCallbackEvent.EVENT_WRITE);

int blockingFactor = file.getBatchSize();
int numRecords = listener.getNumberOfRecords(event);
int startingRecordNumber = 0;
int batchSize = numRecords > blockingFactor ? blockingFactor : numRecords;
int id = newCorrelationID();
while (startingRecordNumber < numRecords)
{
  if (startingRecordNumber+batchSize >= numRecords) batchSize = numRecords-startingRecordNumber;
  sendS38PUTMRequest(out_, file.getDCLNAM(), id);
  sendS38BUFRequest(file, out_, id, file.getRecordIncrement(), listener, file.getRecordLength(), startingRecordNumber, batchSize);
  out_.flush();

  handleReply(file, "ddmS38PUTM", null); //here the program waits for the server
  startingRecordNumber += batchSize;
}
}
}

しかし、サーバーは何も送信しません。

DDM ファイルを作成するための提案や別の方法はありますか?

4

2 に答える 2

2

リモート システムで DDM を使用してファイルにアクセスするのではなく、JDBC を使用して、データベースが実際に存在するシステム上のファイルにアクセスします。

于 2015-07-09T17:20:38.293 に答える
1

おそらく、DDS で作成されたファイルと SQL で作成されたファイルに違いがあるかどうかが気になるでしょう。システムはそれらをほぼ同じように扱います。記述された物理データベース ファイルで JDBC を使用します。

一般に、SQL/JDBC には、特定のファイル メンバーを操作する機能があまりありません。次のいずれかを行う必要があります

1) 特定のメンバーに対して CREATE ALIAS を作成すると、エイリアスに INSERT INTO します。

または

2) おそらく CL コマンド OVRDBF を使用して、接続セッションでオーバーライドを確立します。

SQL文を実行できます

CALL QCMDEXC('OVRDBF QRPGLESRC3 KEKRU1/QRPGLESRC3 TOMBR(DDSTEST2)')

QCMDEXC は、CL コマンドを実行するストアード・プロシージャーです。

ファイルメンバーがまだ存在しない場合は、最初に

CALL QCMDEXC('ADDPFM  KEKRU1/QRPGLESRC3 DDSTEST2')

ご使用のシステムで IBM I がしばらく更新されていない場合は、次のように、CL コマンド・ストリングの長さを表す 2 番目のパラメーターを追加する必要がある場合があります。0000000049.00000

于 2015-07-09T19:56:55.843 に答える