Java 无法确定此SQL语句获胜的原因';t执行(德比)

Java 无法确定此SQL语句获胜的原因';t执行(德比),java,sql,derby,Java,Sql,Derby,我的表是这样设置的,似乎创建得很好。(不引发任何异常) 我试图插入以下内容: String sqlString = String.format(// "INSERT INTO %s values(?, ?, ?, ?, ?, ?, ?)", TABLE_NAME); boolean result = execute(sqlString, // motorcycle.getId(), // long motorcycl

我的表是这样设置的,似乎创建得很好。(不引发任何异常)

我试图插入以下内容:

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;
    }
从:

返回:

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

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


正如评论中提到的那样,使用这种语句更合适。

我遇到了一个类似的问题,但我的错误是表不存在,如果表不存在,我的代码是用来创建表的,所以经过一些研究,我发现在
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
   {

   }
 }
}
我还为操作和查询创建了一个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) {
}

}

那么抛出的异常是什么呢?错误消息是什么?你的
execut()
方法是做什么的?格式化后你能给出完整的字符串吗?@a_horse_与_no_name没有抛出异常,这是我问题的核心。我编辑了这个问题以包含execute()方法的作用。@SharonBenAsher创建表的字符串:
CREATE table BCMC_motorkes(motorkeid BIGINT,make VARCHAR(25),model VARCHAR(25),serialNumber VARCHAR(25),bikeYear INT,milies INT,customerId BIGINT,PRIMARY KEY(motorkeid))
对于插入字符串,它看起来像这样
插入BCMC_摩托车值(?,,,,,,,,,,,,?,?,?)
它与其他参数一起发送到
execute(sqlString,args)
对于DML语句,您应该使用
executeUpdate()
而不是
execute()
  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) {
}

}