Spec-Zone.ru › MySQL Connectors 1.0

6.2 Структуры данных подготовленных запросов C API

  • 6.2.1 Коды типов подготовленных запросов C API
  • 6.2.2 Преобразования типов подготовленных запросов C API

Подготовленные запросы используют несколько структур данных:

  • Для получения обработчика запроса передайте обработчик подключения MYSQL в функцию mysql_stmt_init(), которая возвращает указатель на структуру данных MYSQL_STMT. Эта структура используется для дальнейших операций с запросом. Для указания запроса для подготовки передайте указатель MYSQL_STMT и строку запроса в функцию mysql_stmt_prepare().

  • Для предоставления входных параметров подготовленному запросу настройте структуры MYSQL_BIND и передайте их в функцию mysql_stmt_bind_param(). Для получения значений выходных столбцов настройте структуры MYSQL_BIND и передайте их в функцию mysql_stmt_bind_result().

  • Структура MYSQL_TIME используется для передачи временных данных в обоих направлениях.

Ниже подробно описаны типы данных подготовленных запросов. Примеры их использования см. в разделе 6.4.10, «mysql_stmt_execute()» и разделе 6.4.11, «mysql_stmt_fetch()».

  • MYSQL_STMT

    Эта структура является обработчиком подготовленного запроса. Обработчик создается путем вызова функции mysql_stmt_init(), которая возвращает указатель на структуру MYSQL_STMT. Обработчик используется для всех последующих операций с запросом до момента его закрытия с помощью функции mysql_stmt_close(), после чего обработчик становится недействительным и больше не должен использоваться.

    Структура MYSQL_STMT не содержит членов, предназначенных для использования приложением. Приложения не должны пытаться копировать структуру MYSQL_STMT. Нет гарантии, что такая копия будет работоспособной.

    Несколько обработчиков запросов могут быть связаны с одним подключением. Ограничение на количество обработчиков зависит от доступных системных ресурсов.

  • MYSQL_BIND

    Эта структура используется как для ввода запроса (значения данных, отправляемые на сервер), так и для вывода (значения результатов, возвращаемые сервером):

    • Для ввода используйте структуры MYSQL_BIND с mysql_stmt_bind_param() для привязки значений параметров к буферам, используемым mysql_stmt_execute().

    • Для вывода используйте структуры MYSQL_BIND с mysql_stmt_bind_result() для привязки буферов к столбцам набора результатов, для использования при извлечении строк с помощью mysql_stmt_fetch().

    Для использования структуры MYSQL_BIND обнулите её содержимое для инициализации, а затем установите её члены соответствующим образом. Например, для объявления и инициализации массива из трёх структур MYSQL_BIND используйте этот код:

    MYSQL_BIND bind[3];
    memset(bind, 0, sizeof(bind));
    

    Структура MYSQL_BIND содержит следующие члены для использования приложениями. Для многих членов способ использования зависит от того, используется ли структура для ввода или вывода.

    • enum enum_field_types buffer_type

      Тип буфера. Этот член указывает тип данных переменной языка C, привязанной к параметру запроса или столбцу набора результатов. Для ввода buffer_type указывает тип переменной, содержащей значение, которое будет отправлено на сервер. Для вывода он указывает тип переменной, в которую должно быть сохранено значение, полученное от сервера. Для допустимых значений buffer_type см. Раздел 6.2.1, «Типы данных C API подготовленных запросов».

    • void *buffer

      Указатель на буфер, используемый для передачи данных. Это адрес переменной языка C.

      Для ввода buffer является указателем на переменную, в которой хранится значение данных для параметра запроса. При вызове mysql_stmt_execute(), MySQL использует значение, хранящееся в переменной, вместо соответствующего маркера параметра в запросе (указанный с помощью ? в строке запроса).

      Для вывода buffer является указателем на переменную, в которую возвращается значение столбца набора результатов. При вызове mysql_stmt_fetch(), MySQL сохраняет значение столбца из текущей строки набора результатов в этой переменной. Вы можете получить доступ к значению при возвращении вызова.

      Для минимизации необходимости MySQL выполнять преобразование типов между значениями переменных языка C на стороне клиента и значениями SQL на стороне сервера, используйте переменные языка C, которые имеют типы, аналогичные типам соответствующих значений SQL:

      • Для числовых типов данных buffer должен указывать на переменную соответствующего числового типа языка C. Для целочисленных переменных (которые могут быть char для однобайтовых значений или целочисленного типа для больших значений), вы также должны указать, имеет ли переменная атрибут unsigned, установив член is_unsigned, описанный ниже.

      • Для символьных (небинарных) и бинарных строковых типов данных buffer должен указывать на символьный буфер.

      • Для типов данных даты и времени buffer должен указывать на структуру MYSQL_TIME.

      Для рекомендаций по сопоставлению типов языка C и типов SQL и примечаний по преобразованиям типов см. Раздел 6.2.1, «Типы данных C API подготовленных запросов» и Раздел 6.2.2, «Преобразование типов C API подготовленных запросов».

    • unsigned long buffer_length

      Фактический размер *buffer в байтах. Это указывает на максимальное количество данных, которое может храниться в буфере. Для символьных и бинарных данных языка C значение buffer_length определяет длину *buffer при использовании с mysql_stmt_bind_param() для указания входных значений или максимальное количество байтов выходных данных, которые могут быть извлечены в буфер при использовании с mysql_stmt_bind_result().

    • unsigned long *length

      Указатель на переменную unsigned long, которая указывает фактическое количество байтов данных, хранящихся в *buffer. length используется для символьных или бинарных данных языка C.

      Для привязки входных данных параметров установите *length, чтобы указать фактическую длину значения параметра, хранящегося в *buffer. Это используется mysql_stmt_execute().

      Для привязки выходных значений MySQL устанавливает *length при вызове mysql_stmt_fetch(). Значение возврата mysql_stmt_fetch() определяет, как интерпретировать длину:

      • Если возвращаемое значение равно 0, *length указывает фактическую длину значения параметра.

      • Если возвращаемое значение равно MYSQL_DATA_TRUNCATED, *length указывает несокращенную длину значения параметра. В этом случае минимум из *length и buffer_length указывает фактическую длину значения.

      length игнорируется для числовых и временных типов данных, потому что значение buffer_type определяет длину значения данных.

      Если вам нужно определить длину возвращаемого значения перед его извлечением, см. Раздел 6.4.11, «mysql_stmt_fetch()», для некоторых стратегий.

    • my_bool *is_null

      Этот член указывает на переменную my_bool, которая имеет значение true, если значение NULL, и false, если оно не NULL. Для ввода установите *is_null в значение true, чтобы указать, что вы передаёте значение NULL как параметр запроса.

      is_null является указателем на булеву переменную, а не булевым значением, чтобы обеспечить гибкость в способе указания NULL значений:

      • Если ваши значения данных всегда NULL, используйте MYSQL_TYPE_NULL как значение buffer_type при привязке столбца. Другие члены MYSQL_BIND, включая is_null, не имеют значения.

      • Если ваши значения данных всегда NOT NULL, установите is_null = (my_bool*) 0 и установите другие члены соответствующим образом для переменной, которую вы привязываете.

      • Во всех остальных случаях установите другие члены соответствующим образом и установите is_null в адрес переменной my_bool. Установите значение этой переменной в true или false соответствующим образом между выполнениями, чтобы указать, является ли соответствующее значение данных NULL или NOT NULL соответственно.

      Для вывода, когда вы извлекаете строку, MySQL устанавливает значение, на которое указывает is_null, в true или false в зависимости от того, является ли возвращаемое из запроса значение столбца набора результатов NULL или нет.

    • my_bool is_unsigned

      Этот член применяется для переменных языка C с типами данных, которые могут быть unsigned (char, short int, int, long long int). Установите is_unsigned в значение true, если переменная, на которую указывает buffer, является unsigned, и в false в противном случае. Например, если вы привязываете переменную signed char к buffer, укажите код типа MYSQL_TYPE_TINY и установите is_unsigned в false. Если вы привязываете вместо этого unsigned char, код типа остается тем же, но is_unsigned должно быть true. (Для char не определено, является ли он знаковым или беззнаковым, поэтому лучше явно указать знаковое представление, используя signed char или unsigned char.)

      is_unsigned применяется только к переменной языка C на стороне клиента. Это ничего не говорит о знаковом представлении соответствующего значения SQL на стороне сервера. Например, если вы используете переменную int для указания значения для столбца BIGINT UNSIGNED, is_unsigned должно быть false, потому что int является знаковым типом. Если вы используете переменную unsigned int для указания значения для столбца, is_unsigned должно быть true, потому что unsigned int является беззнаковым типом. MySQL выполняет правильное преобразование между знаковыми и беззнаковыми значениями в обоих направлениях, хотя предупреждение возникает, если происходит усечение.

    • my_bool *error

      Для вывода установите этот член для указания на переменную my_bool, чтобы получить информацию об усечении для параметра, сохраненного там после операции извлечения строки. При включённом отслеживании усечения mysql_stmt_fetch() возвращает MYSQL_DATA_TRUNCATED и *error имеет значение true в структурах MYSQL_BIND для параметров, в которых произошло усечение. Усечение указывает на потерю знака или значащих цифр, или что строка была слишком длинной для помещения в столбец. Отслеживание усечения включено по умолчанию, но может быть настроено путём вызова mysql_options() с параметром MYSQL_REPORT_DATA_TRUNCATION.

  • MYSQL_TIME

    Эта структура используется для отправки и получения данных , , , напрямую на сервер и с сервера. Установите член buffer, чтобы он указывал на структуру MYSQL_TIME, и установите член buffer_type структуры MYSQL_BIND на один из временных типов (MYSQL_TYPE_TIME, MYSQL_TYPE_DATE, MYSQL_TYPE_DATETIME, MYSQL_TYPE_TIMESTAMP).

    Структура MYSQL_TIME содержит члены, перечисленные в следующей таблице.

    Член Описание
    unsigned int year Год
    unsigned int month Месяц года
    unsigned int day День месяца
    unsigned int hour Час дня
    unsigned int minute Минута часа
    unsigned int second Секунда минуты
    my_bool neg Флаг булевого типа, указывающий, является ли время отрицательным
    unsigned long second_part Дробная часть секунды в микросекундах

    Используются только те части структуры MYSQL_TIME, которые применимы к заданному типу временной метки. Элементы year, month и day используются для , , и значений. Элементы hour, minute и second используются для , , и значений. См. Раздел 3.6.3, «Обработка Prepared Statement дат и временных значений».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/c-api-5.7-en/c-api-prepared-statement-data-structures.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API