6.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.