我怎样才能插入额外的库到我的jdbc / DB2连接?(How can I insert addit

2019-10-21 13:23发布

我正在写一个小java程序通过JDBC在AS / 400 DB2表中写入数据(版本的db2jcc.jar 1.0.581),并触发相关联的INSERT操作。 这触发适用于其中包含我的表(f4104)与来自(jdta73p10)不同的库相关联的各种表格。

下文中,笔者用它来建立连接,并读取完美运行数据的代码。

import java.sql.*;
import com.ibm.db2.jcc.*;

public class ProvaNUMEAN13 {

public static void main(String[] args) throws SQLException, ClassNotFoundException {

    DB2DataSource dbds = new DB2DataSource();

    dbds.setDriverType(4);
    dbds.setServerName("a60d45bb");
    dbds.setPortNumber(446);
    dbds.setDatabaseName("prodgrp");
    dbds.setDescription("Prova collegamento");
    dbds.setUser("XXXXX");
    dbds.setPassword("XXXXX");

    Connection con = dbds.getConnection();

    Statement stmtNum = con.createStatement();
    stmtNum.executeQuery("select * from INTERFACCE.NUMEAN13");
    ResultSet rs = stmtNum.getResultSet();

    rs.next();  
    System.out.println("Valore numeratore: " + rs.getString("E13EAN"));
    System.out.println("Tipo numeratore: " + rs.getString("K13KEY"));

    stmtNum.close();

    Statement stmtAnag = con.createStatement();
    stmtAnag.executeQuery("select * from jdta73p10.f4101lb where IMLITM = " + "'" + args[0] + "'");
    ResultSet rsAna = stmtAnag.getResultSet();
    int idCodice = 0;
    if (!rsAna.next()) {

        System.out.println("Il codice " + args[0] + " non esiste in anagrafica!");

    } else {

        idCodice = rsAna.getInt("IMITM");
        System.out.println("idCodice per " + args[0] + ": " + Integer.toString(idCodice));
        Statement stmtQEAN = con.createStatement();
        stmtQEAN.executeQuery("select IVALN, IVCITM, IVLITM, IVDSC1 from jdta73p10.f4104 where IVXRT = 'B ' and IVALN = '8000000000000'");
        ResultSet rsQEAN = stmtQEAN.getResultSet();

        if (rsQEAN.next()) {
            System.out.println("Codice EAN per " + args[0] + " già presente: " + rsQEAN.getString("IVALN"));
            System.out.println("Valore EAN13: " + rsQEAN.getString("IVCITM"));
            System.out.println("Risultato ricerca per EAN13: " + rsQEAN.getString("IVLITM")+" - "+rsQEAN.getString("IVDSC1"));

        }
    }
}
}

问题是,当我尝试执行INSERT操作(象下面这样); 在AS / 400中产生由于触发器执行一个错误。

stmtQEAN.execute("insert into jdta73p10.f4104 (IVXRT,IVITM,IVCITM,IVDSC1,IVALN,IVLITM) values ('B ','18539','8000000000000','Prodotto PROVA','8000000000000','ABABABAB')");

这是AS / 400方的错误:

消息ID。 。 。 。 。 。 :RNQ0211严重性。 。 。 。 。 。 。 :99

消息类型。 。 。 。 。 :查询

发送日期。 。 。 。 。 。 :15年8月1日的时间发送。 。 。 。 。 。 :10时01分31秒

信息 。 。 。 。 :在调用程序或过程* LIBL / PRHWRAPUSE(CGDF)时发生错误。 原因。 。 。 。 。 :在声明152项目INTERFACCE / TRG_F4104A RPG程序TRG_F4104A试图调用的程序或过程* LIBL / WS_MATERI,但无法访问的程序或过程,库或所需的服务程序。 如果名称* N,则调用由程序指针绑定呼叫。

恢复。 。 。 :检查错误的原因的工作日志的详细信息和联系负责维护程序的人。 可能的选择为回复消息。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 :

d - 获取RPG格式化转储。

的S - 获取系统转储。

我的问题是:我怎么可以指定触发所需的其他库? 在老版本的我的工具(Delphi编写的),我使用的客户端/访问ODBC那里是一个特殊的领域,您可以输入其他的库,但现在我不知道该怎么办。

Answer 1:

有几种方法来处理这个问题。 用户配置文件有一个职位描述和职位描述有一个库列表。 我会为您的JDBC Connexion的用户配置文件/作业说明组合。

如果这还不够活跃,考虑写一个存储过程,你可以调用将设置库列表中你需要的方式。

另一种方式可能是太不灵活,但我提到它作为替代。 而不是使用* LIBL的服务程序,指定库。 一方面,这使得它不可能在测试和生产使用相同的程序。 在另一方面,这使得它不可能有人来插入自己的图书馆在中间。

如果你真的卡住,在IBM方面没有人能够使你改变,你可以CALL QCMDEXC作为存储过程并改变库列表自己,从客户端。 这是最不理想的,因为这意味着在客户端和服务器之间的紧耦合。 如果IBM团队曾经trues建立一个测试环境(或灾难恢复环境!),你将不得不改变所有的引用在客户端代码,并使用其分配的变化给大家。



Answer 2:

感谢您的小费。

我也想用存储过程(如你建议),但最后我发现,使用其他IBM包的jt400.jar,可使用的方法的DataSource类设置AS / 400库的列表,你需要使用。

下面我如何改良我的代码(即现在的作品!)使用方法setLibraries。

    import com.ibm.as400.access.*;

    ...

    AS400JDBCDataSource dbds = new AS400JDBCDataSource();

    dbds.setServerName("a60d45bb");
//  dbds.setPortNumber(446);
    dbds.setDatabaseName("prodgrp");
    dbds.setDescription("Prova collegamento a numeratore EAN13");
    dbds.setUser("XXXXX");
    dbds.setPassword("XXXXX");
    dbds.setLibraries("JCOM73P10 JDTA73P10 KLDADBFER KLDADBGAM INTERFACCE SAP");


    Connection con = dbds.getConnection();

这个类有不适的方法setPort但如果你(在我的情况一样)使用标准的端口不存在任何问题。 如果有必要,我会尽力去发现如何设置它。



Answer 3:

AS400(i系列)允许在JDBC URL以逗号分隔的库列表:

JDBC:AS400:// someserver; 命名=系统;库= devfiles,prodfiles,SYSIBM等

命名=系统显示SQL将使用库列表。 例如:

select * from NUMEAN13

命名= SQL表示SQL将包含表引用前缀库名。 例如:

select * from INTERFACCE.NUMEAN13

我的经验是,你不能将它们混合。 如果您使用的库列表(命名=系统),那么所有的SQL 不能包含库名。 如果您使用非库列表(命名= SQL),那么所有的SQL 必须包含的库名。



Answer 4:

夫妇的解决方案。

快速实时修正触发程序复制到QGPL( 临时的解决办法。一个永久性的修复将需要尽快实施

要么

更改用于连接到AS400所以它具有正确的列表中的用户配置文件的JOBD。 使用JDBC的用户个人资料已被锁定,或者它是一个组中的用户的JDBC,所以这是一个简单的CHGJOBD JOBD(X)LIBL(XXX XXX XXX XXX),但连接将被回收。

要么

更改触发程序,以便它有一个硬编码库。 我敢打赌,你需要的文件的独占访问虽然。 我不工作(不能访问的iSeries),所以我无法验证此解决方案。

我建议不要更改连接字符串。 你会最终不得不改变它为每个连接到数据库机器。



文章来源: How can I insert additional libraries to my jdbc/DB2 connection?