无论在 windows 下还是 linux 下,我们每次去连接 mysql 的时候都会运行一个叫做 mysql 的命令,本文就模仿制作一个类似的程序,实现可以在里面执行 DML 和 DQL 语句。具体代码的实现请参考程序。
代码实现
#include <stdio.h> #include <mysql.h> #include <string.h> #include <ctype.h> int main(int argc, char* argv[]) { unsigned int err; MYSQL* mysql; // 初始化 mysql 句柄 mysql = mysql_init(NULL); if (mysql == NULL) { err = mysql_errno(mysql); printf("mysql_init error, code = %d\n", err); return err; } // 连接服务器 mysql = mysql_real_connect(mysql, "127.0.0.1", "root", "******", "mydb61", 0, NULL, 0); if (NULL == mysql) { err = mysql_errno(mysql); printf("mysql_real_connect error, code = %d\n", err); return err; } char sql[1024]; while (1) { printf("mysql> "); fgets(sql, sizeof(sql), stdin); sql[strlen(sql) - 1] = '\0'; // 判断是否是输入了退出指令 if (strcmp(sql, "EXIT") == 0 || strcmp(sql, "QUIT") == 0 || strcmp(sql, "exit") == 0 || strcmp(sql, "quit") == 0) { break; } // 判断是否是执行了 select 或 show 或 desc 开头的命令 if (strncmp(sql, "SELECT", 6) == 0 || strncmp(sql, "select", 6) == 0 || strncmp(sql, "SHOW", 4) == 0 || strncmp(sql, "show", 4) == 0 || strncmp(sql, "DESC", 4) == 0 || strncmp(sql, "desc", 4) == 0) { // 执行 sql 语句,如果要查询包含二进制数据的,要用 mysql_real_query err = mysql_query(mysql, sql); if (err != 0) { err = mysql_errno(mysql); printf("mysql_query error, code = %d\n", err); return err; } // 获取查询出来的数据有多少个列 unsigned int num, i = 0; num = mysql_field_count(mysql); // 获取结果集 MYSQL_RES* result; result = mysql_store_result(mysql); if (NULL == result) { err = mysql_errno(mysql); printf("mysql_query error, code = %d\n", err); return err; } /* 与 mysql_field_count() 功能一致,但 mysql_field_count() 是返回上一次执行语句(query)结果列的数目 而 mysql_num_fields() 是从结果集中获取返回列数 */ // 获取表头内容 MYSQL_FIELD *fields; fields = mysql_fetch_fields(result); for(i = 0; i < num; i++) { printf("%8s\t", fields[i].name); } putchar(10); // 读取结果集 MYSQL_ROW row; while ((row = mysql_fetch_row(result))) { for (i = 0; i < num; i++) { printf("%8s\t", row[i]); } putchar(10); } // 释放结果集 mysql_free_result(result); } else { // 执行 DQL 语句 err = mysql_query(mysql, sql); if (err != 0) { err = mysql_errno(mysql); printf("mysql_query error, code = %d\n", err); return err; } my_ulonglong row = mysql_affected_rows(mysql); printf("Query OK, %d row affected", row); } putchar(10); } // 关闭 mysql 句柄 mysql_close(mysql); return 0; }
编译程序
编译指令:gcc mysql_tool.c -o mysql_tool -I /usr/include/mysql -L /usr/lib64/mysql -l mysqlclient -l stdc++ -l pthread -l dl -l rt
执行效果
我们分别执行了两个 select 语句,可以正确的得到查询结果,并且执行了一个 update 语句,可以返回有多少行受影响了。这就是我们模仿的一个 mysql 客户端工具。