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_BIND также используются с функцией mysql_bind_param(), что позволяет определять атрибуты, которые применяются к следующему запросу, отправленному на сервер.

  • Структура 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_bind_param() для определения атрибутов запроса. (В дальнейшем упоминание параметров запроса для подготовленных запросов также относится к атрибутам запроса.)

    • Для вывода используйте структуры 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()» для некоторых стратегий.

    • bool *is_null

      Этот член указывает на переменную 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 = (bool*) 0 и установите другие члены соответствующим образом для связываемой переменной.

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

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

    • 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 выполняет правильное преобразование между знаковыми и беззнаковыми значениями в обоих направлениях, хотя если происходит усечение, выдаётся предупреждение.

    • bool *error

      Для вывода установите этот член, чтобы указать на переменную 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 Секунда минуты
    bool neg Флаг булевого типа, указывающий, является ли время отрицательным
    unsigned long second_part Дробная часть секунды в микросекундах

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

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

Spec-Zone.ru

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