2012-03-02 59 views
0

程序下面是一个通用类我写了一个调用服务器上的存储过程:麻烦调用SQL Server存储在Java

public class StoredProc { 

Connection con = null; 
ResultSet rs = null; 
CallableStatement cs = null; 

public StoredProc(String jdbcResource, String storedProcName){ 

    this(jdbcResource, storedProcName, new String[0], new String[0]); 
} 

public StoredProc(String jdbcResource, String storedProcName, String[] params,String[]  paramTypes){ 

    Connection con = new databaseConnection(jdbcResource).getConnection(); 

    //Get length of parameters and sets stored procs params (?, ?, ...etc) 
    String procParams = ""; 
    int paramSize = params.length; 
    if(paramSize != 0){ 
     for(int i = 0; i < paramSize; i++){ 
      if(i == paramSize){ 
       procParams += "?"; 
      }else{ 
       procParams += "?, "; 
      } 
     } 
    } 

    try{   

     CallableStatement cs = this.con.prepareCall("{?=call "+storedProcName+" ("+procParams+")}"); 

     for(int j = 0; j < params.length; j++){ 
      if (paramTypes[j].equalsIgnoreCase("Int")) { 
       int x = 0; 
       try{ 
        x = Integer.parseInt(params[j]); 
       } catch(Exception e) {} 
       cs.setInt(j, x); 
      } else if (paramTypes[j].equalsIgnoreCase("Boolean")) { 
       boolean x = false; 
       try{ 
        x = (params[j].equalsIgnoreCase("True")) || (params[j].equalsIgnoreCase("T")) || (params[j].equalsIgnoreCase("1")) || (params[j].equalsIgnoreCase("Yes")) || (params[j].equalsIgnoreCase("Y")); 
       } catch(Exception e) {} 
       cs.setBoolean(j, x); 
      } else if (paramTypes[j].equalsIgnoreCase("String")) { 
       cs.setString(j, params[j]); 
      } 
     } 

    }catch(Exception e){ 
     System.out.println("---------------------------------------------"); 
     System.out.println("Problem constructing callableStatement: "+e); 
     System.out.println("---------------------------------------------"); 
    } 

} 

public ResultSet runQuery(){ 

    try{ 
     rs = cs.executeQuery(); 
    }catch(SQLException e){ 
     System.out.println("---------------------------------------------"); 
     System.out.println("Problem executing stored procedure: "+e); 
     System.out.println("---------------------------------------------"); 
    } 
    return rs; 

} 

public void runUpdate(){ 

    try{ 
     cs.executeUpdate(); 
    }catch(SQLException e){ 
     System.out.println("---------------------------------------------"); 
     System.out.println("Problem executing stored procedure: "+e); 
     System.out.println("---------------------------------------------"); 
    } 
} 

} //end of class 

出于某种原因,我上我想行得到一个NullPointerException构造CallableStatement - > CallableStatement cs = this.con.prepareCall(“{?= call”+ storedProcName +“(”+ procParams +“)}”);

的调用语句应该是这样的,在运行时:

cs = this.con.prepareCall({?=call getUnlinkedDirectdeposits()}); 

的存储过程在数据库中调用这个:[DBO] [getUnlinkedDirectdeposits]

任何帮助,将不胜感激! 在此先感谢,

回答

2

您正在使用错误的“con”变量。在你的方法,你要初始化的变量(本地的方法)称为con

Connection con = new databaseConnection(jdbcResource).getConnection(); 

但你使用this.con,这是你目前正在执行的StoredProc对象的con领域因为它是。从未初始化,你会得到一个NullPointerException

+0

啊我明白了,非常感谢! – Tiwaz89 2012-03-02 09:33:50

1

您的Connection字段为空!

您在StoredProc中创建了一个新的Connection实例,而不是将其分配给您班级的con字段。但是,当试图创建CallableStatement时,您正在使用之前未设置的this.con