uniqueidentifier

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
OVV
Бывалый
Сообщения: 58
Зарегистрирован: 21 Сентябрь 2005, 9:41
Откуда: Московская область

uniqueidentifier

Сообщение OVV » 25 Август 2010, 16:02

Приветствую всех!

В таблице на MS SQL 2000 Primary key поле типа uniqueidentifier. Default value - newid()
Какой тип надо поставить полю в словаре и что написать в Initial Value ?

С уважением,
Олейников Виктор.

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Re: uniqueidentifier

Сообщение Admin » 25 Август 2010, 23:22

OVV писал(а):В таблице на MS SQL 2000 Primary key поле типа uniqueidentifier. Default value - newid()
Какой тип надо поставить полю в словаре и что написать в Initial Value ?
Кажется STRING(36)
Инициализируй на стороне сервера как NEWID()
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

OVV
Бывалый
Сообщения: 58
Зарегистрирован: 21 Сентябрь 2005, 9:41
Откуда: Московская область

Re: uniqueidentifier

Сообщение OVV » 26 Август 2010, 10:42

Так и сделано. Но при добавлении записи id = '' (пустой строке) и следующий MAVGET дает ошибку.
Не совсем понял. А при чем тут пустая строка?
MAVCLEAR перед добавлением записи делаем?
потом назначаем поля (исключая поле с UID) и делаем MAVINSERT
Все должно быть Ok

OVV
Бывалый
Сообщения: 58
Зарегистрирован: 21 Сентябрь 2005, 9:41
Откуда: Московская область

Re: uniqueidentifier

Сообщение OVV » 26 Август 2010, 13:33

OVV писал(а):
Так и сделано. Но при добавлении записи id = '' (пустой строке) и следующий MAVGET дает ошибку.
Не совсем понял. А при чем тут пустая строка?
MAVCLEAR перед добавлением записи делаем?
потом назначаем поля (исключая поле с UID) и делаем MAVINSERT
Все должно быть Ok
Вот чего я совсем не понял как это мне от меня ответили! :cry:
И куда делся мой предыдущий пост? Хорошо хоть в quote остался...

А по существу - я делаю не руками, а стандартным MAV SQLForm. Он делает все необходимое.
В процедуре MAV:Save.Completed перед MAVGET ключевое поле пустое и как следствие:
"Недопустимое символьное значение для указания отклонения (22018)
...
... Binding field Id = пусто...
"

Руками пробовал - на серваке запись создается.
Вопрос в том как получить обратно GUID созданной записи.

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Re: uniqueidentifier

Сообщение Admin » 26 Август 2010, 23:10

Вот чего я совсем не понял как это мне от меня ответили! :cry:
И куда делся мой предыдущий пост? Хорошо хоть в quote остался...
Это я нечаянно отредактировал пост твой :)
А по существу - я делаю не руками, а стандартным MAV SQLForm. Он делает все необходимое.
В процедуре MAV:Save.Completed перед MAVGET ключевое поле пустое и как следствие:
"Недопустимое символьное значение для указания отклонения (22018)
...
... Binding field Id = пусто...
"
это поле должно быть по идее NULL а не пусто. попробуй для него поставить атрибут ReadOnly в словаре.
Руками пробовал - на серваке запись создается.
Вопрос в том как получить обратно GUID созданной записи.
После добавления записи в буфере должны быть данные добавленной записи. Или как минимум Primary Key ID
По ID получи запись вновь добавленную.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

OVV
Бывалый
Сообщения: 58
Зарегистрирован: 21 Сентябрь 2005, 9:41
Откуда: Московская область

Re: uniqueidentifier

Сообщение OVV » 27 Август 2010, 11:20

Admin писал(а):
Вот чего я совсем не понял как это мне от меня ответили! :cry:
Это я нечаянно отредактировал пост твой :)
Фух... А то я уж думал, что у меня раздвоение личности! :D
Admin писал(а):это поле должно быть по идее NULL а не пусто. попробуй для него поставить атрибут ReadOnly в словаре.
ReadOnly в словаре стоит.
Admin писал(а):После добавления записи в буфере должны быть данные добавленной записи. Или как минимум Primary Key ID
По ID получи запись вновь добавленную.
Так в том-то и дело, что Primary Key ID на серваке это и есть uniqueidentifier. И когда запись на серваке создана я не могу ее считать так как не знаю ее ID. Может в словаре в Initial Value надо что-то написать? SCOPE_IDENTITY и IDENT_CURRENT('...') не катят...

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Re: uniqueidentifier

Сообщение Admin » 28 Август 2010, 1:26

Андрея Мялина нужно спросить... никогда не вязали таблицы uniqueidentifier.
Связь у нас по обычному INT полю а в каждой табле есть допполе с uniqueidentifier
Жизнь так проще... и связи отследить в ручную в случае чего... :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 15:32
Откуда: Москва, Зеленоград

Re: uniqueidentifier

Сообщение Andrew™ » 01 Сентябрь 2010, 7:29

с этим полем работать как с IDENTITY, т е какой SELECT записать в Initial values в DCT я не знаю (цели такой не было), а как с ним в проге работать штатно:

в DCT это обычное поле STRING(16) без дополнительных свойств

в форме редактирование такой записи

Код: Выделить всё

MAV:Save.Insert   FUNCTION ! вставляем в самое начало
tmp MAVSelect
 CODE
   tmp.Init(,1,1)
   tmp.BindField(File:Field_uniqueidentifier)
   IF tmp.Run('select NEWID()') OR tmp.Fetch()
     MAVSHOWERROR
    RETURN 1
  END

ВСЁ!

ЗЫ
Тип данных uniqueidentifier имеет несколько недостатков.

•Значения являются длинными и непонятными. Поэтому пользователям сложно вводить их без ошибок и еще сложнее запоминать.

•Значения являются случайными, в них нельзя поместить никакие последовательности, которые сделали бы значения более осмысленными для пользователей.

•Не существует способа определить, в какой последовательности были созданы значения типа uniqueidentifier. Они не приспособлены для использования существующими приложениями, полагающимися на последовательное возрастание ключей в последовательности.

•Занимая 16 байт, тип данных uniqueidentifier является относительно большим по сравнению с другими типами данных (например с 4-байтовыми целыми). Индексы, построенные на ключах типа uniqueidentifier, могут работать медленнее по сравнению с индексами, где используются ключи типа int.

Если глобальная уникальность не требуется или нужен ключ с последовательно возрастающими значениями, рекомендуется использовать свойство IDENTITY.

Ответить