2012-03-15 76 views
2

我有这个类为WSCallHelper.jdbcCall实施是8

package com.middleware.jdbc.j2ee.websphere; 
public class WS50NativeJDBCExtractorImpl implements NativeJDBCExtractorInf { 
private Class webSphere5ConnectionClass;   
private Method webSphere5NativeConnectionMethod;  
private Class webSphere5StatementClass; 
private Method webSphere5NativeStatementMethod; 

public WS50NativeJDBCExtractorImpl() throws Exception { 
    try { 
     this.webSphere5ConnectionClass = getClass().getClassLoader().loadClass("com.ibm.ws.rsadapter.jdbc.WSJdbcConnection"); 
     Class jdbcAdapterUtilClass = getClass().getClassLoader().loadClass("com.ibm.ws.rsadapter.jdbc.WSJdbcUtil"); 
     this.webSphere5NativeConnectionMethod = jdbcAdapterUtilClass.getMethod("getNativeConnection", new Class[] { this.webSphere5ConnectionClass }); 
     this.webSphere5StatementClass = getClass().getClassLoader().loadClass("com.ibm.ws.rsadapter.jdbc.WSJdbcStatement"); 
     this.webSphere5NativeStatementMethod = webSphere5StatementClass.getDeclaredMethod("getJDBCImplObject", null); 
     this.webSphere5NativeStatementMethod.setAccessible(true); 
    } catch (Exception ex) { 
     e.printStackTrace(); 
    } 
} 
public Connection getConnection(Connection c) throws Exception { 
    if (this.webSphere5ConnectionClass != null && this.webSphere5ConnectionClass.isAssignableFrom(c.getClass())) { 
     try { 
      return (Connection) this.webSphere5NativeConnectionMethod.invoke(null, new Object[] { c }); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
    } else { 
     return c; 
    } 
} 
private Object primGetStatement(Statement stmt) throws Exception { 
    if (this.webSphere5StatementClass != null && this.webSphere5StatementClass.isAssignableFrom(stmt.getClass())) { 
     try { 
      return this.webSphere5NativeStatementMethod.invoke(stmt, null); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
    } else { 
     return stmt; 
    } 
} 
public CallableStatement getCallableStatement(CallableStatement cs) throws Exception { 
    return (CallableStatement) primGetStatement(cs); 
}} 

我想用WSCallHelper.jdbcCall作为为8信息中心建议,但我不能够得到它正确的。我试过

Object st = WSCallHelper.jdbcCall(null, this.webSphere5StatementClass, "getJDBCImplObject", new Object[]{}, new Class[]{}); 

我得到了NOT_A_JDBC_OBJECT错误。当我没有使用WSCallHelper,我越来越

java.lang.ClassCastException: oracle.jdbc.driver.OracleCallableStatementWrapper incompatible with oracle.jdbc.OracleCallableStatement 

我还试图用

CallableStatement cStmt = getCallableStatement(call); 
if(stmt.isWrapperFor(OracleCallableStatement.class)){ 
    OracleCallableStatement ocs = (OracleCallableStatement) stmt; 
} 

(其中调用变量的SQL语句)。它说stmt没有被包装。

我正在使用上面的类连接到Oracle 9i数据库。任何人都知道如何使用WSCallHelper.jdbcCall来获取上面的代码?谢谢。

回答

1

您可以使用以下代码获取oracle连接。

OracleConnection oracleConn=null; 
if (conn!=null){ 
oracleConn= (OracleConnection) WSJdbcUtil.getNativeConnection((WSJdbcConnection) conn); 
} 

其中conn是通过WAS数据源获取的java.sql连接。现在您可以使用oracleConn对象来实现所需的结果。

+0

我认为'WSJdbcUtil'中的方法已被弃用。我正在尝试'com.ibm.websphere.rsadapter.WSCallHelper.getNativeConnection()'。 – FrustratedWithFormsDesigner 2014-01-14 23:18:58

0
if (con!=null){ 
    con = (Connection) WSCallHelper.getNativeConnection((WSJdbcConnection) con); 
} 

这对我有效。从com.ibm.websphere.rsadapter.WSCallHelper获得本机连接并将其转换为oracle连接对象。