【问题标题】:getting java.lang.NullPointerException while calling sql server stored Procedure using JDBC使用 JDBC 调用 sql server 存储过程时出现 java.lang.NullPointerException
【发布时间】:2023-04-03 07:15:02
【问题描述】:

我正在尝试通过 JDBC 从调用数据库中获取存储过程数据。执行以下代码时,我得到了 resultset=null,我的代码有什么错误?请指导我。

存储过程

CREATE PROCEDURE getEmpDetails
AS
BEGIN 
SELECT * FROM  Employees;
END

java 文件

 // JDBC driver name and database URL
   static final String JDBC_DRIVER =   "com.microsoft.sqlserver.jdbc.SQLServerDriver";  
   static final String DB_URL =  "jdbc:sqlserver://localhost;database=JDBCDatabase";

   //  Database credentials
   static final String USER = "hj";
   static final String PASS = "kalpana";

   public static void main(String[] args) {
   Connection con = null;
   ResultSet rs = null;
   CallableStatement stmt = null;

   try{
          //STEP 2: Register JDBC driver
          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

          //STEP 3: Open a connection
          System.out.println("Connecting to database...");
          con = DriverManager.getConnection(DB_URL,USER,PASS);

          //STEP 4: Execute a query
          System.out.println("Creating statement...");
         // stmt = conn.createStatement(); 

          stmt = con.prepareCall("{call getEmpDetails}");

          ResultSet resultSet  = stmt.getResultSet();

          System.out.println("resultset"+resultSet);

            if (resultSet.next()) {
                // Then we use a loop to retrieve rows and column data
                // and creates a html coded table output
                System.out.println("<table border='1' >");
                do {
                 System.out.println("<tr>");
                 System.out.print("<td>" + resultSet.getString("id") + "</td>");
                 System.out.print("<td>" + resultSet.getString("first") + "</td>");
                 System.out.println("<td>" + resultSet.getInt("last") + "</td>");
                 System.out.println("<td>" + resultSet.getDouble("age") + "</td>");
                 System.out.println("</tr>");
                } while (resultSet.next());
                System.out.println("</table>");
               }
   }catch(Exception e){
       e.printStackTrace();
   }finally{
       try {
           stmt.close();
           con.close();
          // input.close();
       } catch (SQLException e) {
           e.printStackTrace();
       }
   }

   }
}   

【问题讨论】:

  • 异常发生在哪一行?
  • @SeahawksRdaBest ResultSet resultSet = stmt.getResultSet();
  • 您从未执行过该语句。您调用的方法名为“prepare”是有原因的。您仍然需要为输入参数(如果有)和定义的输出参数(如果有)提供值,然后执行语句,在您的情况下使用executeQuery()。见tutorials.jenkov.com/jdbc/callablestatement.html
  • 投票重新打开:链接的 NPE 问题与此问题无关,因为 NPE 发生在 JDBC 驱动程序内部,是由于设置不完整引起的,而不是因为 OP 使用的是空值。 NPE 应该是IllegalStateException
  • 请提供完整的堆栈跟踪

标签: java sql-server stored-procedures jdbc


【解决方案1】:

在您的代码中准备调用,然后您去期望结果 - 但没有执行查询。尝试将 ResultSet 上的访问器更改为查询的实际执行:

   stmt = con.prepareCall("{call getEmpDetails}"); 
   //Do it!
   ResultSet resultSet  = stmt.executeQuery();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 2012-12-29
    • 1970-01-01
    • 2011-01-09
    • 2021-03-02
    • 2010-09-13
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多