Spec-Zone.ru › MySQL Connectors 1.0

5.1 Обзор базового интерфейса C API

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

  1. Инициализируйте клиентскую библиотеку MySQL, вызвав mysql_library_init(). Эта функция присутствует как в клиентской библиотеке C API MySQL, так и в библиотеке встраиваемого сервера, поэтому она используется независимо от того, компилируется ли обычная клиентская программа с флагом libmysqlclient или приложение встраиваемого сервера с флагом libmysqld.

  2. Инициализируйте обработчик подключения, вызвав mysql_init(), и подключитесь к серверу, вызвав mysql_real_connect().

  3. Выполняйте SQL-запросы и обрабатывайте результаты. (Более подробная информация о выполнении этого действия приведена ниже).

  4. Закройте подключение к серверу MySQL, вызвав mysql_close().

  5. Завершите использование клиентской библиотеки MySQL, вызвав mysql_library_end().

Целью вызова mysql_library_init() и mysql_library_end() является правильная инициализация и завершение работы клиентской библиотеки MySQL. Для приложений, связанных с клиентской библиотекой, это обеспечивает улучшенное управление памятью. Если не вызвать mysql_library_end(), блок памяти останется выделенным. (Это не увеличивает потребление памяти приложением, но некоторые детекторы утечек памяти могут выдавать предупреждения). Для приложений, связанных со встроенным сервером, эти вызовы запускают и останавливают сервер.

В среде без многопоточности вызов mysql_library_init() можно опустить, так как mysql_init() вызовет его автоматически при необходимости. Однако, mysql_library_init() не является потокобезопасной в многопоточной среде, и, следовательно, не является потокобезопасной и mysql_init(), которая вызывает mysql_library_init(). Вы должны либо вызвать mysql_library_init() перед созданием потоков, либо использовать мьютекс для защиты вызова, независимо от того, вызываете ли вы mysql_library_init() или косвенно через mysql_init(). Это должно быть сделано до любого другого вызова клиентской библиотеки.

Для подключения к серверу вызовите mysql_init() для инициализации обработчика подключения, а затем вызовите mysql_real_connect() с этим обработчиком (вместе с другими данными, такими как имя хоста, имя пользователя и пароль). Когда вы закончите с подключением, вызовите mysql_close() для его завершения. Не используйте обработчик после его закрытия.

При подключении mysql_real_connect() устанавливает флаг reconnect (часть структуры MYSQL) в значение 0. Вы можете использовать опцию MYSQL_OPT_RECONNECT к mysql_options() для управления поведением повторного подключения. Установка флага в 1 заставляет клиента пытаться повторно подключиться к серверу, прежде чем отказаться, если операция не может быть выполнена из-за потери подключения.

Пока активен процесс подключения, клиент может отправлять SQL-запросы на сервер с помощью mysql_real_query() или mysql_query(). Разница между ними в том, что mysql_query() ожидает, что запрос будет задан как строка с нулевым окончанием, в то время как mysql_real_query() ожидает строку с указанием длины. Если строка содержит двоичные данные (которые могут включать нулевые байты), вы должны использовать mysql_real_query().

Для каждого запроса, отличного от запроса (например, , , ), вы можете узнать, сколько строк было изменено (затронуто), вызвав mysql_affected_rows().

Для запросов вы получаете выбранные строки как набор результатов. (Обратите внимание, что некоторые операторы похожи на запросы, возвращая строки. К ним относятся , , и . Обрабатывайте эти операторы так же, как и операторы запросов.)

Существует два способа, которыми клиент может обработать наборы результатов. Один способ — извлечь весь набор результатов сразу, вызвав mysql_store_result(). Эта функция получает от сервера все строки, возвращенные запросом, и хранит их на клиенте. Второй способ — инициировать извлечение набора результатов строка за строкой, вызвав mysql_use_result(). Эта функция инициирует извлечение, но не извлекает строки с сервера.

В обоих случаях вы получаете доступ к строкам, вызвав mysql_fetch_row(). С помощью mysql_store_result(), mysql_fetch_row() обращается к строкам, которые были ранее извлечены с сервера. С помощью mysql_use_result(), mysql_fetch_row() фактически извлекает строку с сервера. Информация о размере данных в каждой строке доступна при вызове mysql_fetch_lengths().

После завершения работы с набором результатов вызовите mysql_free_result() для освобождения памяти, используемой для него.

Два механизма извлечения дополняют друг друга. Выберите подход, наиболее подходящий для каждого приложения. На практике клиенты чаще используют mysql_store_result().

Преимущество mysql_store_result() заключается в том, что, поскольку все строки уже извлечены на клиенте, вы можете не только получать доступ к строкам последовательно, но и перемещаться вперед и назад в наборе результатов с помощью mysql_data_seek() или mysql_row_seek() для изменения текущей позиции строки в наборе результатов. Вы также можете узнать количество строк, вызвав mysql_num_rows(). С другой стороны, требования к памяти для mysql_store_result() могут быть очень высокими для больших наборов результатов, и у вас есть большая вероятность столкнуться с ошибками недостатка памяти.

Преимущество mysql_use_result() заключается в том, что клиенту требуется меньше памяти для набора результатов, так как он поддерживает только одну строку за раз (и из-за меньшей нагрузки на выделение памяти, mysql_use_result() может работать быстрее). Недостатки: вам нужно быстро обработать каждую строку, чтобы избежать блокирования сервера, у вас нет произвольного доступа к строкам в наборе результатов (вы можете получить доступ только последовательно), и количество строк в наборе результатов неизвестно, пока вы не извлечете их все. Кроме того, вам обязательно нужно получить все строки, даже если вы обнаружите в процессе извлечения искомую информацию.

API позволяет клиентам должным образом реагировать на запросы (получая строки только по мере необходимости), не зная, является ли запрос . Вы можете сделать это, вызвав mysql_store_result() после каждого mysql_real_query() (или mysql_query()). Если вызов набора результатов успешен, запрос был и вы можете прочитать строки. Если вызов набора результатов терпит неудачу, вызовите mysql_field_count(), чтобы определить, ожидался ли на самом деле результат. Если mysql_field_count() возвращает ноль, запрос не вернул данных (указывая, что это был , , , и так далее), и не ожидалось возвращения строк. Если mysql_field_count() ненулевое, запрос должен был вернуть строки, но не сделал этого. Это указывает на то, что запрос был и потерпел неудачу. Обратитесь к описанию mysql_field_count() для примера, как это можно сделать.

Обе функции mysql_store_result() и mysql_use_result() позволяют получить информацию о полях набора результатов (количество полей, их имена и типы и так далее). Вы можете получить доступ к информации о полях последовательно в строке, вызывая функцию mysql_fetch_field() повторно или по номеру поля в строке, вызывая mysql_fetch_field_direct(). Текущее положение курсора поля может быть изменено с помощью вызова функции mysql_field_seek(). Установка курсора поля влияет на последующие вызовы функции mysql_fetch_field(). Вы также можете получить информацию о всех полях сразу, вызвав mysql_fetch_fields().

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

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/c-api-5.7-en/c-api-basic-interface-usage.html

Spec-Zone.ru

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