powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / блокировка
14 сообщений из 14, страница 1 из 1
блокировка
    #32725908
Гость11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приложение 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 может вклинится аналогичная ф-я из другого приложения.
Как я понимаю здесь нужно использовать блокировки, но я не знаю как.
...
Рейтинг: 0 / 0
блокировка
    #32726021
Гость11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да видимо у всех обед))
Такой еще вопрос: а если перенести эту функцию на сервер в хранимую процедуру, вопрос решится автоматически? Могут ли два приложения одновременно вызвать одну и ту же процедуру?
...
Рейтинг: 0 / 0
блокировка
    #32726065
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гость11приложение VFP+база MS SQL SERVER
в приложении есть функция
...
вопрос в следующем: этот id должен быть уникальным. а в моей функции между 2-мя sqlexec может вклинится аналогичная ф-я из другого приложения.
Как я понимаю здесь нужно использовать блокировки, но я не знаю как.
Блокировку чего? Всей таблицы? В принципе можно, но лучше не надо.

Есть несколько стратегии работы:

1) Использовать автоинкрементные поля в MS SQL (Idetntity). Сделай поиск по слову Identity, найдешь много интересного

2) Достаточно сделать уникальный индекс или констрейнт по твоему полю. В этом случае просто физически невозможно будет вставить одинаковые значения. Однако тогда придется обрабатывать возможные сообщения об ошибке на команде UPDATE и наращивать номер ключа

3) Вместо автоинкремента можно использовать символьные поля с генерацией GUID (некой уникальной символьной строки). Есть масса функций по его генерации. Только не надо использовать SYS(2015) или SYS(3). Они теоретически могут дать повторяющиеся значения.
...
Рейтинг: 0 / 0
блокировка
    #32726074
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гость11да видимо у всех обед))
Такой еще вопрос: а если перенести эту функцию на сервер в хранимую процедуру, вопрос решится автоматически? Могут ли два приложения одновременно вызвать одну и ту же процедуру?
Нет. Не могут. ХП будет выполняться строго по очереди. Сначала для одного пользователя, затем для другого.

Правда не понятно, а что же именно ты обновляешь. По твоему коду, ты обновляешь вообще ВСЕ записи таблицы table1. Это действительно необходимо?
...
Рейтинг: 0 / 0
блокировка
    #32726084
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно я бы перенес на сервер или по крайней мере как-то так

pError=SQLExe(handle,"UPDATE table1 SET table1.NEXTID=(SELECT TOP 1 NEXTID+1 FROM table1"))

потому что разбивать на два запроса помоему просто недопустимо
...
Рейтинг: 0 / 0
блокировка
    #32726102
Гость11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хранимка будет такой:
DECLARE @r1 char(10)

SELECT @r1 = NEXTID FROM STATES
select @r1
UPDATE STATES SET STATES.NEXTID=@r1+1

Но как получить значение @r1 в фокс?
...
Рейтинг: 0 / 0
блокировка
    #32726113
Гость11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2leaf: согласен но мне нужно обязательно получить в приложение значение поля table1.nextid, которое было до update.
...
Рейтинг: 0 / 0
блокировка
    #32726125
Гость11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир: просто в таблице всегда только одна строка поэтому и нет никакого where
...
Рейтинг: 0 / 0
блокировка
    #32726158
Гость11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
целиком хранимка выглядит так:
CREATE PROCEDURE NewIdSql AS
declare @r1 char(10)
SELECT @r1 = NEXTID FROM STATES
UPDATE STATES SET STATES.NEXTID=@r1+1
GO
Но как полчить значение @r1 в фокс?
...
Рейтинг: 0 / 0
блокировка
    #32726164
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы на Вашем месте задумался о UDF тогда возможно можно получить в курсор значение
...
Рейтинг: 0 / 0
блокировка
    #32726168
Гость11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
расшифруйте пожалуйста что такое UDF
...
Рейтинг: 0 / 0
блокировка
    #32726174
Гость11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что такое udf посмотрел. тогда такой вопрос Могут ли два приложения одновременно вызвать одну и ту же функцию?
...
Рейтинг: 0 / 0
блокировка
    #32726187
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в вашем случае можно так:
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.ехр
...
Рейтинг: 0 / 0
блокировка
    #32726214
Молодой Я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гость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.
create or replace procedure test_proc1(Res out number) is
begin
...
Res:=...
end test_proc1;
В Фоксе вызываю эту процедуру так:
Код: plaintext
1.
vl_ResProc=- 1 
SQLEXEC(nHandle,"CALL test_proc1(?@vl_ResProc)")
И в результате отработки процедуры значение у vl_ResProc новое.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / блокировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]