0

我有一个存储过程,我想从 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
4

2 回答 2

2

execute()如果结果集存在则PreparedStatement返回方法,否则返回。您不检查 的返回值。我认为,如果您这样做,您会发现这是错误的。truefalseexecute()

原因应该在您的存储过程中,恕我直言不返回值。因此,尝试分析它以了解问题。

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

  1. 使用executeQuery()that 直接返回ResaultSet而不是execute(). 我觉得这样更方便。
  2. 避免使用将独立于平台的 Java 代码与特定类型的数据库耦合的存储过程。尝试用 Java 编写所有逻辑并仅使用可移植的 SQL 语句。
  3. 上一次看到纯 JDBC 代码大约是在 10 年前。有很多工具可以帮助您避免在 Java 代码中编写 SQL。看看 JPA、Hibernate、iBatis 等。
于 2013-05-12T09:22:27.783 回答
1

您的存储过程实际上并没有产生 aResultSet因为您使用的是输出参数(不是 100% 确定,我没有方便的 SQL Server 进行测试)。

您可能只需要调用CallableStatement.getObject(int)or CallableStatement.getObject(String)(或特定类型的 getter)来获取值。如果要处理为ResultSet,则不应在存储过程中使用输出参数,而应将存储过程编写为 select 而不分配给输出参数。这将从存储过程创建一个结果集

另一种可能性可能是您的存储过程在返回结果集之前首先返回一个或多个更新计数。的布尔返回值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()?

于 2013-05-12T09:33:43.300 回答