【问题标题】:Cannot determine why this SQL statement won't execute (Derby)无法确定为什么此 SQL 语句不会执行 (Derby)
【发布时间】:2017-06-29 08:47:59
【问题描述】:

我的表是这样设置的,并且似乎可以正确创建。 (不抛出异常)

    String sqlString = String.format(
            "CREATE TABLE %s(%s BIGINT, 
            %s VARCHAR(%d), 
            %s VARCHAR(%d), 
            %s VARCHAR(%d), 
            %s INT, 
            %s INT, 
            %s BIGINT, 
            PRIMARY KEY (%s))",
                //
                TABLE_NAME, //
                Column.ID.name, //
                Column.MAKE.name, Column.MAKE.length, //
                Column.MODEL.name, Column.MODEL.length, //
                Column.SERIAL_NUMBER.name, Column.SERIAL_NUMBER.length, //
                Column.YEAR.name, //
                Column.MILEAGE.name, //
                Column.CUSTOMER_ID.name, //
                Column.ID.name);

我正在尝试插入以下内容:

String sqlString = String.format(//
            "INSERT INTO %s values(?, ?, ?, ?, ?, ?, ?)", TABLE_NAME);
    boolean result = execute(sqlString, //
            motorcycle.getId(), // long
            motorcycle.getMake(), // String
            motorcycle.getModel(), // String
            motorcycle.getSerialNumber(), // String
            motorcycle.getYear(), // int
            motorcycle.getMileage(), // int
            motorcycle.getCustomerId()); //long

execute(sqlString, args[]) 返回false,但不会抛出异常。 derby.log 也没有关于出了什么问题的信息。

我是否使用了错误的 SQL 数据类型?

编辑:

execute(sqlString, args[]) 方法在 Dao 超类中,适用于其他子类。

代码如下:

 protected boolean execute(String preparedStatementString, Object... args) throws SQLException {
        LOG.debug(preparedStatementString);
        boolean result = false;
        PreparedStatement statement = null;
        try {
            Connection connection = Database.getConnection();
            statement = connection.prepareStatement(preparedStatementString);
            int i = 1;
            for (Object object : args) {
                statement.setObject(i, object);
                i++;
            }

            statement.executeUpdate();
            result = true;
        } finally {
            close(statement);
        }

        return result;
    }

【问题讨论】:

  • 那么抛出​​的异常是什么?错误信息是什么?你的execut() 方法有什么作用?
  • 格式化后能否给出完整的字符串?
  • @a_horse_with_no_name 没有抛出异常,这是我问题的核心。我编辑了问题以包含 execute() 方法的作用。
  • @SharonBenAsher 创建表的字符串:CREATE TABLE BCMC_Motorcycles(motorcycleId BIGINT, make VARCHAR(25), model VARCHAR(25), serialNumber VARCHAR(25), bikeYear INT, mileage INT, customerId BIGINT, PRIMARY KEY (motorcycleId)) 至于插入字符串,它看起来像这样INSERT INTO BCMC_Motorcycles values(?, ?, ?, ?, ?, ?, ?) 它与其他参数一起发送到execute(sqlString, args)
  • 你应该使用executeUpdate() 而不是execute() 作为DML 语句

标签: java sql derby


【解决方案1】:

来自PreparedStatement javadoc for execute(String sql)

返回:

如果第一个结果是 ResultSet 对象,则为真;如果是更新计数或没有结果,则为 false

很可能您的表创建成功了,您只是收到了false,因为没有要读取的结果。

正如 a_horse_with_no_name 在 cmets 中提到的那样,使用 PreparedStatement.executeUpdate() 更适合这种说法。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,但我的错误是该表不存在,如果表不存在,我的代码是为了创建该表,所以经过一些研究,我发现在 create=true 之后我需要升级数据库,即upgrade=true

    这是我的代码:

    import java.sql.*;
    import javax.swing.JOptionPane;
    
    public final class DatabaseHandler {
    private static DatabaseHandler handler;
    
    private static final String DB_URL = 
    "jdbc:derby:BookData;create=true;upgrade=true"; 
    //connection to database
    private static Connection conn = null;
    //for creeat insert and oda mySql statements
    private static Statement stm = null;
    
    public DatabaseHandler() {
        createconnection();
        setupbookTable();
    }
    
    
    
    void createconnection(){
      try {
    
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
      System.out.println("Dis is a database connection error "+e);
          conn = DriverManager.getConnection(DB_URL);
      } catch (Exception e) {
      System.out.println("Dis is a database connection error "+e);
      }
     }
    
     void setupbookTable()
     {
      String TABLE_NAME = "BOOK";
      try {
          //use d object of connection to create a statement
          stm = conn.createStatement();
          //checks if table exist evytime d app is run
          DatabaseMetaData dmb = conn.getMetaData();
          ResultSet tables = dmb.getTables(null, null, TABLE_NAME.toUpperCase(), 
         null);
          if(tables.next())
          {
              System.out.println("Table" +TABLE_NAME+" already Exists");
          }
          else
          {
              stm.execute("CREATE TABLE " + TABLE_NAME + "("
                      +" id varchar(200) primary key,\n"
                      +" title varchar(200),\n"
                      +" writer varchar(200),\n"
                      +" printer varchar(200),\n"
                      +" isAvail boolean default true"
                      + ")");
          }
    
      } catch (SQLException e) {
          System.err.println(e.getMessage() +"---Setup Database");
      }
      finally
      {  
      }
    }
    public ResultSet execQuery(String query)
      {
          ResultSet result;
          try {
              stm = conn.createStatement();
              result = stm.executeQuery(query);
          }catch(SQLException ex)
          {
              System.out.println("Error in Database:execQuery" +ex.getLocalizedMessage());
              return null;
          }finally
          {
          }
          return result;
      }
     public boolean execAction(String qu)
    {
       try {
           stm = conn.createStatement();
           stm.execute(qu);
           return true;
       } catch (SQLException e) {
           JOptionPane.showMessageDialog(null, "Error occured " +e.getMessage(), 
      " Error", JOptionPane.ERROR_MESSAGE);
           System.out.println("Exception at execQuery:dataHandler" 
      +e.getLocalizedMessage());
           return false;
       }
       finally
       {
    
       }
     }
    }
    

    我还为 Actions 和 Query 创建了一个 n exec 方法,这就是您使用它的方式:

      public class FXMLbookController implements Initializable {
    
      private Label label;
      @FXML
      private JFXTextField title;
      @FXML
      private JFXTextField id;
      @FXML
      private JFXTextField writer;
      @FXML
      private JFXTextField printer;
      @FXML
       private JFXButton save;
      @FXML
      private JFXButton cancel;
      DatabaseHandler database;
    
      @Override
      public void initialize(URL url, ResourceBundle rb) {
         database = new DatabaseHandler();
    }    
    
    @FXML
    private void addBook(ActionEvent event) {
        String bookId = id.getText();
        String bookTitle = title.getText();
        String bookPublisher = printer.getText();
        String bookAuthor = writer.getText();
        if(bookId.isEmpty() || bookTitle.isEmpty() || bookPublisher.isEmpty() || 
        bookAuthor.isEmpty())
        {
            JOptionPane.showMessageDialog(null, "No field must be left empty", 
      "Error Occured", JOptionPane.ERROR_MESSAGE);
            return;
         }
        else
        {
            /*+" id varchar(200) primary key,\n"
                      +" title varchar(200),\n"
                      +" writer varchar(200),\n"
                      +" printer varchar(200),\n"
                      +" intcode varchar(100),\n"
                      +" isAvail boolean default true"*/
            String quIn = "INSERT INTO BOOK VALUES("+
                    "'" + bookId+"'," +
                    "'" + bookTitle+"',"+
                    "'" +bookAuthor+ "',"+
                    "'" + bookPublisher+"',"+
                    "'" +"true"+"'"+
                    ")";
            System.err.println(quIn);
            if(database.execAction(quIn))
            {
                JOptionPane.showMessageDialog(null, "Success", "Success", 
        JOptionPane.INFORMATION_MESSAGE);
            }
            else
            {
                JOptionPane.showMessageDialog(null, "Error: ", " Not inserted", 
      JOptionPane.ERROR_MESSAGE);
            };
        }
    }
    
    @FXML
    private void cancel(ActionEvent event) {
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      相关资源
      最近更新 更多