首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ResultSet NullPointerException

ResultSet NullPointerException
EN

Stack Overflow用户
提问于 2013-05-12 17:09:40
回答 2查看 3K关注 0票数 0

我有一个存储过程,我想从JDBC调用它,我在行中得到了空指针异常。“

代码语言:javascript
复制
while (restuls.next()) {

我的代码是:

代码语言:javascript
复制
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正在工作,并且它正在从数据库打印正确的值,那么为什么结果集是空的呢?

另外,我必须使用结果集,因为存储过程返回很多行。

我真的很困惑,为什么我可以打印正确的值,但结果集为空

提前感谢

编辑

如果你想给你存储过程,请告诉我

存储过程

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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()的结果,以确定在结果集之前是否确实存在多个更新计数等:

代码语言:javascript
复制
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();
}

另请参阅Java SQL: Statement.hasResultSet()?

票数 1
EN

Stack Overflow用户

发布于 2013-05-12 17:22:28

如果结果集存在,则PreparedStatementexecute()方法返回true,否则返回false。不检查execute()的返回值。我认为如果你这样做了,你就会发现它是错误的。

原因应该是在您的存储过程中,IMHO没有返回值。所以,试着分析它来理解问题。

以下是我可以给你的建议:

  1. 使用直接返回ResaultSetexecuteQuery(),而不是execute()。我认为这更像是使用存储过程的convenient.
  2. Avoid,它将独立于平台的java代码与特定类型的数据库结合在一起。尝试用java编写所有的逻辑,并且只使用可移植的SQL语句。
  3. 我最后一次看到纯JDBC代码是在大约10年前。有很多工具可以帮助你避免在java代码中编写SQL。看看JPA,Hibernate,iBatis等等。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16505812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档