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) {
}
}