数据库 mysql MySQL API 使用详解 苏丙榅 2022-03-11 2024-07-27 连接数据库的步骤 众所周知,MySQL数据库是一个典型的C/S结构,即:客户端和服务器端。如果我们部署好了MySQL服务器,想要在客户端访问服务器端的数据,在编写程序的时候就可以通过官方提供的C语言的API来实现。
在程序中连接MySql服务器,主要分为已经几个步骤:
初始化连接环境
连接mysql的服务器,需要提供如下连接数据:
服务器的IP地址
服务器监听的端口(默认端口是3306)
连接服务器使用的用户名(默认是 root),和这个用户对应的密码
要操作的数据库的名字
连接已经建立, 后续操作就是对数据库数据的添删查改
如果要进行数据 添加/ 删除/ 更新,需要进行事务的处理
数据库的读操作 -> 查询 -> 得到结果集
遍历结果集 -> 得到了要查询的数据
释放资源
MySQL C API 对于以上的操作步骤,在MySQL提供的API中都有对应的操作函数,下面,为大家介绍一下这些API函数的使用。
初始化连接环境 1 2 3 4 MYSQL *mysql_init (MYSQL *mysql) ;
连接mysql服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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) ;
执行sql语句 1 2 3 4 5 6 7 8 int mysql_query (MYSQL *mysql, const char *query) ;参数: - mysql: mysql_real_connect() 的返回值 - query: 一个可以执行的sql语句, 结尾的位置不需要加 ; 返回值: - 如果查询成功,返回0 。如果是查询, 结果集在mysql 对象中 - 如果出现错误,返回非0 值。
获取结果集 1 2 3 4 5 MYSQL_RES *mysql_store_result (MYSQL *mysql) ;
得到结果集的列数 1 2 3 4 unsigned int mysql_num_fields (MYSQL_RES *result)
获取表头 -> 列名(字段名) 1 2 3 4 5 MYSQL_FIELD *mysql_fetch_fields (MYSQL_RES *result) ;
返回值MYSQL_FIELD
对应的是一个结构体,在mysql.h
中定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 typedef struct st_mysql_field { char *name; char *org_name; char *table; char *org_table; char *db; char *catalog; char *def; unsigned long length; unsigned long max_length; unsigned int name_length; unsigned int org_name_length; unsigned int table_length; unsigned int org_table_length; unsigned int db_length; unsigned int catalog_length; unsigned int def_length; unsigned int flags; unsigned int decimals; unsigned int charsetnr; enum enum_field_types type ; void *extension; } MYSQL_FIELD;
函数的使用举例:
1 2 3 4 5 6 7 8 9 MYSQL_FIELD* fields = mysql_fetch_fields(res); int num = mysql_num_fields(res);for (int i=0 ; i<num; ++i){ printf ("当前列的名字: %s\n" , fields[i].name); }
得到结果集中字段的长度 1 2 3 4 5 6 7 8 9 10 unsigned long *mysql_fetch_lengths (MYSQL_RES *result) ;参数: - result: 通过查询得到的结果集 返回值: - 无符号长整数的数组表示各列的大小。如果出现错误,返回NULL 。
示例程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 MYSQL_ROW row; unsigned long *lengths;unsigned int num_fields; row = mysql_fetch_row(result); if (row){ num_fields = mysql_num_fields(result); lengths = mysql_fetch_lengths(result); for (int i = 0 ; i < num_fields; i++) { printf ("Column %u is %lu bytes in length.\n" , i, lengths[i]); } }
遍历结果集 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 typedef char ** MYSQL_ROW;MYSQL_ROW mysql_fetch_row (MYSQL_RES *result) ; 参数: - result: 通过查询得到的结果集 返回值: - 成功: 得到了当前记录中每个字段的值 - 失败: NULL , 说明数据已经读完了
资源回收 1 2 3 4 5 void mysql_free_result (MYSQL_RES *result) ;void mysql_close (MYSQL *mysql) ;
字符编码 1 2 3 4 5 6 7 8 const char *mysql_character_set_name (MYSQL *mysql) int mysql_set_character_set (MYSQL *mysql, char *csname) ;
事务操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 my_bool mysql_autocommit (MYSQL *mysql, my_bool mode) 参数: 如果模式为“1”,启用autocommit模式;如果模式为“0”,禁止autocommit模式。 返回值 如果成功,返回0,如果出现错误,返回非0值。 my_bool mysql_commit (MYSQL *mysql) ; 返回值: 成功: 0 , 失败: 非0 my_bool mysql_rollback (MYSQL *mysql) 返回值: 成功: 0, 失败: 非0
打印错误信息 1 2 3 4 const char *mysql_error (MYSQL *mysql) ;unsigned int mysql_errno (MYSQL *mysql) ;
实例代码
需要的头文件
以上API对应的MySQL动态库
Windows:libmysql.dll
Linux:libmysqlclient.so
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 #include <stdio.h> #include <mysql.h> int main () { MYSQL* mysql = mysql_init(NULL ); if (mysql == NULL )\ { printf ("mysql_init() error\n" ); return -1 ; } mysql = mysql_real_connect(mysql, "localhost" , "root" , "root" , "scott" , 0 , NULL , 0 ); if (mysql == NULL ) { printf ("mysql_real_connect() error\n" ); return -1 ; } printf ("mysql api使用的默认编码: %s\n" , mysql_character_set_name(mysql)); mysql_set_character_set(mysql, "utf8" ); printf ("mysql api使用的修改之后的编码: %s\n" , mysql_character_set_name(mysql)); printf ("恭喜, 连接数据库服务器成功了...\n" ); const char * sql = "select * from dept" ; int ret = mysql_query(mysql, sql); if (ret != 0 ) { printf ("mysql_query() a失败了, 原因: %s\n" , mysql_error(mysql)); return -1 ; } MYSQL_RES* res = mysql_store_result(mysql); if (res == NULL ) { printf ("mysql_store_result() 失败了, 原因: %s\n" , mysql_error(mysql)); return -1 ; } int num = mysql_num_fields(res); MYSQL_FIELD * fields = mysql_fetch_fields(res); for (int i=0 ; i<num; ++i) { printf ("%s\t\t" , fields[i].name); } printf ("\n" ); MYSQL_ROW row; while ( (row = mysql_fetch_row(res)) != NULL ) { for (int i=0 ; i<num; ++i) { printf ("%s\t\t" , row[i]); } printf ("\n" ); } mysql_free_result(res); mysql_autocommit(mysql, 0 ); int ret1 = mysql_query(mysql, "insert into dept values(61, '海军', '圣地玛丽乔亚')" ); int ret2 = mysql_query(mysql, "insert into dept values(62, '七武海', '世界各地')" ); int ret3 = mysql_query(mysql, "insert into dept values(63, '四皇', '新世界')" ); printf ("ret1 = %d, ret2 = %d, ret3 = %d\n" , ret1, ret2, ret3); if (ret1==0 && ret2==0 && ret3==0 ) { mysql_commit(mysql); } else { mysql_rollback(mysql); } mysql_close(mysql); return 0 ; }
更多关于MySQL API 的应用:数据库连接池