Поделиться через


Символьные данные и строки C

Входные параметры, ссылающиеся на символьные данные переменной длины (например, имена столбцов, динамические параметры и строковые значения атрибутов) имеют связанный параметр длины. Если приложение завершает строки с символом NULL, как обычно в C, оно предоставляет в качестве аргумента длину в байтах строки (не включая пустой терминатор) или SQL_NTS (строка, завершающая значение NULL). Аргумент не отрицательной длины указывает фактическую длину связанной строки. Аргумент длины может иметь значение 0, чтобы указать строку нулевой длины, которая отличается от значения NULL. Отрицательное значение SQL_NTS направляет драйверу, чтобы определить длину строки путем поиска символа завершения null.

Когда символьные данные возвращаются из драйвера в приложение, драйвер должен всегда завершать его значение NULL. Это дает приложению выбор того, следует ли обрабатывать данные как строку или массив символов. Если буфер приложения недостаточно велик, чтобы вернуть все символьные данные, драйвер усечет его до байтовой длины буфера меньше количества байтов, необходимых символу завершения NULL, завершает усеченные данные и сохраняет его в буфере. Поэтому приложения всегда должны выделять дополнительное пространство для символа завершения null в буферах, используемых для получения символьных данных. Например, для получения 50 символов данных требуется буфер 51-байтов.

При отправке или извлечении длинных символьных данных в частях с SQLPutData или SQLGetData необходимо учитывать особое внимание как в приложении, так и в драйвере. Если данные передаются в виде ряда строк, завершаемых значением NULL, то символы завершения null в этих строках должны быть удалены перед повторной сборкой данных.

Ряд программистов ODBC запутали символьные данные и строки C. Это произошло, является артефактом использования языка C при определении функций ODBC. Если драйвер ИЛИ приложение ODBC использует другой язык, помните, что ODBC не зависит от языка. Эта путаница менее вероятно.

Если строки C используются для хранения символьных данных, символ завершения null не считается частью данных и не считается частью его длины байтов. Например, символьные данные "ABC" можно хранить в виде строки C "ABC\0" или массива символов {'A", "B", "C}". Длина байтов данных составляет 3, независимо от того, рассматривается ли она как строка или массив символов.

Хотя приложения и драйверы обычно используют строки C (массивы символов, завершаемые null), для хранения данных символов не требуется. В C символьные данные также можно рассматривать как массив символов (без завершения null) и его длину байтов, передаваемую отдельно в буфере длины или индикатора.

Так как символьные данные могут храниться в массиве, отличном от NULL, и его длине байтов, передаваемых отдельно, можно внедрить пустые символы в символьные данные. Однако поведение функций ODBC в этом случае не определено, и он зависит от драйвера, обрабатывает ли драйвер это правильно. Таким образом, приложения взаимодействия всегда должны обрабатывать символьные данные, которые могут содержать внедренные пустые символы в виде двоичных данных.