|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Жил-не тужил, пока БД была MSSQL. Ключевые поля типа были типа uniqueidentifier, они автоматом преобразовывались на стороне фокса в Char(36). Пытаюсь безуспешно перейти на Firebird. Поставил драйвер Firebird ODBC. В FireBird типа uniqueidentifier нет, вместо него рекомендуют CHAR(16) в кодировке OCTETS (hex-строка). Я и в строках плаваю и в Firebird, если кто-то рубит в этом, буду признателен. Создаем таблицу в Firebird: Код: sql 1. 2. 3.
вставилось 37314641-4431-3546-2D44-3236422D3434 Из VFP, так работает, 1 запись вытягивается: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Так тоже работает (x' - префикс Fb для binary, как в фоксе 0h): Код: sql 1. 2. 3. 4.
Но мне надо значение id_ передавать через параметр: Код: sql 1. 2. 3. 4. 5. 6. 7.
курсор приходит пустым, трассировка на Firebird показывает входящий запрос: SELECT id_ FROM MyTable WHERE id_ = ? param0 = varchar(16), "" 0 records fetched Не понимаю, почему Varbinary фокса переходит в Varchar (пустой) на сервере и как с этим бороться? М.б. надо как-то ODBC указать нужную трансляцию типов VFP-FB? Как? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 23:53 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Попробуй так Код: sql 1. 2. 3. 4. 5. 6.
или так Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 07:09 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Dima T, оператавно, спасибо. Я так уже пробовал, работает, но мне надо научаться значение id_ передавать через параметр [?] ибо основная работа идет через курсорадаптер, а там команды CAD.DeleteCmd, etc формируются автоматически из CAD.KeyFieldList. Очень хотелось бы это сохранить. А проблема в CAD такая же. Pass-through метод я привел для упрощения вопроса. Решу здесь, решу и в CAD. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 10:02 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Sergej_S, попробуйте так: Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 10:14 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Sergej_S мне надо научаться значение id_ передавать через параметр [?] Мой первый вариант был с параметром. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 10:20 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Dima T Sergej_S мне надо научаться значение id_ передавать через параметр [?] Мой первый вариант был с параметром. Код: sql 1.
а надо Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 10:30 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Погуглил. У FB есть UUID_TO_CHAR() и CHAR_TO_UUID() . Можно с их помощью конвертировать в строку и обратно чтобы фокс работал со строкой. PS FB не разу не использовал ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 10:37 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Dima T Погуглил. У FB есть UUID_TO_CHAR() и CHAR_TO_UUID() . Можно с их помощью конвертировать в строку и обратно чтобы фокс работал со строкой. Код: sql 1.
PS FB не разу не использовалТака ж фигня :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 10:45 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Dima T Мой первый вариант был с параметром. Сорри, пропустил. Код: sql 1. 2. 3. 4. 5. 6.
выдает 0 строк, т.к. на сервер приходит: param0 = varchar(16), "3731464144313546", т.е. обрезанным до 16 симв. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 11:25 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Sergey Sizov Dima T Погуглил. У FB есть UUID_TO_CHAR() и CHAR_TO_UUID() . Можно с их помощью конвертировать в строку и обратно чтобы фокс работал со строкой. Код: sql 1.
Не совсем так. qId это бинарные данные, их надо предварительно преобразовать в строку. Т.е. изначально получаем из БД так Код: sql 1. 2. 3.
а дальше Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 13:34 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Sergey Sizov Код: sql 1.
Как и сказал Dima T, не катит: Connectivity error: [ODBC Firebird Driver][Firebird]expression evaluation not supported Human readable UUID argument for CHAR_TO_UUID must be of exact length 36 Сейчас еще остальные варианты от Dima T попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 14:17 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Dima T, Код: sql 1. 2. 3. 4. 5.
наверное имелось в виду Код: sql 1. 2. 3. 4. 5.
но Firebird не видит поле cId. Я не помню, на mssql такое м.б. и прокатывает, но это не столь важно, т.к. из CAD все-равно не получится это вычисляемое поле cId исользовать как ключ. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 14:44 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Sergej_S Код: sql 1. 2.
но Firebird не видит поле cId. Firebird не должен видеть cId, его только фокс будет видеть. Firebird работает с id_ Идея в том что ты получаешь ID от сервера сконвертированным в строку Код: sql 1.
т.е. конвертация бинарного id_ в строковый cId и далее в фоксе работаешь как со строкой Код: sql 1.
при передаче как параметра обратная конвертация внутри запроса Код: sql 1.
Sergej_S Я не помню, на mssql такое м.б. и прокатывает, но это не столь важно, т.к. из CAD все-равно не получится это вычисляемое поле cId исользовать как ключ. Про это я не подумал, надо проверять, может проглотит. С MSSQL такой проблемы нет, т.к. он выдает GUID`ы как строки и по сути сам делает то, что я выше написал. Поспрашивай в форуме по FB: может как-то можно переключить драйвер или сервер чтобы он выдавал GUID`ы как строки, а не как бинарники. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 15:13 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Dima TИдея в том что ты получаешь ID от сервера сконвертированным в строку Код: sql 1.
т.е. конвертация бинарного id_ в строковый cId и далее в фоксе работаешь как со строкой Ну это все строки вытянутся на фокс, WHERE в запрос на сервер не попадает. Поспрашиваю на ветке Firebird. А с Postgree кто-то заботал? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 15:25 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
В общем, я вроде разобрался. Докладываю. Итак, на Firebird: Код: sql 1. 2.
Я дико извиняюсь, что ввел общественность в заблуждение: поле id_ по по-дефолту переходит в фокс не как Varbinary [Q(16)], а как Char [C(16)]. И в курсорадаптере и в pass-through. Не понимаю, как я так лажанулся, наверное d CAD.CursorSchema прописал. Итак, на стороне фокса эти 16-битные id_ имеют вид кракозябл, включая управляющие ACSCII символы с кодом < 32. Сделаем всякие преобразования: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 22:54 |
|
Firebird 3.0 + VFP9 + поля UUID(GUID)
|
|||
---|---|---|---|
#18+
Теперь вытянем ту же строку. Самый очевидный вариант не годится, т.к. если в cId16 будет символ кавычек или вопр.знак, то вылетит ошибка. Код: sql 1.
Этот выдаст 0 строк. Трассировка на сервере показывает, что приходит пустой ("") параметр, видимо из-за несоответствия varbinary и char: Код: sql 1.
Это работает. Но думаю, что стоит искать по индекcному полю id_, а не по его функции Код: sql 1.
Теперь imho правильные варианты: Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Про CAD. В CAD.CursorSchema для id_ пишу: 'id_ C(16) NOCPTRANS'. Хотя и без NOCPTRANS вроде работает, и вообще без определения CursorSchema. Поскольку в CAD запросы с параметрами (child-таблицы) у меня формируются при помощи параметров (ч/з вопр.знак), то проблем нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 23:05 |
|
|
start [/forum/topic.php?fid=41&fpage=5&tid=1581593]: |
0ms |
get settings: |
13ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 140ms |
0 / 0 |