SQLite получает идентификатор последней строки после закрытия соединения - PullRequest
2 голосов
/ 10 октября 2011

У меня есть две функции.

Одна вставка в базу данных. Он открывает соединение и закрывает его после вставки. Другое - это функция GetLastID.

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

"SELECT sqlite_last_insert_rowid ();" кажется бесполезным, так как я закрываю соединение после вставки.

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

Вам необходимо вставить данные и получить идентификатор, используя то же соединение (не закрывая его).

Вы бы сделали что-то похожее на приведенный ниже SQL:

string sql = "Insert into Product (Name) values(@Name); SELECT last_insert_rowid() AS ProductID;";

, тогда вам придется использовать функцию объектов ExecuteScalar() команды вместо ExecuteNonQuery(), чтобы получить идентификатор строки.

Убедитесь, что в вашей таблице есть столбец с именем ProductID, обычно INTEGER с автоинкрементом и установлен в качестве первичного ключа.

0 голосов
/ 16 декабря 2011
SELECT seq FROM sqlite_sequence where name=@Table

Это решило проблему.

0 голосов
/ 10 октября 2011

last_insert_rowid () (и аналогичные функции в других базах данных) по своей природе работают только на текущем соединении.Разве вы не можете изменить свой код для запроса last_insert_rowid () перед закрытием соединения?

Если это невозможно по какой-либо причине, я думаю, что остается только запрос самого большого идентификатора.Это считается плохой практикой, потому что сразу после этого может быть вставлена ​​еще одна строка, и поэтому вы не можете гарантировать, что получите идентификатор строки, которую вы считаете.Есть ли в базе данных еще один столбец с уникальным индексом, по которому можно было бы запросить?То есть что-то вроде:

SELECT id FROM users WHERE email = 'somone@gmail.com'

будет надежной альтернативой, когда электронная почта гарантированно уникальна.

...