Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как автомат-ки получать автоинкриментное поле SQL сервера в КА / 6 сообщений из 6, страница 1 из 1
14.02.2006, 06:25
    #33542340
foll_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как автомат-ки получать автоинкриментное поле SQL сервера в КА
Уважаемые помогите рассказав

Использую курсорадаптеры для подсоединения к SQL SErver-ским таблицам. Все просто замечательно, но чую что кое-что можно сделать лучше, а точнее сказать правальнее. Допустим на сервере есть таблица, поле ID которой автоинкриментное, при создании курсорадаптера указваю, что разрещаю изменения и ключом ставлю поле ID
И теперь сам вопрос: в программе, когда пишу TABLEUPDATE, как можно автоматически получать поле ID, сгенерированное на сервере. Сейчас получаю так - делаю рефреш КА после чего перемещаюсь на максимальное значение ID.
...
Рейтинг: 0 / 0
16.02.2006, 02:22
    #33547866
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как автомат-ки получать автоинкриментное поле SQL сервера в КА
Hi foll_!

Если VFP9 то см. InsertCmdRefreshCmd, InsertCmdRefreshFieldList,
InsertCmdRefreshKeyFieldList...
А вообще не вынимают в таких схемах "максимальное значение" - иначе будет
глюк - пару человек одновременно добавят записи, и все они получат после
рефреша одно и то-же значение - конечно все кроме одного "не своё". В SQL
сервере есть группа функций и переменных для решения проблемы получения
"своего" значения идентификатора - @@IDENTITY, SCOPE_IDENTITY() про них и
читай - их и используй.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
16.02.2006, 15:37
    #33549480
FoxLamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как автомат-ки получать автоинкриментное поле SQL сервера в КА
А можно еще так.
1.В БД на сервере создать единственную таблицу с полем identity и процедуру
для его получения.

use DBNameTest
GO

CREATE TABLE [IDALL] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[user_id] int NULL
CONSTRAINT [PK_idall] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE PROCEDURE get_id @user_id int=0
AS

INSERT INTO IDALL ([user_id])
VALUES(@user_id)
select @@identity as next_id
GO

2. С клиента для получения будующего ИД:
lcSql='exec DBNameTest.dbo.get_id ?iuser_id'
sqlexec(nConnect, lcSql, 'temp')

lnNextId=temp.next_id
и далее используем lnNextId для вставки в нужную таблицу в качестве ИД

3. Но я так не делаю :)
...
Рейтинг: 0 / 0
18.02.2006, 04:41
    #33553675
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как автомат-ки получать автоинкриментное поле SQL сервера в КА
Hi FoxLamer!

Получение уникального номера без использования identity можно организовать
гораздо проще и красивее:
- использовать GUID - его кстати генерирует в MS SQL функция NewId() ;)
- использовать аналог фоксовой функции NewId (тоже со служебной таблицей
хранящей "последние использованные" значения для ключей) - блокировка
реализуется при помощи select ... for update - а можно и вовсе обойтись без
блокировки - это довольно известная схема - просто в Update включается
дополнительное условие сравнивающее текущее значение поля с его ранее
(предыдущим SELECT-ом) полученным значением - если update обновил 0
записей - значит кто-то успел "влезть" между 2-мя нашими запросами - select
и update - значит необходимо повторить весь процесс.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
20.02.2006, 11:44
    #33555218
FoxLamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как автомат-ки получать автоинкриментное поле SQL сервера в КА
Igor Korolyov, доброго времени суток!

Я пользуюсь классическим способом с использованием @@identity.
А MSSQL функцию Newid() удобно использовать еще для случайной сортировки выборки

select * from MyTable
order by newid()
...
Рейтинг: 0 / 0
20.02.2006, 18:00
    #33556705
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как автомат-ки получать автоинкриментное поле SQL сервера в КА
FoxLamerIgor Korolyov, доброго времени суток!
Я пользуюсь классическим способом с использованием @@identity.

Я бы рекомендовал отказаться от @@IDENTITY, а заменть ее SCOPE_IDENTITY().
Если хотите, могу объяснить почему, но в BOL к SQL Server причина перехода подробна описана.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как автомат-ки получать автоинкриментное поле SQL сервера в КА / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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