Обновление ТЕКСТА по сравнению с вставкой ТЕКСТА на Informix Dynamic Server

Я поддерживаю сторонний драйвер Informix, написанный с использованием вызовов в стиле ESQL (Informix API). Я работаю над ошибкой, когда для полей ТЕКСТ вставки работают нормально, а ОБНОВЛЕНИЯ не работают. Пошагово просматривая код, я обнаружил, что мы проверяем нашу структуру sqlda, чтобы сообщить нам, нужно ли и как выполнять привязку, и после вызова sqli_describe_statement переменная sqlda.sqld содержит 2, правильное количество связанных параметров для этот вызов вставки, и параметры кажутся настроенными правильно, тогда как в случае обновления возвращаемое число равно 0, без информации о параметрах (он должен быть 1 для одного параметра в: «UPDATE TESTTAB SET COLNAME =? WHERE OTHERCOLNAME = 1 ").

Используя информацию sqlda, мы правильно настроили необходимую структуру локатора для INSERT, но мы не можем выполнить обновление, потому что информации там нет. Если я подделываю его в отладчике и запускаю код установки локатора для обновления, он обновляется нормально.

Выражение определенно кажется правильным, и для INSERT используется та же переменная, что и для привязки UPDATE. Более того, у sqli_prep нет проблем с обновлением. Для описания sqsla.code возвращает разные неотрицательные числа 4 и 6, представляющие различные типы описываемых операторов, как документированные (т.е. не код ошибки), так что здесь нет очевидной проблемы.

  1. Есть ли что-то еще, что я должен проверить в коде перед этим, что может вызвать такое странное поведение (кроме обработки особых случаев для разных запросов - там ничего)

  2. Я упускаю здесь что-то фундаментальное о том, как ОБНОВЛЯТЬ поля ТЕКСТА, например, вам нужно создать объект-указатель, найти строку, трижды щелкнуть каблуками и сказать: «Нет места лучше IBM?»

Пока что Google Fu мало фигурировал в документации, но если вы знаете документы или образцы, которые указывают путь, это тоже круто.


person John Lockwood    schedule 09.07.2010    source источник
comment
Какая версия IDS? Какая версия ESQL / C (или CSDK)?   -  person Jonathan Leffler    schedule 10.07.2010
comment
Привет, Джонатан, я проверю, когда вернусь в понедельник. Сервер IDS довольно свежий, 11.0 или 11.5? Я считаю. Я уверен, что в модифицированном коде ESQL, который мы используем, используются более старые заголовки и библиотеки, но при необходимости я всегда могу заменить их на более поздние версии (возможно, клиент версии 3.0). Да, код был написан давно, в начале 90-х, и я уверен, что прошло довольно много времени с тех пор, как библиотеки были изменены, если они когда-либо были с самого начала.   -  person John Lockwood    schedule 10.07.2010


Ответы (1)


Это одна из темных областей поведения Informix. Предполагается, что поведение DESCRIBE описывает параметры output (это сокращение для DESCRIBE OUTPUT stmt INTO ...); для описания параметров input вместо этого вы должны использовать DESCRIBE INPUT stmt INTO ....

Однако по разным причинам, восходящим к незапамятным временам (ну, в 1985 году, во всяком случае), оператор INSERT получил исключение для особого случая, и простой DESCRIBE описал его параметры input - в отличие от UPDATE или DELETE (или, в эти дни MERGE).

Итак, ваш код, вероятно, был написан до того, как стали возможными DESCRIBE INPUT и DESCRIBE OUTPUT (это было примерно 2000 ± 3 года). В принципе, использование направленных операторов DESCRIBE должно решить проблему. Для этого может быть установлен параметр ONCONFIG.

Я помню, как был благодарен за то, что эта функция появилась, но также я помню, как подумал: «Черт, я не смогу использовать ее какое-то время - пока все старые версии без нее не будут удалены». Я думаю, что в основном это произошло сейчас - в частности, IDS 7.31 теперь устарела, как и версии IDS 9.x, поэтому все доступные версии IDS поддерживают эту функцию. OnLine 5.20 - миноритарный пакет акций - до сих пор не поддерживает и никогда не поддержит. Итак, мне нужно узнать, как обновить мои программы, такие как SQLCMD, чтобы воспользоваться этим. Код там включает то, что я называю «виньетками»; они представляют собой законченные небольшие программы, которые показывают, как работать с BLOB-объектами BYTE и TEXT. Например, вы можете найти UPDBLOB или APPBLOB, которые могут пригодиться.

person Jonathan Leffler    schedule 10.07.2010
comment
Спасибо за это. Это указывает мне в правильном направлении, которое лучше, чем было сделано до сих пор в документации. Я скомпилировал тот же запрос на обновление с помощью ESQL, и вместо правильного поведения программа ESQL показала ту же ошибку, что и в нашем драйвере! Я посмотрю на образцы, которые вы упомянули в SQLCMD - я обнаружил это через более ранний ответ (возможно, ваш) кому-то еще. Я также попробую скомпилировать оператор DESCRIBE INPUT, упомянутый вами выше, в ESQL, взглянуть на полученный код C и применить проверенный шаблон проектирования рожка для обуви. Еще раз большое спасибо. - person John Lockwood; 10.07.2010