|
|
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, коллеги. Работаю с VFP8, база на SQL Server 2000, использую курсорадаптер для работы с таблицами, запросы апдейт данный формируем сам адаптер. Хочу в справочниках для id использовать поле int IDENTITY, т.к. думаю, что так красиво решится момент, когда два юзера одновременно заносят новые строки в справочники. Updates проходят хорошо, проблема с Insert`ом: не могу получить назад в фокс значение этого поля сразу после insert`а. А Юзеру надо после инсерта сразу показать, какая id присвоилась введенной им записи. Пробовал так: в событие курсорадаптера BeforeInsert пишу: Код: plaintext Пробовал еще так: Сразу после TableUpdate выполняю: Код: plaintext Если поменять SELECT SCOPE_IDENTITY() на SELECT @@identity, результат есть, но по логике это некорректно. Возможно, дело в расшаренной коннекции и connection statements, которые я создаю для каждого курсорадаптера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2006, 18:02 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
scope_identity это то что присвоилось в одном батче. Т.е. надо вместе посылать команды, типа sqlexec(cn,'insert into ... ;SELECT SCOPE_IDENTITY() as SCOPE_IDENTITY',crsr) ? crsr.SCOPE_IDENTITY PS курсорадаптер выбрось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2006, 22:25 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
заморочки одни, работайте через ODBC, создайте курсоры (если надо - с параметрами) и тогда команда =tableupdate(.t.,.t.,'имя курсора) сбросит из буфера в базу SQL а команда =requery('имя курсора') покажет что там прописалось в поле identity... а там уже берете поле ID и делаете с ним то что вам нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2006, 22:27 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
кстати команда tableud.. не обязательна, =requery('имя курсора') тоже сбросит в базу ваш буфер.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2006, 22:28 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Hi FoXXX! > кстати команда tableud.. не обязательна, =requery('имя курсора') тоже > сбросит в базу ваш буфер.. Нет не сбросит. При некотором стечении обстоятельств (в частности при использовании практически неуправляемой строчной буферизации) может пройти автоматический сброс буфера, но в нормальной ситуации мы просто получим ошибку 1545 - Table buffer for alias "name" contains uncommitted changes. А вообще это неправильный подход - перезапрос это перезапрос, а извлечение Identity после вставки - это совсем другая песня... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 02:20 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
В смысле неправильны подход... tableup - сбрасывает записи в базу requer - получает их обратно уже с значениями ident - самый правильный и реальный подход. у меня req ни разу не ругнулась пока, пользую vfp9 - mssql2000, но может вы и правы. а если вы будете гипотетически предполагать какой номер присвоит sql следующей записи, через спец функции sql например, вы попадете впросак, т.к. другой пользователь в этот момент сбросит свои записи и ваш ident будет неверен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2006, 16:17 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Hi FoXXX! > tableup - сбрасывает записи в базу > requer - получает их обратно уже с значениями ident - самый правильный и > реальный подход. Конечно, если тебя не интересует возврат на "ту самую" запись которая была активна на момент "перед сохранением" - то это вполне реально - а вот если действительно нужно вернуться на "текущую запись" - то в общем случае это НЕВОЗМОЖНО при использовании REQUERY(). В частных (т.е. далеко не во всех!!!) случаях помогает поле ключа-кандидата (т.е. по сути "второй ключ" который реально создаётся на клиенте) - но в общем случае это не выход. > у меня req ни разу не ругнулась Не в этом проблема. Никто ни на что не ругается - просто невозможно в НОВОМ курсоре (а после перезапроса мы как раз получаем по сути новый курсор! Точнее старые записи выкидываются, а курсор наполняется новыми записями) найти нужную запись - а иногда эта "новая запись" вообще не попадает в курсор после перезапроса! Скажем не проходит по условиям отбора (добавить то в курсор такую запись не проблема, а вот после перезапроса её уже не достать). > а если вы будете гипотетически предполагать Ни в коем случае! Никаких "гипотез" или "предположений"! > какой номер присвоит sql следующей записи Это для IDENTITY невозможно узнать! > через спец функции sql например Таких функций нет - есть функции которые вернут то значение которое УЖЕ ПРИСВОЕНО - т.е. получить ID не ДО вставки, а ПОСЛЕ - когда оно уже реально существует. > вы попадете впросак, т.к. другой пользователь в этот момент сбросит свои > записи и ваш ident будет неверен. Ни @@IDENTITY ни SCOPE_IDENTITY() никак не могут зависеть от "других пользователей" - поскольку они связаны с сессией - а у разных пользователей естественно разные сессии. Можешь провести свой эксперимент если уж не доверяешь документации. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2006, 20:05 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
может мы о разных вещах говорим, на мой взгляд состояние базы, присвоение ID не зависит от сессии и пользователя, т.е. база одна для всех и распределение id едино, т.е. есть счетчик он ставит следующий номер следующей введеной записи, и не важно с какой сессии это произошло, кто первый тот и получил. может я тут немного с ораклом спутал, но помнится мне толи в оракле толи в мсскл я получал через функцию следющий номер id который будет присвоен записи, что в скл этого нет? по поводу записи на которую не вернуться, ну наверно есть уникальное поле по которому можно сделать locate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 10:39 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
FoXXXпо поводу записи на которую не вернуться, ну наверно есть уникальное поле по которому можно сделать locate? Так это уникальное поле (первичный ключ таблицы - PK) и генерится очень часто с помощью свойства IDENTITY (не зря ведь оно может быть только одно на таблицу). FoXXX но помнится мне толи в оракле толи в мсскл я получал через функцию следющий номер id который будет присвоен записи, что в скл этого нет? Пока вы раздумываете, что делать с этим новым значением ID, другой процесс может вставить эту запись.. Ну не таблицу же всю блокировать при вставке записи. А что касается слов Igor Korolyov о том, что "....@@IDENTITY ни SCOPE_IDENTITY() никак не могут зависеть от "других пользователей" - поскольку они связаны с сессией - а у разных пользователей естественно разные сессии....", то он имел в виду, что эти функции работают ТОЛЬКО при вставки записи в таблицу, имеющую свойство IDENTITY. Попробуйте SELECT @@IDENTITY или SELECT SCOPE_IDENTITY() БЕЗ вставки и получите NULL. А после вставки вернется то значение, которое попало в таблицу со свойством IDENTITY. Далее запись можете вернуть клиенту SELECT... FROM ... WHERE ID = SCOPE_IDENTITY(). С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 10:58 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
FoXXXможет мы о разных вещах говорим, на мой взгляд состояние базы, присвоение ID не зависит от сессии и пользователя, т.е. база одна для всех и распределение id едино, т.е. есть счетчик он ставит следующий номер следующей введеной записи, и не важно с какой сессии это произошло, кто первый тот и получил. ЧТО получил? -) Первый пользователь создал новую запись -) Второй пользователь создал новую запись -) Первый пользователь запросил значение ключа ПОСЛЕДНЕЙ созданной записи. ЧТО он получил? Понятно о чем речь? Если не делать "разграничения" по сессиям и пользователям, то получишь код ПОСЛЕДНЕЙ созданной записи. При этом далеко не факт, что эта именно та запись, которая тебе и нужна. BOL MS SQL 2000@@IDENTITY and SCOPE_IDENTITY will return the last identity value generated in any table in the current session. However, SCOPE_IDENTITY returns the value only within the current scope; @@IDENTITY is not limited to a specific scope. Т.е. и @@IDENTITY, и SCOPE_IDENTITY работают в пределах одной сессии. Грубо говоря, действия "другого" пользователя с точки зрения последнего присвоенного кода - игнорируются. Однако существует другая проблема. Создание новой записи таблицы может вызвать срабатывание триггера, внутри которого будет выполнено также создание новой записи. В этом случае @@IDENTITY вернет значение, созданное именно внутри тела триггера, а не в первой команде INSERT. Именно для устранения подобной неоднозначности и была введена SCOPE_IDENTITY() BOL MS SQL 2000 SCOPE_IDENTITYReturns the last IDENTITY value inserted into an IDENTITY column in the same scope. A scope is a module -- a stored procedure, trigger, function, or batch. Thus, two statements are in the same scope if they are in the same stored procedure, function, or batch. Т.е. SCOPE_IDENTITY() вернет значение, присвоенное именно в данном программном модуле или пакете. Проигнорировав присвоения, сделанные в других модулях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2006, 11:13 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
ребята, вы конечно асы по разным заумным высказываниям, но я вам просто и доходчиво обьясняю: =TABLEUPDATE(.t.,.t.,'x') потом =requery('x') потом go bottom все сразу и мгновенно, а если данная запись не попадает в данный запрос, то позвольте это считать уникальным случаем имеющим право на другое решение. по поводу получения ID я и сказал тупиковый путь. если с моим решением не согласны по обьективным причинам - обоснуйте, а то все что-то говорят с желанием блеснуть познаниями в Fox, такое впечатление - лишбы что-нибудь ляпнуть, покрасоваться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 08:05 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
FoXXXребята, вы конечно асы по разным заумным высказываниям, но я вам просто и доходчиво обьясняю: =TABLEUPDATE(.t.,.t.,'x') потом =requery('x') потом go bottom все сразу и мгновенно, а если данная запись не попадает в данный запрос, то позвольте это считать уникальным случаем имеющим право на другое решение. если с моим решением не согласны по обьективным причинам - обоснуйте Обосновываю: -) Первый пользователь добавил запись и сделал TableUpdate() -) Второй пользователь добавил запись и сделал TableUpdate() -) Первый пользователь сделал Requery(), перешел к последней записи и ЧТО он прочитал? ЧЕЙ код? Тот что сам добавил, или тот что добавил ДРУГОЙ пользователь. FoXXXпо поводу получения ID я и сказал тупиковый путь. ... , а то все что-то говорят с желанием блеснуть познаниями в Fox, такое впечатление - лишбы что-нибудь ляпнуть, покрасоваться... Неправильно сказал. Именно получение ID и есть "генеральная линия партии". Вам разными путями пытались это объяснить. А вовсе не из желания покрасоваться. Разъяснения сводились к тому, что именно надо делать и каким образом. А именно, использование функции SCOPE_IDENTITY() и "спасет отца русской демократии". Так что, изначальный вопрос Sergej_S очень правильный. Он как раз и действует "как надо". Другой вопрос, как это "надо" вписать в механизм Cursor Adapter. Это надо разбираться отдельно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 11:36 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
ВладимирМ FoXXXребята, вы конечно асы по разным заумным высказываниям, но я вам просто и доходчиво обьясняю: =TABLEUPDATE(.t.,.t.,'x') потом =requery('x') потом go bottom все сразу и мгновенно, а если данная запись не попадает в данный запрос, то позвольте это считать уникальным случаем имеющим право на другое решение. если с моим решением не согласны по обьективным причинам - обоснуйте Обосновываю: -) Первый пользователь добавил запись и сделал TableUpdate() -) Второй пользователь добавил запись и сделал TableUpdate() -) Первый пользователь сделал Requery(), перешел к последней записи и ЧТО он прочитал? ЧЕЙ код? Тот что сам добавил, или тот что добавил ДРУГОЙ пользователь. FoXXXпо поводу получения ID я и сказал тупиковый путь. ... , а то все что-то говорят с желанием блеснуть познаниями в Fox, такое впечатление - лишбы что-нибудь ляпнуть, покрасоваться... Неправильно сказал. Именно получение ID и есть "генеральная линия партии". Вам разными путями пытались это объяснить. А вовсе не из желания покрасоваться. Разъяснения сводились к тому, что именно надо делать и каким образом. А именно, использование функции SCOPE_IDENTITY() и "спасет отца русской демократии". Так что, изначальный вопрос Sergej_S очень правильный. Он как раз и действует "как надо". Другой вопрос, как это "надо" вписать в механизм Cursor Adapter. Это надо разбираться отдельно... да вы батенька - фантаст однако... ну надо же, два одновременно добавили запись, весь набор команд выполняется мгновенно практически пакетом, каким образом успевает второй всунуться после табле апдейт, это ж постараться надо.. ситуация блин.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 12:06 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
C++FoXORASQL да вы батенька - фантаст однако... ну надо же, два одновременно добавили запись, весь набор команд выполняется мгновенно практически пакетом, каким образом успевает второй всунуться после табле апдейт, это ж постараться надо.. ситуация блин.. Где Вы здесь увидели пакет? Это же не MS SQL. Это команды FoxPro. Есть 2 последовательно выполняющиеся команды FoxPro Код: plaintext 1. 2. MS SQL просто никак не может получить их "пакетом". Он получит две отдельные команды. Даже если опустить тот факт, что ТАК программы никто не пишет. На практике, между TableUpdate() и Requery() будет еще много чего вставлено (сброс данных в другие таблицы, проверка ошибок, завершение транзакции и т.д. и т.п.). То КАК Вы себе представляете процесс работы? TableUpdate() - это команда на модификацию, Requery() - команда на чтение. Две разные команды. Почему между ними не может "втиснуться" другая команда? При этом, я не вижу причин, почему вcтавка записи другим пользователем, не может произойти в процессе выполнения Requery(). Правда, тут нужно знать, как именно происходит процесс чтения данных. Т.е. внутреннюю "механику" команды Requery() В данном случае аргумент типа "весь набор команд выполняется мгновенно практически пакетом" ничем не отичается от аргумента "успевает второй всунуться после табле апдейт". Просто "голословные" утверждения, что с одной, что с другой стороны. Только вот, почему-то в HELP по MS SQL нигде не говорится, что получить код последней вставленной записи можно простым вычислением максимального значение (GO BOTTOM - это и есть определение MAX). И чего они, дураки, мучаются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 13:07 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
чего они мучаются не знаю, процесс работы requery можно посмотреть в SQL Profiler go bottop, скорее не max а последняя запись, т.е. запись последняя в таблице, конечно гипотетически можно предположить что кто-то втиснет свою запись туда, ну на практике наврятли, хотя нужно попоробовать на двух компах двумя руками одновременно клацнуть клавиши... интересно произойдет то о чем вы говорите или нет? мне кажется нужно очень постараться, ну просто очень, и то сомневаюсь что у вас получится втиснуть пока отрабатывается команда одного из клиентов.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 13:45 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
к сожалению в данный момент по техническим причинам не могу произвести подобный эксперимент, если у вас есть такая возможность попробуйте проверте, добейтесь результата и вы меня переубедите.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 13:54 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
C++FoXORASQLчего они мучаются не знаю, процесс работы requery можно посмотреть в SQL Profiler go bottop, скорее не max а последняя запись, т.е. запись последняя в таблице, конечно гипотетически можно предположить что кто-то втиснет свою запись туда, ну на практике наврятли, хотя нужно попоробовать на двух компах двумя руками одновременно клацнуть клавиши... интересно произойдет то о чем вы говорите или нет? мне кажется нужно очень постараться, ну просто очень, и то сомневаюсь что у вас получится втиснуть пока отрабатывается команда одного из клиентов.. Вы бы прочли внимательно, что Вам отвечали, а затем подумали и потом провели бы эксперименты, а то её богу забавно читать Ваши посты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 13:55 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
авторкурсорадаптер выбрось изв., что встреваю а чем курсорадаптер неугодил??? ну что-то не нравится - породите свой и допишите вкось и вкривь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 13:55 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
немного возражу ВладимируМ, вот он пишет: /*TableUpdate() - это команда на модификацию*/ на самом деле сброс буфера в базу, если используется буфер. команда раскладывается на insert, update ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 14:01 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
C++FoXORASQLнемного возражу ВладимируМ, вот он пишет: /*TableUpdate() - это команда на модификацию*/ на самом деле сброс буфера в базу, если используется буфер. команда раскладывается на insert, update На всякий случай напомню. В данной теме обсуждается вопрос создания новой записи в MS SQL сервере со стороны клиента FoxPro и получения значение поля со свойством Identity в этой новой записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 14:14 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
ВладимирМ C++FoXORASQLнемного возражу ВладимируМ, вот он пишет: /*TableUpdate() - это команда на модификацию*/ на самом деле сброс буфера в базу, если используется буфер. команда раскладывается на insert, update На всякий случай напомню. В данной теме обсуждается вопрос создания новой записи в MS SQL сервере со стороны клиента FoxPro и получения значение поля со свойством Identity в этой новой записи. не понял, извините. а я про что?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 14:17 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
C++FoXORASQL на самом деле сброс буфера в базу, если используется буфер. команда раскладывается на insert, update Ну вот другое дело, есть конкретный вопрос При КС технологии всегда есть буфер клиента (промежуточный курсор) который сбрасывается на сервер. Есть два метода модификации данных на сервере - использование старых данных эквивалентно (UPDATE Table SET .... WHERE) - использование новых данных эквивалентно пакету (DELETE FROM Table WHERE + INSERT INTO Table VALUES(.....)) за это отвечает установка CURSORSETPROP('UpdateType') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 14:20 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
так работает (выглядит) requery() в MS SQL: SELECT * FROM dbo.por Por так работает tableupd(): UPDATE dbo.tablica SET rezoluc='sadsadasd' WHERE id=5318 было изменено 2 поля. UPDATE dbo.tablica SET rezoluc='asfasdasdsad' WHERE id=5379 используется буфер Use form setting (default) и 2-Optimistic а так создается новая запись: exec sp_executesql N'INSERT INTO dbo.tablica (vhod_num,n_str,date_vruch,date_vozvr,ready) VALUES (@P1,@P2,@P3,@P4,@P5)', N'@P1 numeric(7,0),@P2 char(5),@P3 smalldatetime,@P4 smalldatetime,@P5 smalldatetime', 3235, '1 ', 'Mar 7 2006 12:00AM', NULL, NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 14:36 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
C++FoXORASQLтак работает (выглядит) requery() в MS SQL: SELECT * FROM dbo.por Por так работает tableupd(): UPDATE dbo.tablica SET rezoluc='sadsadasd' WHERE id=5318 было изменено 2 поля. UPDATE dbo.tablica SET rezoluc='asfasdasdsad' WHERE id=5379 используется буфер Use form setting (default) и 2-Optimistic а так создается новая запись: exec sp_executesql N'INSERT INTO dbo.tablica (vhod_num,n_str,date_vruch,date_vozvr,ready) VALUES (@P1,@P2,@P3,@P4,@P5)', N'@P1 numeric(7,0),@P2 char(5),@P3 smalldatetime,@P4 smalldatetime,@P5 smalldatetime', 3235, '1 ', 'Mar 7 2006 12:00AM', NULL, NULL Что Вы хотите, что бы Вам прокоментировали? Для команды Requery() результатом которой является Код: plaintext Для команды TableUpdate результатом которой является Код: plaintext Код: plaintext При создании новой записи почитайте о Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 15:21 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
я нихочу коментариев, это я вам показал что происходит в сервере когда я работаю в клиенте фокса и использую вышеобозначенные команды, вопрос был что там происходит, я дал ответ: происходит это и привел пример, вот и все... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2006, 15:35 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=267&tid=1592046]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 326ms |

| 0 / 0 |
