ResultSet中的NullPointerException(ResultSet NullPoin

2019-10-29 14:15发布

我有一个存储过程,我想从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工作,它是从打印数据库中正确的价值观,所以为什么结果设置为null,请?

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

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

提前致谢

编辑

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

存储过程

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

Answer 1:

存储过程实际上并不产生一个ResultSet ,因为你使用的输出参数(不是100%肯定,我没有一个SQL服务器方便的进行测试)。

您可能只需要调用CallableStatement.getObject(int)CallableStatement.getObject(String) (或特定类型的getter),以获得值来替代。 如果你要处理的ResultSet ,那么你不应该在你的存储过程中使用输出参数,但是写存储过程作为一个选择不分配到输出参数。 这将创建存储过程的结果集

另一种可能性可能是由返回结果集之前,你的存储过程返回第一个或多个更新计数。 的布尔值返回execute()指示所述第一结果是否是更新计数或一个ResultSet 。 您将需要重复调用getMoreResults()getUpdateCount()以确保您已处理每一个结果。

您发布的存储过程中包含SET NOCOUNT OFF这标志着到要更新的SQL Server(或Sybase)(我相信选择)计数恢复,以及,你可能想使用尝试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();
}

又见Java的SQL:Statement.hasResultSet()?



Answer 2:

execute()方法PreparedStatement返回true ,如果结果集礼物和false ,否则。 你不检查返回值execute() 我认为,如果你这样做,你看,这是假的。

究其原因应该是在恕我直言,没有返回值的存储过程。 因此,尝试分析它来理解这个问题。

以下是建议我可以给你:

  1. 使用executeQuery()直接返回ResaultSet ,而不是execute() 我觉得这是比较方便。
  2. 避免使用存储过程夫妇与特定类型的数据库平台无关的Java代码。 试着用Java编写所有的逻辑,并且只使用便携式的SQL语句。
  3. 我最后一次见到纯JDBC代码是大约10年前。 有很多的工具,帮助您避免Java代码中编写SQL。 就拿上JPA,休眠,iBatis的等等看


文章来源: ResultSet NullPointerException