|
заблокировать запись VFPOLEDB
|
|||
---|---|---|---|
#18+
помогите. есть таблица tables в которой для каждой таблицы базы хранится последний использованный id записи, потому что в таблицах ключ не автоинкрементный. мне нужно в одну из таблиц добавить запись, назовем эту таблицу "Z". для этого надо: - получить последний использованный id из tables для таблицы Z - увеличить этот полученный id на 1 - добавить запись в Z с новым id - записать новый id в tables и вот чтобы это сделать, мне ж надо заблокировать запись в tables. на фокспро это сделано через RLOCK(), а в делфи через vfpoledb как мне поступить? или как то можно в рамках одного обращения к бд сделать? может так пойдет: adoquery1.sql.add('SELECT gen_id FROM tables WHERE tablename="Z"'); adoquery1.sql.add('вот тут как то увеличить gen_id и записать его например в переменную new_gen_id'); adoquery1.sql.add('INSERT INTO Z (id) VALUES (new_gen_id)'); adoquery1.sql.add('UPDATE tables SET gen_id = new_gen_id WHERE tablename = "Z"'); adoquery1.sql.execsql; как правильно сделать? структуру бд менять не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2010, 13:55 |
|
заблокировать запись VFPOLEDB
|
|||
---|---|---|---|
#18+
Можно и без блокировок. Идея заключается в том, что ты сначала считываешь текущее значение у нужной записи, а потом выполняешь модификацию у записи, которая имеет найденное значение. Ну, в синтаксис Delphi сам переведешь, а в псевдо-коде это будет выглядеть так Код: plaintext 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.
Основная "фишка" в небольшом "довеске" в команде UPDATE. Если за время между первым Select и командой Update другой пользователь успел изменить значение счетчика, то Update не найдет ту запись, которую надо изменить и мы уйдем на следующий шаг цикла ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2010, 14:12 |
|
|
start [/forum/topic.php?fid=41&tid=1584877]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 148ms |
0 / 0 |