我有一个存储过程,我想从JDBC调用它,我在行中得到了空指针异常。“
while (restuls.next()) {我的代码是:
Connection con = Database.getConnection();
CallableStatement callableStatement = null;
try {
String storedProcedure = "{call getAllCustomerAddresses(?,?,?,?,?,?,?)}";
callableStatement = con.prepareCall(storedProcedure);
callableStatement.setInt(1, this.getID());
callableStatement.registerOutParameter(2,
java.sql.Types.INTEGER);
callableStatement.registerOutParameter(3,
java.sql.Types.VARCHAR);
callableStatement.registerOutParameter(4,
java.sql.Types.INTEGER);
callableStatement.registerOutParameter(5,
java.sql.Types.INTEGER);
callableStatement.registerOutParameter(6,
java.sql.Types.INTEGER);
callableStatement.registerOutParameter(7,
java.sql.Types.VARCHAR);
callableStatement.execute();
System.out.println(callableStatement.getInt(2));
System.out.println(callableStatement.getString(3));
System.out.println(callableStatement.getInt(4));
System.out.println(callableStatement.getInt(5));
System.out.println(callableStatement.getInt(6));
System.out.println(callableStatement.getString(7));
ResultSet restuls = callableStatement.getResultSet();
while (restuls.next()) {
int addressID = restuls.getInt(2);
String label = restuls.getString(3);
int regionID = restuls.getInt(4);
int areaID = restuls.getInt(5);
int cityID = restuls.getInt(6);
String description = restuls.getString(7);
this.addresses.add(new CustomerAddressImpl(this, label,
description, RegionImpl.getInstance(regionID),
AreaImpl.getInstance(areaID), CityImpl
.getInstance(cityID), addressID));
}看看代码,System.out.println正在工作,并且它正在从数据库打印正确的值,那么为什么结果集是空的呢?
另外,我必须使用结果集,因为存储过程返回很多行。
我真的很困惑,为什么我可以打印正确的值,但结果集为空
提前感谢
编辑
如果你想给你存储过程,请告诉我
存储过程
ALTER PROCEDURE [dbo].getAllCustomerAddresses(
@customerID INT,
@addressID INT OUTPUT,
@label VARCHAR(200) OUTPUT,
@regionID INT OUTPUT,
@areaID INT OUTPUT,
@cityID INT OUTPUT,
@description TEXT OUTPUT
)
AS
SET NOCOUNT Off;
SELECT @addressID = [ID],
@label = [label],
@regionID = [regionID],
@areaID = [areaID],
@cityID = [cityID],
@description = [description]
FROM Customer_Address
WHERE customerID = @customerID发布于 2013-05-12 17:33:43
您的存储过程实际上不会生成ResultSet,因为您使用的是输出参数(不是100%确定,我手头没有SQL Server可以测试)。
您可能只需要调用CallableStatement.getObject(int)或CallableStatement.getObject(String) (或特定于类型的getter)来获取这些值。如果希望作为ResultSet进行处理,则不应在存储过程中使用output参数,而应将存储过程编写为select而不将其赋值给output参数。这将从存储过程创建一个结果集。
另一种可能是,您的存储过程在返回结果集之前首先返回一个或多个更新计数。execute()的布尔返回值指示第一个结果是更新计数还是ResultSet。您将需要重复调用getMoreResults()和getUpdateCount(),以确保您已经处理了每个结果。
您的posted存储过程包含SET NOCOUNT OFF,它向SQL Server (或Sybase)发出信号,表明您希望返回update (我相信是select)计数,您可能希望尝试使用SET NOCOUNT ON。
您还可以尝试像这样处理execute()的结果,以确定在结果集之前是否确实存在多个更新计数等:
boolean result = pstmt.execute();
while(true)
if (result) {
ResultSet rs = pstmt.getResultSet();
// Do something with resultset ...
} else {
int updateCount = pstmt.getUpdateCount();
if (updateCount == -1) {
// no more results
break;
}
// Do something with update count ...
}
result = pstmt.getMoreResults();
}发布于 2013-05-12 17:22:28
如果结果集存在,则PreparedStatement的execute()方法返回true,否则返回false。不检查execute()的返回值。我认为如果你这样做了,你就会发现它是错误的。
原因应该是在您的存储过程中,IMHO没有返回值。所以,试着分析它来理解问题。
以下是我可以给你的建议:
ResaultSet的executeQuery(),而不是execute()。我认为这更像是使用存储过程的convenient.https://stackoverflow.com/questions/16505812
复制相似问题