Обновление ТЕКСТА и вставка ТЕКСТА на Informix Dynamic Server - PullRequest
1 голос
/ 10 июля 2010

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

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

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

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

  2. Я упускаю здесь что-то фундаментальное о том, как сделать UPDATE для полей TEXT, например, вам нужно создать объект локатора, найти строку и три раза щелкнуть пятками и сказать: «Нет места, как IBM ?»

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

1 Ответ

1 голос
/ 10 июля 2010

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

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

Итак, ваш код, вероятно, был написан до того, как стали возможными ОПИСАНИЕ ВХОДА и ОПИСАНИЕ ВЫХОДА (это было около 2000 ± 3 года). В принципе, использование направленных операторов DESCRIBE должно решить проблему. Для получения такого поведения может быть задан параметр ONCONFIG.

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

...