Java JDBC PreparedStatement 外键约束失败
Java JDBC PreparedStatement Foreign Key Constraint Failed
我正在用 SQLite 和 JDBC 设计一个计费程序,我正在尝试使用这个辅助方法:
public static void preparedInsert(String query, String[] inserters) {
Connection c = connect();
try {
PreparedStatement statement = c.prepareStatement(query);
for (int i = 0; i < inserters.length; i++) {
statement.setObject(i + 1, "\'" + inserters[i] + "\'");
}
statement.executeUpdate();
c.commit();
JOptionPane.showMessageDialog(null, "Database updated!");
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Error updating database: " + e.getMessage());
}
disconnect(c);
}
public static Connection connect() {
Connection c = null;
try {
Class.forName("org.sqlite.JDBC");
SQLiteConfig config = new SQLiteConfig();
config.enforceForeignKeys(true);
c = DriverManager.getConnection("jdbc:sqlite:MRWBilling.db", config.toProperties());
c.setAutoCommit(false);
} catch ( Exception e ) {
JOptionPane.showMessageDialog(null, "Error connecting to database: " + e.getMessage());
}
return c;
}
public static void disconnect(Connection c) {
try {
c.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Error disconnecting from database: " + e.getMessage());
}
}
我要传入的参数是这样的:
SQLiteJDBC.preparedInsert("insert into timesheets(date, attorney, notes) values(?, ?, ?);",
new String[]{date, attorneyName, notes});
Timesheets 有四行:id、date、attorney 和 notes,其中 id 设置为自动递增,attorney 是律师的外键 table。我传递的律师姓名实际上存在于律师的 table.
中
在之前的构建中,当我使用常规语句时,它运行良好,但现在我已经切换到准备好的语句,我得到了这个:
Error updating database: [SQLITE_CONSTRAINT] Abort due to constraint violation (FOREIGN KEY constraint failed)
我不知道自己做错了什么。有什么建议么?
李,
你能试试像下面这样去掉最后的分号吗
"insert into timesheets(date, attorney, notes) values(?, ?, ?)"
还要验证律师姓名是否与律师 table 中的完全相同,有时我们会忘记区分大小写
包裹参数的额外单引号可能导致 FK 违规。在你的循环中使用它:
statement.setString(i+1, inserters[i]);
您可能还需要从 insert
语句中删除分号。
您的 preparedInsert 方法似乎造成了问题。尝试像下面这样改变它
PreparedStatement语句=c.prepareStatement(查询);
for (int i = 0; i < inserters.length; i++) {
statement.setString(i + 1, inserters[i]);
}
我正在用 SQLite 和 JDBC 设计一个计费程序,我正在尝试使用这个辅助方法:
public static void preparedInsert(String query, String[] inserters) {
Connection c = connect();
try {
PreparedStatement statement = c.prepareStatement(query);
for (int i = 0; i < inserters.length; i++) {
statement.setObject(i + 1, "\'" + inserters[i] + "\'");
}
statement.executeUpdate();
c.commit();
JOptionPane.showMessageDialog(null, "Database updated!");
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Error updating database: " + e.getMessage());
}
disconnect(c);
}
public static Connection connect() {
Connection c = null;
try {
Class.forName("org.sqlite.JDBC");
SQLiteConfig config = new SQLiteConfig();
config.enforceForeignKeys(true);
c = DriverManager.getConnection("jdbc:sqlite:MRWBilling.db", config.toProperties());
c.setAutoCommit(false);
} catch ( Exception e ) {
JOptionPane.showMessageDialog(null, "Error connecting to database: " + e.getMessage());
}
return c;
}
public static void disconnect(Connection c) {
try {
c.close();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "Error disconnecting from database: " + e.getMessage());
}
}
我要传入的参数是这样的:
SQLiteJDBC.preparedInsert("insert into timesheets(date, attorney, notes) values(?, ?, ?);",
new String[]{date, attorneyName, notes});
Timesheets 有四行:id、date、attorney 和 notes,其中 id 设置为自动递增,attorney 是律师的外键 table。我传递的律师姓名实际上存在于律师的 table.
中在之前的构建中,当我使用常规语句时,它运行良好,但现在我已经切换到准备好的语句,我得到了这个:
Error updating database: [SQLITE_CONSTRAINT] Abort due to constraint violation (FOREIGN KEY constraint failed)
我不知道自己做错了什么。有什么建议么?
李,
你能试试像下面这样去掉最后的分号吗 "insert into timesheets(date, attorney, notes) values(?, ?, ?)"
还要验证律师姓名是否与律师 table 中的完全相同,有时我们会忘记区分大小写
包裹参数的额外单引号可能导致 FK 违规。在你的循环中使用它:
statement.setString(i+1, inserters[i]);
您可能还需要从 insert
语句中删除分号。
您的 preparedInsert 方法似乎造成了问题。尝试像下面这样改变它
PreparedStatement语句=c.prepareStatement(查询);
for (int i = 0; i < inserters.length; i++) {
statement.setString(i + 1, inserters[i]);
}