|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Использую такую процедуру для добавления записи в таблицу: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
str_data,SQLInfo - мои типы, не суть Вопрос в чем: В таблице есть еще поле ID (счетчик), кот. назначается автоматически (и заранее неизвестно). Я хочу переделать эту процедуру в функцию так чтоб возвращалось RS!ID для добаленной записи. Возможно ли вернуть RS!ID сразу без повторного обращения типа Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2013, 21:07 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Я только так пока придумал, но это с доп.запросом, не знаю насколько хорошо: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Вряд ли что-то перекрестится, т.к. только один exe работает с этой таблицей на добавление. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2013, 22:45 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Дмитрий77при добавлении записи в таблицу БДв какую СУБД? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 01:09 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Shocker.Pro, Access, с другими не работаю. Я так понял из других постов всякие SCOPE_IDENTITY не прокатят. Если мой код нормальный и не имеет потенциальных проблем, то я его и оставлю. Смысл в том, что при возникновении события кот. добавляется в log я 1) Добавляю строку в таблицу БД 2) Шлю SendMessage WM_COPYDATA "exe-шнику", кот. эту таблицу на ListView отображает (чтоб на ходу добавить в отображение эту одну строчку) И в ListView тоже есть column ID, а естественно этот ID заранее не известен. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 01:35 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Переделайте процедуру на работу через рекордсет. Тогда вместо Код: vbnet 1.
станет доступно Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 09:39 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
AkinaПеределайте процедуру на работу через рекордсет.Чтобы это заработало нужно adUseCliend, adOpenStatic, adLockBatchOptimistic. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 09:42 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
А мож ТС-а это устроит... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 11:22 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
AntonariyAkinaПеределайте процедуру на работу через рекордсет.Чтобы это заработало нужно adUseCliend, adOpenStatic, adLockBatchOptimistic. Мне так делать не хочется. Код: vbnet 1.
а также Код: vbnet 1.
проверено временем. Хотя и не в этой комбинации. Посему если моя Public Function AddLogStr_BD( не вызывает явных нареканий, то я бы так и оставил. Т.е. сойдет или не сойдет? Все записи в таблицу осуществляются из кода одной формы Но это может происходить "по событию" (например закончился телефонный вызов) Код: vbnet 1. 2. 3. 4. 5. 6.
Либо принудительно (например пользователь решил прекратить запись телефонного разговора) Код: vbnet 1. 2.
В любом случае как итог вызывается функция AddLogStr_BD приведенная выше. Код что я сделал сразу после добавления записи выдает максимальный индекс причем с гарантией что в БД все обновилось и запись добавленная первым запросом точно учитывается. Я так понимаю одновременного исполнения 2-х функций AddLogStr_BD (т.е. ситуация когда кто-то другой сделал еще одну запись между первым и вторым запросом) логически исключена. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 17:34 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Дмитрий77Т.е. сойдет или не сойдет?Тебе нужно наше мнение или в чем-то нас убедить? Мнение мы высказали. И оно тоже проверено временем, никаким иным способом id лично я не получал, ибо он наиболее правильный. Дмитрий77Я так понимаю одновременного исполнения 2-х функций AddLogStr_BD (т.е. ситуация когда кто-то другой сделал еще одну запись между первым и вторым запросом) логически исключена.Как раз наоборот, если клиентов несколько, между insert и select теоретически может произойти еще один insert, и тогда вернется чужой id. Но если клиент один, то можно на это забить. Еще хороший выход не использовать счетчик, а генерировать id самостоятельно и использовать в качестве него guid. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 18:57 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
AntonariyТебе нужно наше мнение или . Мне нужно знать что ТЕОРЕТИЧЕСКИ исключено и описанное здесь AntonariyКак раз наоборот, если клиентов несколько, между insert и select теоретически может произойти еще один insert, и тогда вернется чужой id. Но если клиент один, то можно на это забить. не соответствует довольно подробно описанному мною конкретному применению: Дмитрий77только один exe работает с этой таблицей на добавление Все записи в таблицу осуществляются из кода одной формы Но это может происходить "по событию" (например закончился телефонный вызов)... Либо принудительно (например пользователь решил прекратить запись телефонного разговора) ... при том что В любом случае как итог вызывается функция AddLogStr_BD приведенная выше. Т.е. да, exe-шник кот. имеет право добавлять записи один и не может быть запущен более одного экземпляра. AntonariyЕще хороший выход не использовать счетчик, а генерировать id самостоятельно и использовать в качестве него guid. Я не хочу ничего менять, меня устраивает "автосчетчик". Ну, в предыдущей подобной реализации я этот ID никак не использовал в ListView. Сейчас решил добавить (хотя колонка ID в Listview по умолчанию скрыта) -на всякий случай. Смысл этого ID в ListView -чтобы по записи в Listview быстро обратиться к нужной записи в БД, например для получения значения какого-либа поля, не хранимого в ListView. На тек. момент я не уверен понабится ли мне это вообще, но проще добавить сразу, чем потом делать такое добавление по диагонали, чего-то упустив при правке кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 20:16 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
А вопрос я задал в надежде на то что существует конструкция позволяющая сделать Код: vbnet 1. 2.
и кто-нибудь подсказал бы что is есть это ЧТО-ТО ЧТО Я НЕ ЗНАЮ. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 20:25 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Ясно. Просто было странно услышать от тебя подобный вопрос, твой уровень определенно выше уровня этого вопроса. На этом уровне вполне можешь положиться на собственное мнение. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 22:26 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Дмитрий77, А разве запрос select @@identity as LastId после Insert ... не даёт нужного значения ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 22:44 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
GwaДмитрий77, А разве запрос select @@identity as LastId после Insert ... не даёт нужного значения ?В аксессе не дает. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 23:36 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
AntonariyGwaДмитрий77, А разве запрос select @@identity as LastId после Insert ... не даёт нужного значения ?В аксессе не дает. даёт http://www.sql.ru/faq/faq_topic.aspx?fid=214 Q8 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 23:43 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
AntonariyGwaДмитрий77, А разве запрос select @@identity as LastId после Insert ... не даёт нужного значения ?В аксессе не дает. Это неправда.. Я пользуюсь этим приёмом на БД Access и он прекрасно работает ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 23:45 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Ну надо же... Наверное моя инфа возрастом с 97й аксесс. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2013, 23:51 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Наверное Диме надо было тогда вопрос в Аксессе задать - быстрей бы получил правильный ответ ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2013, 00:38 |
|
А как сразу получить значее счетчика при добавлении записи в таблицу БД
|
|||
---|---|---|---|
#18+
Gwa запрос select @@identity as LastId после Insert ... не даёт нужного значения ? Да вот так работает: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
2 вопроса: 1) Я сделал как вы сказали. Но не напутал ли ничего? В смысле местоположения adoConn.BeginTrans и adoConn.CommitTrans Не помню зачем они нужны, но кажется чтобы база обновлялась без задержек. 2) А в чем преимущество данного метода над моим закомментированным? Мне кажется, что если клиент не один (ну, у меня он один), то и здесь никто (в теории) не помешает вклиниться между первой и второй частью. AntonariyНаверное моя инфа возрастом с 97й аксесс Мне честно на Access как таковой наплевать. Но помню что при переходе с 97-го на 2000-й лет 12 тому назад пришлось ездить за диском SP5 на горбушку и это была большая проблема. Но я сам так и не уехал дальше 2000-го офиса - привык и все. Базу используемую при разработке я создаю в Access 2000. Но при инсталляции программа создает базу самостоятельно через ADOX, в моих постах эдак 2-х годичной давности отражено как я это делаю. Но тут ряд наблюдений. Было несколько раз когда я просил клиентов скинуть базу для понимания проблемы (не с самой базой, а чтоб понять какие иероглифы он напихал в значения таблиц и т.п.). И если клиент вдруг перед тем как БД скинуть ее открывал в своем модном Access 2010 и т.п., то я эту базу у себя в Access2000 открыть уже не мог. Но при этом моя программа продолжает нормально работать с этой "обновленной" БД, как на компьютере клиента, так и на моем. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2013, 00:58 |
|
|
start [/forum/topic.php?fid=60&msg=38137212&tid=2157170]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 155ms |
0 / 0 |