БД Access. Необходимо узнать ID последней вставленной записи. Можно ли это сделать одним запросом, используя RFD, т.е. получить идентификатор как-то так (после ExecuteScalar): object id = (int)db.Parameter("@@IDENTITY"). Подозреваю, что без двух запросов все равно не обойтись. Заранее спасибо!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Почему не вернуть как раз через
ExecuteScalar
это значение?
При использовании дополнительного запроса появляется риск, что между 2мя запросами будут ещё вставки и Вы получите не тот IDENTITY, а одной из последующих записей.
Здравствуйте, трайкатч, Вы писали:
Т>БД Access. Необходимо узнать ID последней вставленной записи. Можно ли это сделать одним запросом, используя RFD, т.е. получить идентификатор как-то так (после ExecuteScalar): object id = (int)db.Parameter("@@IDENTITY"). Подозреваю, что без двух запросов все равно не обойтись. Заранее спасибо!
Если это можно сделать без RFD, на одном ADO.NET, то можно и с RFD. Но как это сделать одним запросом без транзакции я не знаю.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Здравствуйте, TS_Rus, Вы писали:
TS_>Почему не вернуть как раз через
TS_>TS_>ExecuteScalar
TS_>
TS_>это значение?
TS_>При использовании дополнительного запроса появляется риск, что между 2мя запросами будут ещё вставки и Вы получите не тот IDENTITY, а одной из последующих записей.
Так я же написал, что база данных Access, а хранимых процедур там нет
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, трайкатч, Вы писали:
Т>БД Access. Необходимо узнать ID последней вставленной записи. Можно ли это сделать одним запросом, используя RFD, т.е. получить идентификатор как-то так (после ExecuteScalar): object id = (int)db.Parameter("@@IDENTITY"). Подозреваю, что без двух запросов все равно не обойтись. Заранее спасибо!
Если у тебя что-то типа сервера приложений, то заведи себе программные счетчики.
Интерфейс счетчика примерно такой:
public interface ICounter<T> {
T GenerateNextId();
T[] GenerateNextIds(int count);
}
Реализация методов — блокирующая. Когда ты создаешь сущность, то ты явно запрашиваешь для нее ID. Более того. Ты прямо в памяти можешь создать несколько связанных сущностей, которых еще нет в БД, а потом корректно сохранить всю связку. У тебя появилась такая возможность именно потому, что ты заранее будешь знать ID всех объектов, вставляемых в базу. В общем — удобно.
--------
В нашей реализации есть нечто вроде:
public class CounterInfo {
public int counterId;
public int lastGeneratedId;
}
Объекты этого класса хранятся в таблице Counters, при каждом изменении любого счетчика последнее значение записывается в базу.
Здравствуйте, vdimas, Вы писали:
V>В нашей реализации есть нечто вроде:
V>V>public class CounterInfo {
V> public int counterId;
V> public int lastGeneratedId;
V>}
V>
V>Объекты этого класса хранятся в таблице Counters, при каждом изменении любого счетчика последнее значение записывается в базу.
НЕ совсем понял. Для счетчиков отводится в БД отдельная таблица, так?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>