Linux下C语言连接MySQL
POSTED AT: 2009-04-27 07:41:22 UTC |
POSTED IN: C/GTK/C++/QT |
5 COMMENTS
本文是用GTK和MySQL完成学生信息管理系统的第二部分。
这次就不啰嗦了,直接入正题,用一个简单的实例讲解在Linux下用C语言操作MySQL
1、创建示例数据库和数据表
CREATE DATABASE abitno; USE abitno; CREATE TABLE abitno ( name VARCHAR(10) NOT NULL, site VARCHAR(50) NOT NULL );
上面新建了一个示例数据表abitno,都是最基本的SQL。
2、垒代码
数据库的基本操作就是INSERT, UPDATE, DELETE, SELECT,下面就介绍一下,其中INSERT, UPDATE, DELETE是一样的,因为这三个都是对数据进行了操作,并不期望有什么数据返回,所以ABitNo用同一个函数exe_sql来实现这三个操作;对于SELECT,ABitNo写了另一个方法query_sql. 下面就把代码列出来,有注释,不明白的ABitNo愿意解答。
#include <mysql.h>/*注意要包含这个头文件*/ #include <string.h> #include <stdlib.h> #include <stdio.h> /*定义了一些数据库连接需要的宏*/ #define HOST "localhost" #define USERNAME "ABitNo" #define PASSWORD "ABitNo" #define DATABASE "abitno" /*这个函数用来执行传入的sql語句*/ void exe_sql(char* sql) { MYSQL my_connection; /*这是一个数据库连接*/ int res; /*执行sql語句后的返回标志*/ /*初始化mysql连接my_connection*/ mysql_init(&my_connection); /*这里就是用了mysql.h里的一个函数,用我们之前定义的那些宏建立mysql连接,并 返回一个值,返回不为空证明连接是成功的*/ if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 0, NULL, CLIENT_FOUND_ROWS)) {/*连接成功*/ printf("数据库执行exe_sql连接成功!n"); /*这句话是设置查询编码为utf8,这样支持中文*/ mysql_query(&my_connection, "set names utf8"); /*下面这句话就是用mysql_query函数来执行我们刚刚传入的sql語句, 这会返回一个int值,如果为0,证明語句执行成功*/ res = mysql_query(&my_connection, sql); if (res) {/*现在就代表执行失败了*/ printf("Error: mysql_query !n"); /*不要忘了关闭连接*/ mysql_close(&my_connection); } else {/*现在就代表执行成功了*/ /*mysql_affected_rows会返回执行sql后影响的行数*/ printf("%d 行受到影响!nn", mysql_affected_rows(&my_connection)); /*不要忘了关闭连接*/ mysql_close(&my_connection); } } else { /*数据库连接失败*/ printf("数据库执行exe_sql连接失败!n"); } } /*这个函数用来执行传入的sql語句,并打印出查询結果*/ void query_sql(char* sql) { MYSQL my_connection; /*这是一个数据库连接*/ int res; /*执行sql語句后的返回标志*/ MYSQL_RES *res_ptr; /*指向查询结果的指针*/ MYSQL_FIELD *field; /*字段结构指针*/ MYSQL_ROW result_row; /*按行返回的查询信息*/ int row, column; /*查询返回的行数和列数*/ int i, j; /*只是控制循环的两个变量*/ /*初始化mysql连接my_connection*/ mysql_init(&my_connection); /*这里就是用了mysql.h里的一个函数,用我们之前定义的那些宏建立mysql连接,并 返回一个值,返回不为空证明连接是成功的*/ if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 0, NULL, CLIENT_FOUND_ROWS)) {/*连接成功*/ printf("数据库查询query_sql连接成功!n"); /*这句话是设置查询编码为utf8,这样支持中文*/ mysql_query(&my_connection, "set names utf8"); /*下面这句话就是用mysql_query函数来执行我们刚刚传入的sql語句, 这会返回一个int值,如果为0,证明語句执行成功*/ res = mysql_query(&my_connection, sql); if (res) { /*现在就代表执行失败了*/ printf("Error: mysql_query !n"); /*不要忘了关闭连接*/ mysql_close(&my_connection); } else { /*现在就代表执行成功了*/ /*将查询的結果给res_ptr*/ res_ptr = mysql_store_result(&my_connection); /*如果结果不为空,就把结果print*/ if (res_ptr) { /*取得結果的行数和*/ column = mysql_num_fields(res_ptr); row = mysql_num_rows(res_ptr) + 1; printf("查询到 %lu 行 n", row); /*输出結果的字段名*/ for (i = 0; field = mysql_fetch_field(res_ptr); i++) printf("%st", field->name); printf("n"); /*按行输出結果*/ for (i = 1; i < row; i++) { result_row = mysql_fetch_row(res_ptr); for (j = 0; j < column; j++) printf("%st", result_row[j]); printf("n"); } } /*不要忘了关闭连接*/ mysql_close(&my_connection); } } } int main(int argc, char *argv[]) { /*测试下向里面插入数据*/ char *exe = "insert into abitno values('ABitNo', \ 'http://ABitNo.LinPie.com');"; exe_sql(exe); /*测试下查询*/ char *query = "select * from abitno;"; query_sql(query); return 0; }
3、编译运行
运行下面的語句进行编译
gcc abitno.c -o ABitNo `mysql_config --cflags --libs`
ABitNo又要啰嗦下,上面的`不是单引号!
运行后会看到类似下面的結果
数据库执行exe_sql连接成功! 1 行受到影响! 数据库查询query_sql连接成功! 查询到 2 行 name website ABitNo http://ABitNo.LinPie.com
这样就一切完成了,这只是些示例,在我做的那个小小的学生信息管理中还要做些改动,不过这就是基本知识了。
本文基于 署名-非商业性使用-禁止演绎 2.5 中国大陆 发布
5 COMMENTS >>LEAVE<<
-
提点意见:exe_sql和query_sql都有连接数据库的连接错误的处理,为何不创建一个处理错误信息更详细,兼容性更强的函数,方便重用...
-
@yisohoo
实际用的时候是要这样的。。。不过现在是个小小的入门。。。哈哈。。。
-
有的地方还是不懂。只能谷歌了。。
-
创建数据表的时候为什么会有NOT NULL??
-
到CSDN上问一句就明白了。。。。