#java #mysql #jdbc
#java #mysql #jdbc
Вопрос:
Кто-нибудь знает, что не так с моим кодом? Я использую простой оператор INSERT (в отличие от обычного PreparedStatement, потому что я пытаюсь использовать функции MySQL AES_ENCRYPT / DECRYPT). Я не знаю, как использовать их с обычной настройкой PreparedStatements. со всеми странными вопросительными знаками.
Я продолжаю получать классическую:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа (
video_game_db
.login
, ССЫЛКИ наlogin_ibfk_1
ВНЕШНИЙ КЛЮЧ (cust_ID
)customer
(cust_ID
))
Конечно, это сводит меня с ума.
Я провел всю ночь, пытаясь заставить работать обычную реализацию шифра «stuff» на JDBC. В итоге я смог только зашифровать строки, но не смог их расшифровать. Я подумал, что это должно было что-то сделать с MySQL в отличие от JDBC, поскольку до того, как я ввел их в базу данных, они нормально расшифровались, но после этого я смог заставить это работать.
Пожалуйста, взгляните на мои инструкции JDBC table DDL и DML ниже:
DDL
Statement s = conn.createStatement();
s.executeUpdate("CREATE TABLE customer(" "cust_ID CHAR(10) NOT NULL," "PRIMARY KEY(cust_ID)," "first_Name CHAR(30)NOT NULL,mI CHAR(2),last_Name CHAR(50)NOT NULL,street_Name CHAR(50),city CHAR(30) NOT NULL,state CHAR(50) NOT NULL,"
"zip_Code CHAR(5) NOT NULL, home_Phone CHAR(12) UNIQUE, referrer CHAR(30), quantity INTEGER NOT NULL, item_No CHAR(10))");
s.executeUpdate("CREATE TABLE login (" "user_Name CHAR(50) NOT NULL," "PRIMARY KEY(user_Name)," "pass_Word CHAR(50)NOT NULL, cust_ID CHAR(10))");
DML
public static void setCustTable(String cust_ID, String lName, String fName, String mI, String street_Name, String city, String state,
String zip_Code, String home_Phone, String referrer, int quantity, String itemNo)throws IOException, SQLException
{
// connect to database
try
{
PreparedStatement stat = conn.prepareStatement("INSERT INTO customer (cust_ID, first_Name, mI, last_Name, street_Name, city, state, zip_Code, home_Phone, referrer, quantity, item_No)"
" VALUES (?,?,?,?,?,?,?,?,?,?,?,?)");
stat.setString(1, cust_ID);
stat.setString(2, fName);
stat.setString(3, mI);
stat.setString(4, lName);
stat.setString(5, street_Name);
stat.setString(6, city);
stat.setString(7, state);
stat.setString(8, zip_Code);
stat.setString(9, home_Phone);
stat.setString(10, referrer);
stat.setInt(11, quantity);
stat.setString(12, itemNo);
stat.executeUpdate();
}
catch (SQLException e)
{
e.printStackTrace();
throw e;
}
**********************************************************************************
public static void insertLoginData(String username5, String password5, String custID5)throws IOException, SQLException, NoSuchAlgorithmException, InvalidKeyException
{
Statement s = conn.createStatement();
String insert="INSERT INTO login VALUES('username5', AES_ENCRYPT('text','password5'),'custID5')";
s.executeUpdate(insert);
Ответ №1:
Как бы то ни было, я не вижу никакой вставки в customer
. Сообщение об ошибке сообщает, что существует ограничение внешнего ключа при входе в систему для клиента. Таким образом, запись клиента должна существовать до вставки входа в систему.
Было ли намерение указать ‘username5’? Я думаю, что это параметр для метода, но insert использует литерал.
Комментарии:
1. Клиент уже заполнен. Я просто пытался сократить код для вас, ребята. Я добавлю это на всякий случай.
2. По иронии судьбы, я смог использовать PreparedStatement в JDBC, и оператор customer insert работает как шарм . , , есть ли обходной путь для очевидного несоответствия между JDBC и MySQL, когда дело доходит до шифрования? Должно быть. Я получил книгу по CoreJava, и все, что она делает, это показывает мне, как шифровать файлы? Какая польза в том, что вы пытаетесь зашифровать пароли . . . Хорошо . . . извините . . . просто расстроен. Не спал более 3 часов в сутки, работая над этим проклятым проектом. . извините за напыщенную речь . . .
3. @Mike: Происходит ли заполнение клиентской базы в той же транзакции, что и login? Если транзакции являются отдельными, является ли та, в которую вставляется клиент, уже зафиксированной ко времени запуска транзакции для вставки входа в систему?
4. Да, таблица customer заполняется непосредственно перед заполнением таблицы login.
5. @Mike что я предлагаю попробовать для отладки, так это поместить запрос select прямо перед вставкой входа и использовать одну и ту же переменную для cust_ID в обоих.