linux-c编程-访问mysql

时间:2022-11-14 09:15:10

1 简介

用C语言连接MySQL数据库有两个步骤:
1)初始化一个连接句柄结构
2)建立连接

2 库函数

2.1 函数mysql_init

初始化一个连接句柄结构

[cpp] view plaincopy
  1. 函数原型:  
  2. MYSQL *mysql_init(MYSQL * mysql);  
  3. 参数说明:  
  4. mysql:为NULL,则分配一个(返回其指针)。或按照传入的结构指针进行初始化。  
  5. MYSQL:返回值,若为NULL表示出错。  

两种常用的方法:

[cpp] view plaincopy
  1. MYSQL my_connection;  
  2. mysql_init(&my_connection);//以参数传出  
  3. 或者  
  4. MYSQL *conn_ptr;  
  5. conn_ptr = mysql_init(NULL);//以返回值传出  

2.2 函数mysql_options

可用于设置额外的连接选项,并影响连接的行为。一次设置一个,可多次调用该函数来设置数个选项。

应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。

[cpp] view plaincopy
  1. 函数原型:  
  2. int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);  
  3. 参数说明:  
  4. int:返回值,该函数成功时返回0。如果使用了未知选项,返回非0值。  

2.3 函数mysql_real_connect

与数据库建立连接。 [cpp] view plaincopy
  1. 函数原型:  
  2. MYSQL *mysql_real_connect(MYSQL *mysql,   
  3.     const char *host,   
  4.     const char *user,   
  5.     const char *passwd,   
  6.     const char *db,   
  7.     unsigned int port,   
  8.     const char *unix_socket,   
  9.     unsigned long client_flag)  
  10. 参数说明:  
  11. host:该值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。  
  12. user:参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。  
  13. passwd:参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。  
  14. db:是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。  
  15. port:若不是0,其值将用作TCP/IP连接的端口号。  
  16. unix_socket:若不是NULL,该字符串描述了应使用的套接字或命名管道。  
  17. client_flag:的值通常为0。  
  18. MYSQL:如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。  

2.4 函数mysql_close

关闭数据库连接 [cpp] view plaincopy
  1. 函数原型:  
  2. void mysql_close(MYSQL *connection);  
  3. 参数说明:  

2.5 函数mysql_error

[cpp] view plaincopy
  1. 函数原型:  
  2. const char *mysql_error(MYSQL *mysql)  
常用结构:
[cpp] view plaincopy
  1. if(mysql_errno(&mysql))  
  2. {  
  3.     // an error occurred  
  4. }  

2.6 函数mysql_errno

[cpp] view plaincopy
  1. 函数原型:  
  2. unsigned int mysql_errno(MYSQL *mysql)  
  3. 参数说明:  
  4. int:对于由mysql指定的连接,mysql_errno()返回最近调用的API函数的错误代码,该函数调用可能成功也可能失败。“0”返回值表示未出现错误。  

2.7 函数mysql_query

执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句。
[cpp] view plaincopy
  1. 函数原型:  
  2. int mysql_query(MYSQL *mysql, const char *query)  
  3. 参数说明:  
  4. int:如果查询成功,返回0。如果出现错误,返回非0值。  

2.8 函数mysql_real_query

2.9 函数mysql_affected_rows

返回上次UPDATE更改的行数,上次DELETE删除的行数,或上次INSERT语句插入的行数。对于UPDATE、DELETE或INSERT语句,可在mysql_query()后立刻调用。对于SELECT语句,mysql_affected_rows()的工作方式与mysql_num_rows()类似。 [cpp] view plaincopy
  1. 函数原型:  
  2. my_ulonglong mysql_affected_rows(MYSQL *mysql)  
  3. 参数说明:  
  4. my_ulonglong:大于0的整数表明受影响或检索的行数。“0”表示UPDATE语句未更新记录,在查询中没有与WHERE匹配的行,或未执行查询。“-1”表示查询返回错误  


2.10 函数mysql_use_result

对于成功检索数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN),必须调用mysql_store_result()或mysql_use_result()。

mysql_use_result()将初始化结果集检索,但并不像mysql_store_result()那样将结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内,与mysql_store_result()相比,速度更快而且使用的内存也更少。客户端仅为当前行和通信缓冲区分配内存,分配的内存可增加到max_allowed_packet字节。

使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。

[cpp] view plaincopy
  1. 函数原型:  
  2. MYSQL_RES *mysql_use_result(MYSQL *mysql)  
示例代码:

[cpp] view plaincopy
  1. MYSQL_RES * res_ptr = mysql_use_result(&my_connection);  
  2. MYSQL_ROW sqlrow;  
  3. if (res_ptr) {  
  4.     while ((sqlrow = mysql_fetch_row(res_ptr))) {  
  5.     printf("We inserted childno %s\n", sqlrow[0]);  
  6. }  
  7. mysql_free_result(res_ptr);  

2.11 函数mysql_store_result

mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。

一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()。

[cpp] view plaincopy
  1. 函数原型:  
  2. MYSQL_RES *mysql_store_result(MYSQL *mysql)  

2.12 函数mysql_fetch_row

检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。

[cpp] view plaincopy
  1. 函数原型:  
  2. MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)  

2.13 函数mysql_free_result

[cpp] view plaincopy
  1. 函数原型:  
  2. MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)  


2.5 示例代码

[cpp] view plaincopy
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include "mysql.h"  
  4. int main(int argc, char *argv[])   
  5. {  
  6.     MYSQL *conn_ptr;  
  7.     //mysql_init()  
  8.     conn_ptr = mysql_init(NULL);  
  9.   
  10.     if (!conn_ptr) {  
  11.         fprintf(stderr, "mysql_init failed\n");  
  12.         return EXIT_FAILURE;  
  13.     }  
  14.     //mysql_real_connect()  
  15.     conn_ptr = mysql_real_connect(conn_ptr, "127.0.0.1""root""","shellge", 0, NULL, 0);  
  16.   
  17.     if (conn_ptr) {  
  18.         printf("Connection success\n");  
  19.     } else {  
  20.         printf("Connection failed\n");  
  21.     }  
  22.   
  23.     //mysql_close()  
  24.     mysql_close(conn_ptr)