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

Posted

技术标签:

【中文标题】在 Java 中调用 SQL Server 存储过程时遇到问题【英文标题】:Trouble calling SQL Server stored procedure within Java 【发布时间】: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]

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

您的Connection 字段为空!

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

【讨论】:

以上是关于在 Java 中调用 SQL Server 存储过程时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

在存储过程中通过用户的默认架构进行访问时,在SQL Server中切换用户失败

sqlserver 问题

SQL server T-SQL存储过程

SQL Server 数据库的维护(上)_存储过程(procedure)

在 Java 中调用 SQL Server 用户定义函数 (UDF)

VBS 调用SQL Server加密存储过程提示:对象关闭时 不允许操作