Ibm midrange JTOpen:写入DDM文件

Ibm midrange JTOpen:写入DDM文件,ibm-midrange,jt400,jtopen,Ibm Midrange,Jt400,Jtopen,我对使用IBMi(AS/400)很陌生。 我想通过JTOpen/JT400编写一个DDM文件。下面是我已经做过的,从这里开始使用jtopenlite.jar中的类 程序进入connection.write(ddmFile,writeCallback);将数据写入流并最终到达handleReply(文件“ddmS38PUTM”,null);(inside connection.write)在其中等待服务器的应答 这是库中的write方法 public class DDMConnection ext

我对使用IBMi(AS/400)很陌生。 我想通过JTOpen/JT400编写一个DDM文件。下面是我已经做过的,从这里开始使用jtopenlite.jar中的类

程序进入connection.write(ddmFile,writeCallback);将数据写入流并最终到达handleReply(文件“ddmS38PUTM”,null);(inside connection.write)在其中等待服务器的应答

这是库中的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;
}
}
}
公共类DDMConnection扩展了HostServerConnection
{
...
公共无效写入(DDMFile文件,DDMWriteCallback侦听器)引发IOException
{
final DDMCallbackEvent=file.getEventBuffer();
event.setEventType(DDMCallbackEvent.event_WRITE);
int blockingFactor=file.getBatchSize();
int numRecords=listener.getNumberOfRecords(事件);
int startingRecordNumber=0;
int batchSize=numRecords>blockingFactor?blockingFactor:numRecords;
int id=newCorrelationID();
while(启动记录编号=numRecords)batchSize=numRecords startingRecordNumber;
sendS38PUTMRequest(out,file.getDCLNAM(),id);
sendS38BUFRequest(文件、输出、id、file.getRecordIncrement()、侦听器、file.getRecordLength()、startingRecordNumber、batchSize);
冲水;
handleReply(文件“ddmS38PUTM”,null);//程序在此等待服务器
startingRecordNumber+=批次大小;
}
}
}
但是服务器不发送任何内容


您是否有编写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命令字符串的长度添加第二个参数,例如
00000000 49.00000

,看起来您指的是DDM而不是DDS。我在代码中没有看到handleReply(),DDMConnection.write()的8.5文档也没有提到回复。你为什么期望服务器回复呢?远程文件为只读。您是否为移动应用程序编写此应用程序?如果没有,那么我建议使用完整的JT400.jar而不是jtopenlite.jar。另外,为什么要使用DDM连接?使用JDBC连接要简单得多。@BuckCalabro我刚刚添加了DDMConnection.write(…)中的代码行,还有handleReply(…)。是的,我指的是DDS,但据我所知,DDS是DDM的一部分,不是吗?@david不,我没有编写移动应用程序,但我认为这些类听起来很适合我的目的:D是否可以通过JDBC使用DDS?JDBC适用于内部DB400,但它是否适用于DDS?DDS是一种数据描述语言。它是CRTPF、CRTDSPF、CRTLF等命令使用的源代码。DDM是一种客户机/服务器机制,允许在多个IBMi系统之间进行几乎透明的文件访问。以RPG为例,在SYSTEMA上,CRTDDMF THISLIB/THISDDMF指向SYSTEMB上的MYLIB/MYFILE。RPG会打开这个DDM文件,而操作系统会连接到SYSTEMB,并在SYSTEMB上执行所有的文件I/O,即使RPG程序正在SYSTEMA上运行。感谢您,它可以与“为kekru1/qrpglesrc3创建别名kekru1/ddstestxy(ddstest)”:)一起工作,除非DB2 FOR I SQL特性生成了特定的外部QCMDEXC[不同于*PGM对象QSYS/QCMDEXC],它专门影响覆盖功能,能够影响SQL作为调用程序的作用域,在给定的OVRDBF示例中,只有*JOB的覆盖范围(OVRSCOPE)足够;即OVRSCOPE(*JOB)应该编码[如果不是默认值;因此删除覆盖(DLTOVR)建议将OVRxxx请求配对。)。任何其他作用域都需要通过在[usu.调用前]调用要求重写生效的SQL之外调用OVRxxx来实现。
CALL QCMDEXC('ADDPFM  KEKRU1/QRPGLESRC3 DDSTEST2')