如何向jdbc/DB2连接插入其他库?

如何向jdbc/DB2连接插入其他库?,jdbc,db2,ibm-midrange,Jdbc,Db2,Ibm Midrange,我正在编写一个小java程序,通过jdbc(db2jcc.jar版本1.0.581)将数据写入AS/400DB2表,并将触发器与INSERT操作关联。此触发器适用于与库相关联的各种表,这些库与包含我的表(f4104)的库(jdta73p10)不同 遵循我用来建立连接和读取完美运行的数据的代码 import java.sql.*; 导入com.ibm.db2.jcc.*; 公共类Provanu13{ 公共静态void main(字符串[]args)抛出SQLException、ClassNotFo

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

遵循我用来建立连接和读取完美运行的数据的代码

import java.sql.*;
导入com.ibm.db2.jcc.*;
公共类Provanu13{
公共静态void main(字符串[]args)抛出SQLException、ClassNotFoundException{
DB2DataSource dbds=新的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();
语句stmtNum=con.createStatement();
stmtNum.executeQuery(“从interface.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();
语句stmtAnag=con.createStatement();
stmtAnag.executeQuery(“从jdta73p10.f4101lb中选择*,其中IMLITM=“+””“+args[0]+”””;
ResultSet rsAna=stmtAnag.getResultSet();
int-idCodice=0;
如果(!rsAna.next()){
System.out.println(“Il codice”+args[0]+“anagrafica中的非esiste!”);
}否则{
idCodice=rsAna.getInt(“IMITM”);
System.out.println(“每”+args[0]+“:“+Integer.toString(idCodice));
语句stmtcean=con.createStatement();
stmtbean.executeQuery(“从jdta73p10.f4104中选择IVLN、IVCITM、IVLITM、IVDSC1,其中IVXRT='B'和IVLN='80000000000'”);
ResultSet rsQEAN=stmtbean.getResultSet();
if(rsQEAN.next()){
System.out.println(“Codice EAN per”+args[0]+“giápresente:”+rsQEAN.getString(“ivln”);
System.out.println(“Valore EAN13:+rsQEAN.getString(“IVCITM”);
System.out.println(“Risultato ricerca per EAN13:+rsQEAN.getString(“IVLITM”)+“-”+rsQEAN.getString(“IVDSC1”);
}
}
}
}
问题是当我尝试执行一个插入操作时(如下所示);由于触发器执行,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严重性……:九十九

消息类型…:询问

发送日期……:2015年1月8日发送时间……:10:01:31

信息……:调用程序或过程时出错 *LIBL/PRHWRAPUSE(C G D F)。 原因……:程序接口中的RPG程序TRG_F4104; F4104A/TRG_F4104A at 语句152试图调用程序或过程*LIBL/WS_matri,但 无法访问程序或过程、库或所需的 服务项目。如果名称为*N,则调用是过程的绑定调用 指针

恢复…:查看作业日志以了解有关故障原因的更多信息 错误,请联系负责程序维护的人员。 回复邮件的可能选项………:

D——获取RPG格式的转储

S——获取系统转储


我的问题是:如何指定触发需求的其他库?在我的工具的旧版本(用Delphi编写)中,我使用了Client/Access ODBC,其中有一个特殊字段,您可以在其中输入其他库,但现在我不知道如何操作。

有几种方法可以处理此问题。用户配置文件具有职务说明,该职务说明具有库列表。我会为您的JDBC连接设置一个用户配置文件/工作描述组合

如果这不够动态,请考虑编写一个可以调用的存储过程,它将以需要的方式设置库列表。

另一种方法可能过于死板,但我提到它作为一种选择。指定库而不是为服务程序使用*LIBL。一方面,这使得在测试和生产中不可能使用相同的程序。另一方面,它也不可能有人在中间插入自己的图书馆。


如果您真的陷入困境,而且IBM方面没有人能够为您进行更改,那么您可以自己从客户端修改库列表。这是最不可取的,因为它意味着客户端和服务器之间的紧密耦合。如果IBM团队真的要设置测试环境(或灾难恢复环境!),您必须更改客户端代码中的所有引用,并将更改分发给使用它的每个人。

谢谢您提供的提示

我还想使用一个存储过程(如您所建议的),但最后我发现,使用另一个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方法,但是如果你使用标准端口(就像我的例子一样),就没有问题了。如果有必要,我将尝试发现如何设置它。

AS400(iSeries)允许在jdbc url中使用逗号分隔的库列表:

jdbc:as400://someserver命名=系统;库=devfiles、prodfiles、sysibm等

naming=system表示sql将使用库列表。例如:

select * from NUMEAN13
select * from INTERFACCE.NUMEAN13
naming=sql表示sql将包含表引用中前缀的库名称。例如:

select * from NUMEAN13
select * from INTERFACCE.NUMEAN13
我的经验是你不能把它们混在一起。如果使用库列表(naming=system),则所有sql都不能包含库名称。如果你使用no