Большая проблема last_insert_id(), снова

90
7

Примечание. Это следует моему вопросу здесь: JDBC: Разрыв соединения, если я теряю ссылку на объект Connection?


Теперь у меня есть созданный класс, поэтому я могу работать с JDBC легко для остальной части моего кода -


public class Functions {
private String DB_SERVER = "";
private String DB_NAME = "test";
private String DB_USERNAME = "root";
private String DB_PASSWORD = "password";

public Connection con;
public PreparedStatement ps;
public ResultSet rs;
public ResultSetMetaData rsmd;

public void connect()
throws java.io.FileNotFoundException, java.io.IOException,
SQLException, Exception {
String[] dbParms = Parameters.load();

DB_SERVER = dbParms[0];
DB_NAME = dbParms[1];
DB_USERNAME = dbParms[2];
DB_PASSWORD = dbParms[3];

// Connect.
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://"
+ DB_SERVER + "/"
+ DB_NAME, DB_USERNAME, DB_PASSWORD);
}

public void disconnect() throws SQLException {
// Close.
con.close();
}
}


Как видно, Parameters.load() обновляет параметры соединения из файла каждый раз, так что любые другие изменения могут быть применены к следующему непосредственному соединению.


Пример этого класса в действии -


public static void add(String NAME)
throws java.io.FileNotFoundException, java.io.IOException, SQLException, Exception {
Functions dbf = new Functions();
dbf.connect();

String query = "INSERT INTO " + TABLE_NAME + "(" +
"NAME" +
") VALUES(?)";
PreparedStatement ps = dbf.con.prepareStatement(query);
ps.setString(1, NAME);
ps.executeUpdate();

dbf.disconnect();
}


Теперь вот проблема - для добавления записи в таблицу выше метод add() откроет соединение, добавит запись - и затем вызовет disconnect().


Что делать, если я хочу получить идентификатор вставленной записи после вызова add()-like this:


Department.add("new dept");
int ID = getlastID();

Возможно ли, что между этими двумя операторами было вызвано другое add()?

спросил(а) 2010-06-06T12:37:00+04:00 10 лет, 4 месяца назад
1
Решение
57

Возможно. Возможно, вы захотите рассмотреть возможность реорганизации своего кода.

Действия ребенка, извлечение и сохранение идентификатора в переменной внутри вашего метода добавления перед закрытием соединения, изменение подписи и возврат идентификатора.

ответил(а) 2010-06-06T12:42:00+04:00 10 лет, 4 месяца назад
41

Не имеет значения, выполняется ли другое добавление между операторами, если вы держите свое соединение открытым. Функция last_insert_id получает последний идентификатор, созданный в том же сеансе базы данных, то есть с использованием того же соединения.

Итак, вам нужно изменить свой код, чтобы вы не закрывали и не открывали соединение между добавлением записи и получением идентификатора.

ответил(а) 2010-06-06T12:44:00+04:00 10 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема