понедельник, 3 октября 2011 г.

Mysql и C++

Доступ обеспечиваеся с помощью переменной типа MYSQL*;
Для начала нужно ее инициализировать :
MYSQL* conn = mysql_init(NULL);
mysql_init выделяет или инициализирует объект MYSQL, подходящий для функции mysql_real_connect(). Если аргумент mysql представляет собой указатель NULL, то эта функция выделяет, инициализирует и возвращает новый объект. В противном случае инициализируется указанный объект и возвращается его адрес. Если функция mysql_init() выделяет новый объект, то он будет освобожден при вызове функции mysql_close(), чтобы закрыть данное соединение.


Далее необходимо открыть соединение(mysql_connect лучше не использовать):
mysql_real_connect(conn, "host", "user", "pass", "database", 0, NULL, 0);
Для успешного соединения возвращаемая величина та же, что и величина первого параметра.
Функция mysql_real_connect() пытается установить соединение с сервером баз данных MySQL, работающим на хосте host. До успешного завершения функции mysql_real_connect() нельзя выполнять никакие другие функции интерфейса, за исключением mysql_get_client_info().


Теперь можно обращаться к базе данных с помощью mysql_query:
mysql_query(conn, "SELECT * FROM foo");

Выполняет запрос SQL, указанный в аргументе query в виде строки с нулевыми окончаниями. Данный запрос должен состоять из одной команды SQL. Нельзя добавлять к этой команде в качестве завершающих элементов точку с запятой (`;') или \g.
Функция mysql_query() не может использоваться для запросов, содержащих двоичные данные; вместо этого необходимо использовать функциюmysql_real_query() (двоичные данные могут содержать символ `\0', который mysql_query() интерпретирует как окончание строки запроса).
Для проверки, вернул данный запрос результирующий набор или нет, можно использовать функцию mysql_field_count().


Для получения результата запроса(когда запрос вида SELECTSHOW,DESCRIBEEXPLAIN) используется MYSQL_RES *result = mysql_store_result(conn) или MYSQL_RES *result = mysql_use_result(conn).
Функция mysql_store_result() читает весь результат запроса данного клиента, выделяет структуру MYSQL_RES и помещает результат в эту структуру.

Функция mysql_use_result() инициализирует извлечение результирующего набора, но фактически не производит чтение в клиенте подобно тому, как это делает функция mysql_store_result(). Вместо этого каждая строка должна извлекаться индивидуально посредством вызова функции mysql_fetch_row(). При этом методе результат запроса читается непосредственно на сервере без промежуточного хранения его во временной таблице или локальном буфере, что быстрее и требует намного меньше памяти, чем использование функции mysql_store_result(). Клиент будет выделять память только для текущей строки и буфер связи может расти до величины max_allowed_packet байтов.
С другой стороны, функцию mysql_use_result() нельзя использовать, если выполняется много операций по обработке каждой строки на клиентской стороне, или если вывод делается на терминал, на котором пользователь может нажать ^S (остановить вывод).
Это будет ограничивать работу сервера и будет мешать другим потокам в обновлении таблиц, из которых выбираются данные.
При использовании mysql_use_result() необходимо выполнять mysql_fetch_row(), пока не возвратится величина NULL, в противном случае невыбранные строки данного запроса будут возвращены как часть результирующего набора для следующего запроса. Если вы забыли сделать это, то интерфейс C будет выдавать ошибку Commands out of sync; you can't run this command now!
Нельзя использовать функции mysql_data_seek()mysql_row_seek()mysql_row_tell()mysql_num_rows() или mysql_affected_rows() для обработки результата, возвращенного функцией mysql_use_result(), а также нельзя запускать другие запросы, пока функция mysql_use_result() не завершится (однако после выборки всех строк функция mysql_num_rows() будет корректно возвращать количество выбранных строк).



Потом - освободить ресурс:
mysql_free_result(result);
Освобождает память, выделенную для результирующего набора данных функциями mysql_store_result()mysql_use_result()mysql_list_dbs() и т.д. После выполнения операций с результирующим набором необходимо освободить используемую под него память вызовом функции mysql_free_result().


В конце надо закрыть соединение:
mysql_close(conn);
Закрывает ранее открытое соединение. Функция mysql_close() также освобождает дескриптор данного соединения, указанный в mysql, если данный дескриптор был выделен автоматически функциями mysql_init() или mysql_connect().


Взята куча данных с http://mysql.ru/docs/man/C_API_functions.html

Комментариев нет:

Отправить комментарий