用C语言连接MySQL包含两个步骤:
1.初始化一个连接句柄结构。
2.实际进行连接。
初始化连接句柄:
通常传递NULL给此例程,它返回一个指向新分配的连接句柄结构的指针。如果传递一个已有的结构,它将被重新初始化。mysql_init函数出错时返回NULL。
分配和初始化一个句柄后,需要调用mysql_real_connect向一个连接提供参数:
MYSQL *mysql_real_connect(MYSQL *connection,
const char *server_host,
const char *sql_user_name,
const char *sql_password,
const char *db_name,
unsigned int port_number,
const char *unix_socket_name,
unsigned int flags);
参数connection必须指向被mysql_init函数初始化过的结构。
参数server_host既可以是主机名,也可以是IP地址,如果是连接到本地机器,可通过指定localhost或NULL(两者含义相同)来优化连接类型,优化后,将使用套接字(UNIX)或命名管道(Windows)而非TCP/IP连接到数据库。
如果数据库登录名参数sql_user_name为NULL,则假设登录名为当前Linux用户的登录ID;如果数据库密码参数sql_password为NULL,那么只能访问服务器上无需密码就能访问的内容。
MySQL端口号port_name和unix_socket_name参数应该分别为0和NULL,除非改变了MySQL的默认设置,它们将默认使用合适的值。参数unix_socket_name指定使用的套接字或命名管道。
flags参数改变使用协议的某些特性。
使用完连接后,通常在程序退出时,要调用:
如果参数connection是由mysql_init函数建立的,MySQL结构会被释放,指针将会失效并无法再次使用。保留一个不需要的连接是对资源的浪费,而重新打开连接会带来额外开销,要权衡何时使用mysql_close函数。
MySQL错误处理函数使用一系列由连接句柄结构报告的返回码:
可调用mysql_errno并传递连接句柄结构来获得错误码,它通常是非0值,如没有设定错误码,则返回0,每次调用库函数(除了以上两个错误检查例程)都会更新错误码,因此只能得到最后一个执行命令的错误码。
错误码定义在头文件errmsg.h或mysqld_error.h中,前者报告客户端错误,后者关注服务器端错误。
mysql_error函数返回文本错误信息,这些信息被写入内部静态内存空间中,因此如果想保存错误文本,需要把它复制到别的地方。
执行sql语句的API:
参数query是不带分号的有效sql语句文本串。成功时,函数返回0。对于包含二进制数据的查询,可使用mysql_real_query函数。
对于不返回任何数据的sql语句,如update、delete、insert,检查受sql影响的行数:
此函数的返回类型在printf时,推荐使用%ul格式将其转换成无符号长整型。这个函数返回受之前没有返回值的sql语句影响的行数。MySQL返回的是一个被更新操作修改的行数,但其他许多数据库仅因为某行记录匹配where字句就把它视为已更新过。
在C应用程序中提取数据库数据分以下步骤:
1.执行查询。
2.提取数据。
3.处理数据。
4.必要的清理工作。
先用mysql_query函数发送sql语句,之后可以使用mysql_use_result(一次返回一行数据)或mysql_store_result(一次返回所有结果)函数来提取数据,结果集比较小时,后者比较合适。
此函数将返回所有查询到的数据,它返回一个指向结果集结构的指针,如果执行失败,则返回NULL。
mysql_store_result成功调用后,需要调用mysql_num_rows来得到返回记录的数目,一般是一个正数,如果没有返回行,mysql_num_rows函数将返回0。
如果mysql_store_result调用成功,则mysql_num_rows函数始终返回成功。
如果查询结果是一个特别庞大的数据集,最好提取小一些、更易管理的信息块,这样可以更快地将控制权返回给应用程序,且不会占用大量网络资源。
现在,可以调用mysql_fetch_row处理MYSQL_RES结果结构,从中提取一行,并把该行放到一个行结构中,当数据用完或发生错误时,返回NULL:
也可用mysql_data_seek函数在结果集中进行跳转,从而设置被下一个mysql_fetch_row函数返回的行:
参数offset的值是一个行号,它必须在0到结果集总行数-1的范围内,传递0会导致下一个mysql_fetch_row调用返回结果集中的第一行。
完成了对数据的所有操作后,必须使用mysql_free_result函数让MySQL库完成善后处理:
必须总是调用此函数让MySQL库清理它分配的对象。
逐行提取数据:
执行失败时返回NULL,如果成功,返回指向结果集对象的指针。用mysql_use_result函数返回的MYSQL_RES结构来调用msyql_fetch_row时,每次都从服务器取回行数据。
为得到所有数据,必须再反复调用mysql_fetch_row直到取得了所有数据(即直到mysql_fetch_row函数返回NULL),如果没有取完所有数据,则下次执行返回数据的sql语句时可能会返回遭到破坏的信息。
mysql_use_result调用不能与mysql_data_seek、mysql_row_seek、mysql_row_tell一起使用,并且由于直到所有数据都被提取后才能实际生效,因此mysql_num_rows的使用也受到限制。每个行请求和结果的返回都要通过网络,可能网络连接在中途失败,留下不完整的数据。但mysql_use_result函数更好地平衡了网络负载,减少了可能非常大的数据集带来的存储开销。
MySQL返回两种类型数据:元数据和表中的列数据。
mysql_field_count函数返回结果集中字段(列)的个数:
在旧版本的MySQL代码中,mysql_num_fields函数可以接受一个连接结构或结果结构。