我有一个数据库和一个Java程序,要从中(通过JavaFX中的GUI)在数据库中进行记录。我多次尝试执行insert into
查询,但错误继续出现-您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以在第1行的'?,?,?)'附近使用正确的语法。这是代码:
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("*The connection string is deliberetely omitted*");
System.out.println("Connection established");
String query = "INSERT INTO User(Name,Username,PassWord) VALUES(?,?,?)";
PreparedStatement insertUser = conn.prepareStatement(query);
insertUser.setString(1,MOLCreate.fieldUsername);
insertUser.setString(2,MOLCreate.fieldUsername);
insertUser.setString(3,MOLCreate.fieldPassword);
//insertUser = conn.prepareStatement(query);
insertUser.executeUpdate(query);
conn.close();
我已用相应的值替换了参数?
,数据库行也与查询中的行相同。问题可能出在哪里?
关键是错误You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?,?)'
这意味着对您的mysql的实际查询包含?
,而不是预期的字符串。
问题出在insertUser.executeUpdate(query);
中
将query
作为参数传递给executeUpdate()
将执行原始查询字符串。根据javadocs,不应为PreparedStatement调用此方法。执行PreparedStatement的正确方法是使用
insertUser.executeUpdate();
参考:
https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeUpdate(java.lang.String)
https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#executeUpdate()
此外,您的PreparedStatement也需要关闭,因为这可能会导致内存泄漏。
让我们尝试-
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("*The connection string is
deliberetely omitted*");
**conn.setAutoCommit(false);**//Auto commit false
System.out.println("Connection established");
String query = "INSERT INTO User(Name,Username,PassWord) VALUES(?,?,?)";
PreparedStatement insertUser = conn.prepareStatement(query);
insertUser.setString(1,MOLCreate.fieldUsername);
insertUser.setString(2,MOLCreate.fieldUsername);
insertUser.setString(3,MOLCreate.fieldPassword);
//insertUser = conn.prepareStatement(query);
int check=insertUser.executeUpdate(query);
System.out.println("Check the data inserted or not ::" + check);
**conn.commit(); /**/
conn.close();**strong text**