在 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中切换用户失败
SQL Server 数据库的维护(上)_存储过程(procedure)