无论在 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

执行效果

2015-07-27_220038 我们分别执行了两个 select 语句,可以正确的得到查询结果,并且执行了一个 update 语句,可以返回有多少行受影响了。这就是我们模仿的一个 mysql 客户端工具。