Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
блокировка
|
|||
|---|---|---|---|
|
#18+
приложение VFP+база MS SQL SERVER в приложении есть функция ************************* FUNCTION NewId() ************************* LOCAL r1 r1="" SQLExe(handle,"SELECT NEXTID FROM table1","a1") GO TOP IN a1 r1=STR(VAL(a1->NEXTID) + 1,10) SQLExec(handle,"UPDATE table1 SET table1.NEXTID=?r1") RETURN r1 вопрос в следующем: этот id должен быть уникальным. а в моей функции между 2-мя sqlexec может вклинится аналогичная ф-я из другого приложения. Как я понимаю здесь нужно использовать блокировки, но я не знаю как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 13:48 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
да видимо у всех обед)) Такой еще вопрос: а если перенести эту функцию на сервер в хранимую процедуру, вопрос решится автоматически? Могут ли два приложения одновременно вызвать одну и ту же процедуру? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 14:28 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
гость11приложение VFP+база MS SQL SERVER в приложении есть функция ... вопрос в следующем: этот id должен быть уникальным. а в моей функции между 2-мя sqlexec может вклинится аналогичная ф-я из другого приложения. Как я понимаю здесь нужно использовать блокировки, но я не знаю как. Блокировку чего? Всей таблицы? В принципе можно, но лучше не надо. Есть несколько стратегии работы: 1) Использовать автоинкрементные поля в MS SQL (Idetntity). Сделай поиск по слову Identity, найдешь много интересного 2) Достаточно сделать уникальный индекс или констрейнт по твоему полю. В этом случае просто физически невозможно будет вставить одинаковые значения. Однако тогда придется обрабатывать возможные сообщения об ошибке на команде UPDATE и наращивать номер ключа 3) Вместо автоинкремента можно использовать символьные поля с генерацией GUID (некой уникальной символьной строки). Есть масса функций по его генерации. Только не надо использовать SYS(2015) или SYS(3). Они теоретически могут дать повторяющиеся значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 14:48 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
гость11да видимо у всех обед)) Такой еще вопрос: а если перенести эту функцию на сервер в хранимую процедуру, вопрос решится автоматически? Могут ли два приложения одновременно вызвать одну и ту же процедуру? Нет. Не могут. ХП будет выполняться строго по очереди. Сначала для одного пользователя, затем для другого. Правда не понятно, а что же именно ты обновляешь. По твоему коду, ты обновляешь вообще ВСЕ записи таблицы table1. Это действительно необходимо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 14:51 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
возможно я бы перенес на сервер или по крайней мере как-то так pError=SQLExe(handle,"UPDATE table1 SET table1.NEXTID=(SELECT TOP 1 NEXTID+1 FROM table1")) потому что разбивать на два запроса помоему просто недопустимо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 14:53 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
хранимка будет такой: DECLARE @r1 char(10) SELECT @r1 = NEXTID FROM STATES select @r1 UPDATE STATES SET STATES.NEXTID=@r1+1 Но как получить значение @r1 в фокс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 14:59 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
2leaf: согласен но мне нужно обязательно получить в приложение значение поля table1.nextid, которое было до update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 15:01 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
2Владимир: просто в таблице всегда только одна строка поэтому и нет никакого where ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 15:03 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
целиком хранимка выглядит так: CREATE PROCEDURE NewIdSql AS declare @r1 char(10) SELECT @r1 = NEXTID FROM STATES UPDATE STATES SET STATES.NEXTID=@r1+1 GO Но как полчить значение @r1 в фокс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 15:14 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
я бы на Вашем месте задумался о UDF тогда возможно можно получить в курсор значение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 15:15 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
расшифруйте пожалуйста что такое UDF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 15:15 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
что такое udf посмотрел. тогда такой вопрос Могут ли два приложения одновременно вызвать одну и ту же функцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 15:17 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
в вашем случае можно так: CREATE PROCEDURE NewIdSql AS declare @r1 char(10) SELECT @r1 = NEXTID FROM STATES UPDATE STATES SET STATES.NEXTID=@r1+1 select @r1 GO в фоксе вызов: SQLExe(handle,"exec NewIdSql","a1") @r1 будет в а1.ехр ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 15:21 |
|
||
|
блокировка
|
|||
|---|---|---|---|
|
#18+
гость11целиком хранимка выглядит так: CREATE PROCEDURE NewIdSql AS declare @r1 char(10) SELECT @r1 = NEXTID FROM STATES UPDATE STATES SET STATES.NEXTID=@r1+1 GO Но как полчить значение @r1 в фокс? Не знаю как в SQL Server, но в Oracle я объявляю в процедуре out параметр, что-то вроде: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2004, 15:28 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32726158&tid=1595683]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 386ms |

| 0 / 0 |
