java - 在 Java 中调用 SQL Server 存储过程时遇到问题

标签 java sql-server stored-procedures

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

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]

如有任何帮助,我们将不胜感激! 提前致谢,

最佳答案

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

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

但随后您使用 this.con,它是您当前正在执行的 StoredProc 对象的 con 字段。从未初始化过,您会得到一个 NullPointerException

关于java - 在 Java 中调用 SQL Server 存储过程时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9530444/

相关文章:

sql-server - 将 BINARY 值连接到 NVARCHAR 字符串

c# - 如何将ms sql数据传递给jquery float

sql - 作为散列的主键应该存储为 BINARY 还是 CHAR(十六进制)?

sql - 将查询转换为存储过程

stored-procedures - 通过 Go/Golang 使用 ODBC 的存储过程

java - Phaser 和 CyclicBarrier 的区别

java - 限制 Gpars 中的线程数?

java - 如何将json解析为对象

Oracle存储过程: return both result set and out parameters

java - 在 Eclipse RCP 中嵌入 Silverlight 应用程序