【问题标题】:Trouble calling SQL Server stored procedure within Java在 Java 中调用 SQL Server 存储过程时遇到问题
【发布时间】:2012-03-02 08:57:02
【问题描述】:

下面是我写的一个通用类,它调用服务器上的存储过程:

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

由于某种原因,我在尝试构造 CallableStatement 的行上遇到 NullPointerException --> CallableStatement cs = this.con.prepareCall("{?=call "+storedProcName+" ("+procParams+") }");

可调用语句在运行时应如下所示:

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

存储过程在数据库中被称为:[dbo].[getUnlinkedDirectdeposits]

任何帮助将不胜感激! 提前致谢,

【问题讨论】:

    标签: java sql-server stored-procedures


    【解决方案1】:

    您使用了错误的“con”变量。在您的方法中,您正在初始化一个名为 con 的变量(方法的本地变量):

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

    然后你使用this.con,这是你当前正在执行的StoredProc对象的con字段。由于它从未被初始化,你得到一个NullPointerException

    【讨论】:

      【解决方案2】:

      您的Connection 字段为空!

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 2020-12-24
        • 2012-03-28
        • 2011-11-07
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多