Функция SQLNativeSql

Соответствие
Введенная версия: Соответствие стандартам ODBC 1.0: ODBC

Сводка
SQLNativeSQL возвращает SQL-строку, изменённую драйвером. SQLNativeSQL не выполняет SQL-оператор.

Syntax

  
SQLRETURN SQLNativeSql(  
     SQLHDBC        ConnectionHandle,  
     SQLCHAR *      InStatementText,  
     SQLINTEGER     TextLength1,  
     SQLCHAR *      OutStatementText,  
     SQLINTEGER     BufferLength,  
     SQLINTEGER *   TextLength2Ptr);  

Arguments

ConnectionHandle
[Input] Дескриптор подключения

InStatementText
[Ввод] SQL-текстовая строка для перевода.

Длина текста1
[Ввод] Длина в символах строки текста *InStatementText .

OutStatementText
[Выход] Указатель на буфер для возврата переведённой SQL-строки.

Если OutStatementText — NULL, TextLength2Ptr всё равно вернёт общее количество символов (за исключением символа null-termination для данных символов), доступных для возврата в буфере, на который указывает OutStatementText.

BufferLength
[Ввод] Количество символов в буфере *OutStatementText . В прошлых версиях этой документации ошибочно предполагалось, что такое количество символов должно быть даже если значение, возвращаемое в *InStatementText , является строкой Unicode (при вызове SQLNativeSqlW). Такого ограничения нет. Для оптимальной совместимости драйверы должны ожидать, что в эту функцию будет передаваться любое количество символов, тогда как для приложений рекомендуется всегда использовать чётное число.

ТекстДлина2Ptr
[Выход] Указатель на буфер, в котором можно вернуть общее количество символов (без учёта нулевой терминации), доступных для возврата в *OutStatementText. Если количество доступных для возврата символов больше или равно BufferLength, переводная SQL-строка в *OutStatementText усекается до BufferLength минус длина символа null-termination.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR или SQL_INVALID_HANDLE.

Diagnostics

Когда SQLNativeSQL возвращает либо SQL_ERROR, либо SQL_SUCCESS_WITH_INFO, соответствующее значение SQLSTATE можно получить, вызвав SQLGetDiagRec с помощью HandleType SQL_HANDLE_DBC и HandleType of ConnectionHandle. В следующей таблице перечислены значения SQLSTATE, которые обычно возвращает SQLNativeSql , и каждое из них объясняется в контексте этой функции; обозначение «(DM)» предшествует описаниям SQLSTATE, возвращаемым менеджером драйверов. Возвращаемый код, связанный с каждым значением SQLSTATE, SQL_ERROR, если не указано иное.

SQLSTATE Error Description
01000 Общее предупреждение Информационное сообщение для конкретного драйвера. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01004 Строковые данные, усеченные справа Буфер *OutStatementText был недостаточно велик, чтобы вернуть всю SQL-строку, поэтому строка SQL была усечена. Длина неусечённой SQL-строки возвращается в *TextLength2Ptr. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
08003 Подключение не открыто ConnectionHandle не находился в связанном состоянии.
08S01 Сбой связи Связь между драйвером и источником данных, к которому был подключен драйвер, произошел сбой до завершения обработки функции.
22007 Недопустимый формат datetime * InStatementText содержал escape-клаузу с недействительными значениями даты, времени или временной метки.
24000 Недопустимое состояние курсора Курсор, указанный в операторе, располагался до начала результатного набора или после его окончания. Эта ошибка может не быть возвращена драйвером с нативной реализацией курсора СУБД.
HY000 Общая ошибка Произошла ошибка, для которой не было определенного SQLSTATE и для которого не было определено значение SQLSTATE для конкретной реализации. Сообщение об ошибке, возвращаемое SQLGetDiagRec в буфере *MessageText , описывает ошибку и ее причину.
HY001 Ошибка выделения памяти Драйверу не удалось выделить память, необходимую для поддержки выполнения или завершения функции.
HY009 Недопустимое использование указателя NULL (DM) *InStatementText был null pointer.
HY010 Ошибка последовательности функций (DM) Для ConnectionHandle была вызвана асинхронно выполняющаяся функция, которая всё ещё выполнялась, когда эта функция была вызвана.
HY013 Ошибка управления памятью Не удалось обработать вызов функции, так как к базовым объектам памяти не удалось получить доступ, возможно, из-за низкой памяти.
HY090 Недопустимая длина строки или буфера (DM) Аргумент TextLength1 был меньше 0, но не равен SQL_NTS.
(DM) Аргумент BufferLength был меньше 0, а аргумент OutStatementText не был нулевой указателем.
HY109 Недопустимое положение курсора Текущая строка курсора была удалена или не была заброшена. Эта ошибка может не быть возвращена драйвером с нативной реализацией курсора СУБД.
HY117 Подключение приостановлено из-за неизвестного состояния транзакции. Разрешены только функции отключения и только для чтения. (DM) Дополнительные сведения о приостановленном состоянии см. в статье SQLEndTran Function.
HYT01 Время ожидания для подключения истекло Срок ожидания подключения истек до того, как источник данных ответил на запрос. Период времени ожидания подключения задается через SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Драйвер не поддерживает эту функцию (DM) Драйвер, связанный с ConnectionHandle , не поддерживает эту функцию.

Comments

Ниже приведены примеры того, что SQLNativeSQL может вернуть для следующей входной SQL-строки, содержащей скалярную функцию CONVERT. Предположим, что столбец empid относится к типу INTEGER в источнике данных:

SELECT { fn CONVERT (empid, SQL_SMALLINT) } FROM employee  

Драйвер для Microsoft SQL Server может вернуть следующую переводную строку SQL:

SELECT convert (smallint, empid) FROM employee  

Драйвер для ORACLE Server может вернуть следующую переведённую SQL-строку:

SELECT to_number (empid) FROM employee  

Драйвер для Ingres может вернуть следующую переведённую SQL-строку:

SELECT int2 (empid) FROM employee  

Для получения дополнительной информации см. разделы «Прямое исполнение » и «Подготовленное исполнение».

None.