Может чуть не в тему
От: трайкатч  
Дата: 19.12.05 15:47
Оценка:
БД Access. Необходимо узнать ID последней вставленной записи. Можно ли это сделать одним запросом, используя RFD, т.е. получить идентификатор как-то так (после ExecuteScalar): object id = (int)db.Parameter("@@IDENTITY"). Подозреваю, что без двух запросов все равно не обойтись. Заранее спасибо!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Может чуть не в тему
От: TS_Rus Россия http://gendix.ru
Дата: 19.12.05 15:59
Оценка:
Почему не вернуть как раз через
ExecuteScalar

это значение?

При использовании дополнительного запроса появляется риск, что между 2мя запросами будут ещё вставки и Вы получите не тот IDENTITY, а одной из последующих записей.
Задай вопрос и получи ответ в реальном времени по ICQ/Skype &c. Регистрация в темах: «Программирование», «Интернет», «Компьютеры»: [a]http://asklive.ru/ThemeSubscribeForm.aspx?attachGroups=963-962-961">[a]
Re: Может чуть не в тему
От: IT Россия linq2db.com
Дата: 20.12.05 01:55
Оценка:
Здравствуйте, трайкатч, Вы писали:

Т>БД Access. Необходимо узнать ID последней вставленной записи. Можно ли это сделать одним запросом, используя RFD, т.е. получить идентификатор как-то так (после ExecuteScalar): object id = (int)db.Parameter("@@IDENTITY"). Подозреваю, что без двух запросов все равно не обойтись. Заранее спасибо!


Если это можно сделать без RFD, на одном ADO.NET, то можно и с RFD. Но как это сделать одним запросом без транзакции я не знаю.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Может чуть не в тему
От: трайкатч  
Дата: 20.12.05 06:07
Оценка:
Здравствуйте, TS_Rus, Вы писали:

TS_>Почему не вернуть как раз через

TS_>
TS_>ExecuteScalar 
TS_>

TS_>это значение?

TS_>При использовании дополнительного запроса появляется риск, что между 2мя запросами будут ещё вставки и Вы получите не тот IDENTITY, а одной из последующих записей.


Так я же написал, что база данных Access, а хранимых процедур там нет
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Может чуть не в тему
От: vdimas Россия  
Дата: 23.01.06 21:02
Оценка:
Здравствуйте, трайкатч, Вы писали:

Т>БД 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, при каждом изменении любого счетчика последнее значение записывается в базу.
Re[2]: Может чуть не в тему
От: трайкатч  
Дата: 24.01.06 08:55
Оценка:
Здравствуйте, 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.