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

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

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

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

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

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

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

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

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

Но как получить значение @r1 в фокс?
...
Рейтинг: 0 / 0
06.10.2004, 15:01
    #32726113
Гость11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокировка
2leaf: согласен но мне нужно обязательно получить в приложение значение поля table1.nextid, которое было до update.
...
Рейтинг: 0 / 0
06.10.2004, 15:03
    #32726125
Гость11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокировка
2Владимир: просто в таблице всегда только одна строка поэтому и нет никакого where
...
Рейтинг: 0 / 0
06.10.2004, 15:14
    #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
06.10.2004, 15:15
    #32726164
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокировка
я бы на Вашем месте задумался о UDF тогда возможно можно получить в курсор значение
...
Рейтинг: 0 / 0
06.10.2004, 15:15
    #32726168
Гость11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокировка
расшифруйте пожалуйста что такое UDF
...
Рейтинг: 0 / 0
06.10.2004, 15:17
    #32726174
Гость11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
блокировка
что такое udf посмотрел. тогда такой вопрос Могут ли два приложения одновременно вызвать одну и ту же функцию?
...
Рейтинг: 0 / 0
06.10.2004, 15:21
    #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
06.10.2004, 15:28
    #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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / блокировка / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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