2010-07-09 2 views
1

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

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

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

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

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

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

+0

Какая версия IDS? Какая версия ESQL/C (или CSDK)? –

+0

Hi Jonathan, Я проверю, когда вернусь в понедельник. Сервер IDS довольно недавно, 11,0 или 11,5? Я верю. Я уверен, что модифицированный код ESQL, который мы используем, использует старые заголовки и библиотеки, но при необходимости я всегда могу поменять их позже (возможно, 3.0 клиента). Да, код был написан давно - в начале 90-х - и я готов поспорить, что это было довольно долго, поскольку библиотеки были изменены, если они когда-либо были с самого начала. –

ответ

1

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

Однако, по разным причинам, простирающихся назад к рассвету времени (ну, 1985, во всяком случае), оператор INSERT получил специальное освобождение от случая и равнины ОПИСЫВАЮЩЕГО описал его входа параметров - в отличие от UPDATE или DELETE (или эти дней, MERGE).

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

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

+0

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

Смежные вопросы