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

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

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

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как автомат-ки получать автоинкриментное поле SQL сервера в КА
    #33549480
Фотография FoxLamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно еще так.
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
Как автомат-ки получать автоинкриментное поле SQL сервера в КА
    #33553675
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как автомат-ки получать автоинкриментное поле SQL сервера в КА
    #33555218
Фотография FoxLamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov, доброго времени суток!

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

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

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


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