首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTOpen:编写DDM文件

JTOpen:编写DDM文件
EN

Stack Overflow用户
提问于 2015-07-09 15:30:03
回答 2查看 566关注 0票数 2

我对IBM (一个AS/400)的使用非常陌生。我想通过JTOpen/ to 400编写一个DDM文件。下面是我已经完成的工作,在jtopenlite.jar中使用http://sourceforge.net/projects/jt400/files/JTOpen-full/8.5/中的类

代码语言:javascript
复制
    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(文件、"ddmS38PUTM“、null);(在connection.write中)等待服务器的答复。

这是库中的写方法

代码语言:javascript
复制
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文件吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-09 19:56:55

也许您关心使用DDS创建的文件与用SQL创建的文件之间是否有任何区别。系统对他们的待遇几乎是一样的。在任何描述的物理数据库文件上使用JDBC。

SQL/JDBC通常不具备处理特定文件成员的能力。你需要

1)为特定成员创建别名,然后将其插入别名。

2)在连接会话中建立覆盖,可能使用CL命令OVRDBF。

可以执行SQL语句。

代码语言:javascript
复制
CALL QCMDEXC('OVRDBF QRPGLESRC3 KEKRU1/QRPGLESRC3 TOMBR(DDSTEST2)')

QCMDEXC是一个执行CL命令的存储过程。

如果文件成员不存在,那么您可能首先需要

代码语言:javascript
复制
CALL QCMDEXC('ADDPFM  KEKRU1/QRPGLESRC3 DDSTEST2')

如果您的系统上有一段时间没有更新IBM i,则可能需要为CL命令字符串的长度添加第二个参数,例如0000000049.00000

票数 1
EN

Stack Overflow用户

发布于 2015-07-09 17:20:38

与其在远程系统上使用DDM访问文件,不如使用JDBC访问数据库实际驻留的系统上的文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31321942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档