我正在尝试将TextField值保存到数据库中,但是我收到错误:
org.h2.jdbc.JdbcSQLException: Column count does not match; SQL statement:
INSERT INTO KIWI VALUES (104, ) [21002-173]
我想要发生的是在调用'addClient()'方法时将客户端的名字保存到数据库中。
任何人都可以帮助我开始工作吗?提前谢谢大家。
我正在使用JavaFx,并且正在使用JavaFx SceneBuilder创建的FXML文件调用'TextField firstName'。我已经尝试在控制器中初始化它但没有成功。有任何想法吗?我认为这些类型的对象不应该是无限制的,至少按照我的理解遵循JavaFx规则。
控制器类:
import java.net.URL;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import wakiliproject.Forms.AddNew.DB.NewClientDB;
public class NewClientController implements Initializable {
@FXML
public TextField firstName;
// Initializes the controller class.
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
@FXML
public void addClient() throws SQLException {
new NewClientDB().main();
}
}
数据库类:
import Database.Plain.Skell.DBConnect;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import wakiliproject.Forms.AddNew.NewClientController;
public class NewClientDB extends NewClientController {
private String firstNames = new NewClientController().firstName.getText();
public void main() throws SQLException {
Connection conn = DBConnect.connect();
Statement stmt = null;
try {
//STEP 3: Open a connection
System.out.println("Connecting to a selected database...");
System.out.println("Connected database successfully...");
//STEP 4: Execute a query
System.out.println("Inserting records into the table...");
stmt = conn.createStatement();
String sql = "INSERT INTO KIWI "
+ "VALUES (104, " + (firstNames) + ")";
stmt.executeUpdate(sql);
System.out.println("Inserted records into the table...");
} catch (SQLException se) {
//Handle errors for JDBC
se.printStackTrace();
} catch (Exception e) {
//Handle errors for Class.forName
e.printStackTrace();
} finally {
//finally block used to close resources
try {
if (stmt != null) {
conn.close();
}
} catch (SQLException se) {
}// do nothing
try {
if (conn != null) {
conn.close();
}
} catch (SQLException se) {
se.printStackTrace();
}//end finally try
}//end try
System.out.println("Goodbye!");
}//end main
}
修改
我不认为正在挑选TextField值
答案 0 :(得分:0)
作为旁注,您应该使用PreparedStatements
。您将避免连接错误以及SQL注入。
但是你的问题似乎来自这样一个事实:你在用户有机会在那里输入任何东西之前就得到了这个值。我不熟悉JavaFX,但您当前的代码是在程序开头获取文本字段值(当它显然仍为空时)。单击某个按钮或其他内容时,它不应该执行添加吗?
答案 1 :(得分:0)
这里有很多错误。
您不能使用新语句创建新的控制器类,并期望它与FXMLLoader创建的实例相同。删除这一行:
private String firstNames = new NewClientController().firstName.getText();
NewClientDB不应该扩展NewClientContoller。 FXMLLoader对子类一无所知。
将firstName从控制器传递给NewClientDB实例。
new NewClientDB().main(firstName);
....
public void main(String firstNames)
在insert语句中的firstNames字符串周围放置单引号。
"INSERT INTO KIWI VALUES (104, '" + (firstNames) + "')";
确保您的KIWI表只有两列类型与insert语句兼容。
检查您的FXML耗材是否为firstName的fx:id。
检查您是否有button defined in your FXML which triggers #addClient。
如果上述方法无法解决您的问题,请编辑您的问题以包含您的KIWI表格DDL和您的FXML文件。