您的位置:首页 > 数据库 > MySQL

MYSQL 语言C API的常用函数

2016-08-12 22:12 288 查看

1.MYSQL C API的常用函数

1.1数据类型

MYSQL

该结构代表1个数据库连接的句柄。几乎所有的MYSQL函数均使用它。

MYSQL_RES

该结构代表返回行的查询结果

MYSQL_ROW

这是1行数据的”类型安全”表示。

MYSQL_FIELD

该结构包含关于字段的信息,如字段名、类型和大小等

MYSQL_FIELD_OFFSET

这时MYSQL字段列表偏移量的”类型安全”表示

my_ulonglong

用于行数以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的类型

1.2编程步骤

1 通过调用mysql_library_init(),初始化MYSQL库

2 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器

3 发出SQL语句并处理其结果

4 通过调用mysql_close(),关闭与MYSQL服务器的连接

5 通过调用mysql_library_end(),结束MYSQL库的使用

1.3数据库连接

1.3.1初始化一个连接句柄结构

#include <mysql.h>

MYSQL mysql_init(MYSQL );

1.3.2和数据库建立物理连接

MYSQL *mysql_real_connect(MYSQL *connection,

const char *server_host,const char *sql_user_name,

const char *sql_password,const char *db_name,

unsigned intport_number,const char

*unix_socket_name,unsignedint flags);

1.3.3连接参数

Intmysql_options(MYSQL *connection,enum

option_to_set,const char *argument)

1.4错误处理

unsigned intmysql_errno(MYSQL *connection);

对于由mysql指定的连接,该函数返回最近调用的API函数的错误代码,该函数调用可能成功也可能失败。”0”返回值表示未出现错误

char *mysql_error(MYSQL *connection)

如果想获得错误的文本信息,可以调用该函数

1.5执行SQL语句

intmysql_query(MYSQL *mysql,const char *query)

功能描述:

执行由”Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必 须 包含1条SQL语句,而且不应为语句添加终结分号或”\g”

不能用于包含二进制数据的查询,应使用mysql_real_query来完成

对于操纵语句

My_ulonglongmysql_affected_rows(MYSQL *mysql)

返回上次操纵语句所涉及到记录的行数

对于UPDATE、DELETE或INSERT语句,可在mysql_query()后立刻调用。对于SELECT语句,该函数的工作方式与mysql_num_rows()类似

对于查询语言

MYSQL_RES *mysql_store_result(MYSQL *mysql)

功能说明:

对于成功检索了数据的每个查询,必须调用mysql_store_result()或mysql_use_result()

该函数将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中

可以通过mysql_num_rows来找出结果集中的行数

事务处理

my_boolmysql_autocommit(MYSQL *mysql,my_bool mode)

函数说明:如果模式为1,启动autocommit模式;如果模式为0,禁止autocommit模式

my_boolmysql_commit(MYSQL *mysql)

提交当前事务

my_boolmysql_rollback(MYSQL *mysql)

回滚当前事务

处理结果集

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

功能描述

检索结果集的下一行

行内值的数目由mysql_num_fields(result)给出

void mysql_data_seek(MYSQL_RES *result,my_ulonglong offset)

功能描述:

在查询结果集中寻找任意行。偏移值为行号。

该函数要求结果集结构包含查询的所有结果

MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)

返回光标的当前位置

MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result,MYSQL_ROW_OFFSET offset)

将行光标置于查询结果集中的任意行

每次接收一行数据

MYSQL_RES *mysql_use_result(MYSQL *mysql)

功能说明:

不像mysql_store_result()那样把结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。

Mysql_store_result()相比,速度更快而且使用的内存更少

多查询执行的C API处理

支持在单个字符串中指定的多语句的执行。要想与给定的连接一起使用该功能,打开连接时,必须将标志参数中的CLIENT_MULTI_STATEMENTS选项指定给mysql_real_connect()。也可以通过调用mysql_set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON),为已有的连接设置它

1.5详细api列表

MYSQL *mysql_init(MYSQL *mysql)

分配或初始化与mysql_real_connect()相适应的MYSQL对象。

如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。

如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。

void mysql_close(MYSQL *mysql)

关闭前面打开的连接。

如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。

mysql_real_connect函数

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)

函数功能:尝试与运行在主机上的MySQL数据库引擎建立连接

connect = mysql_real_connect(&mysql, “localhost”, “root”, “123456”, “mydb2”, 0, NULL, 0 );

查询api

mysql_query()函数和mysql_real_query()函数

intmysql_query(MYSQL *mysql, const char *query)

intmysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

对于包含二进制数据的查询,必须使用mysql_real_query()而不是mysql_query(),

mysql_real_query()比mysql_query()快,这是因为它不会在查询字符串上调用strlen()。

获取结果集api

mysql_store_result()函数和mysql_use_result

MYSQL_RES *mysql_store_result(MYSQL *mysql)

mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中;

可调用mysql_num_rows()来找出结果集中的行数。可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。

一旦完成了对结果集的操作,必须调用mysql_free_result()。

MYSQL_RES *mysql_use_result(MYSQL *mysql)每次接收一行数据

功能说明:

不像mysql_store_result()那样把结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。

Mysql_store_result()相比,速度更快而且使用的内存更少

2.1调用思路分析

2.1 简介

访问MySQL服务器,这需要使用mysqlclient库,MySQL的大多数客户端API(除了

Java和.NET)都是通过这个库来和MySQL服务器通讯的,而这个库正是用C编写的。

2.2代码编写和编译

2.3连接MySQL服务器

初始化一个MYSQL结构,该结构在几乎所有的MySQL C API函数(除了预处理语句相关的函数)中都会用到。MYSQL *mysql_init(MYSQL *mysql)

连接MySQL服务器使用MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd,const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag);

也可另一种方式来进行连接。先用MYSQL_READ_DEFAULT_FILE作为选项名来调用mysql_options(), 再调用mysql_real_connect()来连接服务器;

mysql_options(*mysql, MYSQL_READ_DEFAULT_FILE, “my.cnf”)

mysql_real_connect(*mysql, NULL, NULL, NULL, NULL, 0, NULL, 0)

说明:my.cnf文件中记录了连接MySQL服务器所需的各项参数(地址,端口,用户名,密

码,数据库,字符集,Unix Socket等)。这样可以灵活的修改连接参数而不必重新编译程序。

要关闭连接,则调用mysql_close()

voidmysql_close(MYSQL *mysql)

2.4执行查询

1)调用mysql_query()来执行SQL语句,如果语句中包含二进制数据,则需要调用

mysql_real_query()

intmysql_query(MYSQL *mysql, const char *stmt_str)

intmysql_real_query(MYSQL *mysql, const char *stmt_str, unsigned long length)

2)若执行的是UPDATE, DELETE或INSERT语句,则可通过mysql_affected_rows()获知

受影响的记录数。my_ulonglongmysql_affected_rows(MYSQL *mysql) 。

还可以通过mysql_insert_id()来获取由最近的UPDATE或INSERT语句生成的自增值。

my_ulonglongmysql_insert_id(MYSQL *mysql)

3)若执行的是SELECT语句,则有两种方式来获取结果集。

3-1)一种方式是通过mysql_store_result()将整个结果集全部取回来。

MYSQL_RES *mysql_store_result(MYSQL *mysql)

3-2)另一种方式则是调用mysql_use_result()初始化获取操作,但暂时不取回任何记录。MYSQL_RES *mysql_use_result(MYSQL *mysql);

3-3两种方法均通过mysql_fetch_row()来访问每一条记录。

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

注意:若先前调用的是mysql_store_result(), 则直接在本地访问记录;若先前调用的是mysql_use_result(), 则此时才到服务器上去获取记录。

4)当处理完结果集后,调用mysql_free_result()来释放它所占的内存。void mysql_free_result(MYSQL_RES *result)。

5)可调用mysql_errno()和mysql_error()来获知最近执行的API函数的错误代码和错误信息。

unsignedintmysql_errno(MYSQL *mysql)

const char *mysql_error(MYSQL *mysql)

2.5. 预处理语句(Prepared Statements)

MySQL C API还提供了另一种方式来执行SQL语句,即先预处理(prepare)再执行

(execute). 对于多次执行的SQL语句,该方式可以提高其执行效率。具体步骤如下:

调用mysql_stmt_init()创建语句句柄,该句柄在随后的函数调用中都要用到。

MYSQL_STMT *mysql_stmt_init(MYSQL *mysql)

调用mysql_stmt_prepare()对SQL语句进行预处理

intmysql_stmt_prepare(MYSQL_STMT *stmt, const char *stmt_str, unsigned long length)

如果SQL语句中有参数,则需要调用mysql_stmt_bind_param()进行参数绑定。

my_boolmysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind)

如果参数的类型为TEXT或BLOB, 并且数据量很大,可以调用

mysql_stmt_send_long_data()来向服务器发送数据。

my_boolmysql_stmt_send_long_data(MYSQL_STMT *stmt, unsigned intparameter_number, const char *data, unsigned long length)

调用mysql_stmt_execute()来执行查询。

intmysql_stmt_execute(MYSQL_STMT *stmt)

若查询不产生结果集,可以调用

mysql_stmt_affected_rows()和

my_ulonglongmysql_stmt_insert_id(MYSQL_STMT *stmt)来获得被改变的记录数和生成的自增值。

my_ulonglongmysql_stmt_affected_rows(MYSQL_STMT *stmt)

my_ulonglongmysql_stmt_insert_id(MYSQL_STMT *stmt)

否则,执行mysql_stmt_bind_result()对结果集中的字段进行绑定。

my_boolmysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)

2.6. 调用mysql_stmt_fetch()来逐行获取结果集中的记录。

intmysql_stmt_fetch(MYSQL_STMT *stmt)

在调用mysql_stmt_fetch()之前,还可以执行mysql_stmt_store_result()将结果

集预先缓存到本地。

intmysql_stmt_store_result(MYSQL_STMT *stmt)

2.7. 重复步骤3-6, 每次使用不同的实参来执行查询。

2.8. 调用mysql_stmt_close()关闭句柄,释放资源

my_boolmysql_stmt_close(MYSQL_STMT *)

此外,可以调用mysql_stmt_errno()和mysql_stmt_error()来获知最近执行的预处

理语句API函数的错误代码和错误信息。

unsignedintmysql_stmt_errno(MYSQL_STMT *stmt)

const char *mysql_stmt_error(MYSQL_STMT *stmt)

2.9.其他说明:

mysql_stmt_execute()中有调用案例

http://dev.mysql.com/doc/refman/5.1/zh/apis.html#c-api-multiple-queries

25.2.7.11. mysql_stmt_fetch()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 数据库 c语言