2010-04-30 3 views
1

Всегда интересная проблема NULL Vs Blank сводит меня с ума теперь.Бланки, вызывающие проблемы при наборе строк (Informix)

У меня есть две структуры ESQL/C, которые представляют две таблицы. Я получаю строку от одной таблицы в курсоре. Используя значения двух полей из этой выборки, я получаю строку из другой таблицы. Я знаю перед собой, что вторая выборка обязательно вернет одну строку.

Теперь вторая таблица может иметь пустые значения. Пустым я имею в виду такие значения, как ''. Когда я выгружаю , эти символы отображаются как «\». Я думаю, что в рамках программы C они не получаются.

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

если (значение [0] == '\ 0') или если (значение [0] == ' «)

не работает , gdb показывает что-то вроде value = "\ 000", ''. Но я не могу проверить это из кода C.

Я вручную загрузил таблицу через файл с разделителями каналов. Для ввода заготовки я набрал | \ |.

Может кто-нибудь, пожалуйста, сообщите мне, где я ошибаюсь.

ответ

2

Вы должны использовать соединение для сбора данных из двух таблиц за одну операцию. СУБД очень хороши при подключении; когда вы вступаете вручную в приложение, вы замедляете работу, как правило, резко.

Типы данных являются критическими - и не заданы в вопросе.

Типы SQL

  • УАКСНАК (п) - конечные пробелы существенны; строка нулевой длины не равна NULL.
  • CHAR (n) - конечные пробелы добавляются СУБД и могут быть удалены приложениями.

ESQL/C Типы:

  • char - для данных CHAR; пробел заполнен до полной длины с помощью терминатора NUL '\ 0'.
  • fixchar - для данных CHAR; пробел заполнен до полной длины без терминатора NUL '\ 0'.
  • varchar - для данных VARCHAR; не пустым.
  • Указатели на эти типы также могут быть использованы, что еще раз усложняет вопросы (компилятор не знает, насколько велика пробел, на который указывает указатель).

Вы также упомянули использование '\' для загрузки данных. Это специальная нотация, используемая с нулевыми нулевыми полями VARCHAR, чтобы указать это значение; пустое поле указывает значение NULL в формате выгрузки. (На диске пустой ненулевой VARCHAR занимает один байт, значение 0x00 для нулевой длины, NULL VARCHAR занимает два байта, значения 0x01 0x00 для длины 1 и значение NULL (или NUL).)

Судя по тому, что вы говорите, у вас есть, возможно, пустые (но не NULL) значения VARCHAR (n) во второй таблице. Они должны отображаться как строковые значения, где первый байт равен NUL '\ 0' в вашем C-коде - независимо от того, какой из типов переменных вы используете. Результат от GDB согласуется с этим; первый байт равен '\ 0' (или '\ 000'); остальное не имеет значения.

Возможно, вы захотите найти переменные индикатора; они сообщают вам, является ли конкретное значение, выбранное из БД, NULL или нет.

Если у вас все еще есть проблемы, отправьте код (желательно очень небольшая компилируемая программа, которая показывает проблему - скажем, до 50 строк или около того, или небольшой фрагмент кода - скажем, 20 строк или около того).

+0

Благодарим вас за подробное объяснение, Джонатан. – prabhu

0

В Informix-SE, когда я выгружаю таблицу со столбцами, имеющими значения NULL, выгружаемые столбцы отображаются с двумя символами трубы «||» что означает отсутствие значения для данного столбца.

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

  • Нет связанных вопросов^_^