执行预准备语句时出现NullPointer异常

时间:2013-07-16 20:57:35

标签: java sql-server jdbc

我试图使用下面的代码插入临时表并选择它...当我运行它时,我得到一个NullPointer异常...不确定是什么问题..同样运行良好的mysql driver..Im在两种情况下使用jdbc

package mysql.first;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MSSqlAccess {
    private Connection connect = null;
    private Statement statement = null;
    private PreparedStatement preparedStatement = null;
    private int dmlresultSet = 0;
    private ResultSet ddlresultSet = null;
    /**
     * @param args
     */

    public static void main(String[] args) throws Exception {
         MSSqlAccess dao = new MSSqlAccess();
            //dao.readDataBase();
         dao.createtemptable();
      }

    public void createtemptable() throws Exception{

          try
          {
              // This will load the MySQL driver, each DB has its own driver
              Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
              // Setup the connection with the DB

              String db_connect_string = "jdbc:sqlserver://localhost";
              String db_userid = "Test";
              String db_password ="test";

              Connection connect = DriverManager.getConnection(db_connect_string
                     ,db_userid, db_password);

              connect.setAutoCommit(false);

              // Statements allow to issue SQL queries to the database
              statement = connect.createStatement();
              // Result set get the result of the SQL query

              String sql = "CREATE TABLE #REGISTRATION " +
                      "(id INTEGER not NULL, " +
                      " first VARCHAR(255), " + 
                      " last VARCHAR(255) )"; 

              dmlresultSet = statement
                  .executeUpdate(sql);

              System.out.println("Temp table created return code = " + dmlresultSet);

              insertRows(1,"FNAME1","LNAME1");
              selectRows();
              insertRows(2,"FNAME2","LNAME2");
              selectRows();
              updateRows();
              selectRows();
              insertRows(3,"FNAME3","LNAME3");

          }
          catch (Exception e){
              System.out.println("Error = " + e);
                throw e;  
          } finally{
              close();
          }

      }

      private void insertRows(int id, String first, String last) throws SQLException {
          System.out.println(id);
          System.out.println(first);
          System.out.println(last);
          preparedStatement = connect
                  .prepareStatement("insert into  REGISTRATION values (?, ?, ?)");

          preparedStatement.setString(2, first);
          preparedStatement.setString(3, last);
          preparedStatement.setInt(1, id);
          preparedStatement.executeUpdate();

      }

      private void selectRows() throws SQLException {
          preparedStatement = connect
                  .prepareStatement("SELECT id, first, last from REGISTRATION");
          ddlresultSet = preparedStatement.executeQuery();
          writeResultSet(ddlresultSet);

      }

      private void updateRows() throws SQLException {
          preparedStatement = connect
                  .prepareStatement("Update REGISTRATION set first = 'RENAMED' WHERE ID = 1");
          dmlresultSet = preparedStatement.executeUpdate();
      }

      private void writeResultSet(ResultSet resultSet) throws SQLException {
          System.out.println("                                                        ");
          System.out.println("*****           Printing the Rows                  *****");
            // ResultSet is initially before the first data set
            while (resultSet.next()) {
              // It is possible to get the columns via name
              // also possible to get the columns via the column number
              // which starts at 1
              // e.g. resultSet.getSTring(2);
              int id = resultSet.getInt("id");
              String first = resultSet.getString("first");
              String last = resultSet.getString("last");
              System.out.println("ID: " + id);
              System.out.println("First: " + first);
              System.out.println("Last: " + last);

            }
          }

  // You need to close the resultSet
    private void close() {
    try {
      if (ddlresultSet != null) {
        ddlresultSet.close();
      }

      if (statement != null) {
        statement.close();
      }

      if (connect != null) {
        connect.close();
      }
    } catch (Exception e) {

    }
  }

}

1 个答案:

答案 0 :(得分:8)

在“insertRows”中,您在类变量“connect”上调用一个永远不会初始化的方法。 而不是:

Connection connect = DriverManager.getConnection(db_connect_string ,db_userid, db_password);

做的:

this.connect = DriverManager.getConnection(db_connect_string ,db_userid, db_password);

这应该可以解决问题。