mysql 作为数据库,提供了c/c++,java,python,perl等的API。本文简单的介绍一下在c 程序中如何使用mysql。
一般步骤:
应用程序对数据库的操作一般步骤是:
1、建立连接
初始化连接句柄结构 实际创建连接
2、执行SQL操作语句
3、关闭连接
对应的实现过程:
调用mysql_library_init(),初始化MySQL 库
调用mysql_init()初始化连接处理程序,调用mysql_real_connect() 连接到服务器。
发出SQL语句并处理其结果
调用mysql_close(), 关闭与MySQL服务器的连接
通过调用mysql_library_end(), 结束MySQL库的使用。
常用结构:
MYSQL 结构代表一个数据库连接的句柄,包含关于服务器的连接状态的信息。
MYSQL_RES代表返回行的查询结果
MYSQL_ROW 表示一个行数据的类型安全
MYSQL_FIELD 包含字段信息
example:
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
MYSQL *mysql;
MYSQL_RES *res;
MYSQL_ROW row;
const char *query = "select * from data_import";
int t, r;
//mysql = new MYSQL;
mysql = (MYSQL*)malloc(sizeof(MYSQL));
if (!mysql) {
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}
//init
mysql_init(mysql);
if (!mysql_real_connect(mysql, "localhost", "root", "lijun", "emp",
0, NULL, 0)) {
printf("Error connecting to database: %s\n", mysql_error(mysql));
} else {
printf("Connected ...\n");
}
//SELECT * FROM USERNAME
t = mysql_query(mysql, query);
if (t) {
printf("Error making query: %s\n", mysql_error(mysql));
} else {
printf("Query made...\n");
res = mysql_use_result(mysql);
if (res) {
for (r = 0; r < mysql_field_count(mysql); r++) {
row = mysql_fetch_row(res);
if (row < 0) {
break;
}
for (t = 0; t < mysql_num_fields(res); t++) {
printf("%s ", row[t]);
}
printf("\n");
}
}
mysql_free_result(res);
}
mysql_close(mysql);
//delete mysql;
free(mysql);
}
mysql_use_result() 用来对“按行“结果集进行初始化处理,该函数只可以初始化检索结果但无法获得任何实际行。
mysql_num_fields() 用来得到列数,获取行数的是mysql_num_rows() 这个函数。
编译该文件的时候需要注意链接到mysqlclient库:
gcc -lmysqlclient filename.c -o filename
如果报出链接错误,没有找到mysqlclient 库,检查一下是否安装了,没有的话可以:
sudo apt-get install libMySQLclient15-dev
这里,我有一点没弄明白,为什么不给MYSQL 动态分配内存空间,而直接调用mysql_init() 会报错?哪一位可以解释一
下。