JTOpen:编写 DDM 文件
JTOpen: Writing DDM Files
我对使用 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 文件有什么建议或其他方法吗?
与其使用远程系统上的 DDM 访问文件,不如使用 JDBC 访问数据库实际所在系统上的文件。
也许您担心使用 DDS 创建的文件与使用 SQL 创建的文件之间是否存在任何差异。系统对它们几乎一视同仁。在任何描述的物理数据库文件上使用 JDBC。
SQL/JDBC 通常不具备处理特定文件成员的能力。您将需要
1) 为特定成员创建别名,然后您将插入您的别名。
或者
2) 在您的连接会话中建立覆盖,可能使用 CL 命令 OVRDBF。
可以执行SQL语句
CALL QCMDEXC('OVRDBF QRPGLESRC3 KEKRU1/QRPGLESRC3 TOMBR(DDSTEST2)')
QCMDEXC 是一个执行 CL 命令的存储过程。
如果文件成员尚不存在,那么您可能首先需要
CALL QCMDEXC('ADDPFM KEKRU1/QRPGLESRC3 DDSTEST2')
如果您的系统有一段时间没有更新 IBM I,您可能需要为 CL 命令字符串的长度添加第二个参数,例如 0000000049.00000
我对使用 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 文件有什么建议或其他方法吗?
与其使用远程系统上的 DDM 访问文件,不如使用 JDBC 访问数据库实际所在系统上的文件。
也许您担心使用 DDS 创建的文件与使用 SQL 创建的文件之间是否存在任何差异。系统对它们几乎一视同仁。在任何描述的物理数据库文件上使用 JDBC。
SQL/JDBC 通常不具备处理特定文件成员的能力。您将需要
1) 为特定成员创建别名,然后您将插入您的别名。
或者
2) 在您的连接会话中建立覆盖,可能使用 CL 命令 OVRDBF。
可以执行SQL语句
CALL QCMDEXC('OVRDBF QRPGLESRC3 KEKRU1/QRPGLESRC3 TOMBR(DDSTEST2)')
QCMDEXC 是一个执行 CL 命令的存储过程。
如果文件成员尚不存在,那么您可能首先需要
CALL QCMDEXC('ADDPFM KEKRU1/QRPGLESRC3 DDSTEST2')
如果您的系统有一段时间没有更新 IBM I,您可能需要为 CL 命令字符串的长度添加第二个参数,例如 0000000049.00000