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_stmt_bind_named_param(). Для получения значений выходных столбцов настройте структуры MYSQL_BIND и передайте их в функцию mysql_stmt_bind_result().

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

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

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

  • MYSQL_STMT

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

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

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

END_OF_DOCUMENT_MARKER
  • 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_named_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.12, «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 в структурах 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.4-en/c-api-prepared-statement-data-structures.html

Spec-Zone.ru

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