Linux下C语言连接MySQL

本文是用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

这样就一切完成了,这只是些示例,在我做的那个小小的学生信息管理中还要做些改动,不过这就是基本知识了。

5 COMMENTS >>LEAVE<<

  1. yisohoo

    提点意见:exe_sql和query_sql都有连接数据库的连接错误的处理,为何不创建一个处理错误信息更详细,兼容性更强的函数,方便重用...

  2. ABitNo
    @yisohoo

    实际用的时候是要这样的。。。不过现在是个小小的入门。。。哈哈。。。

  3. jun

    有的地方还是不懂。只能谷歌了。。

  4. jun

    创建数据表的时候为什么会有NOT NULL??

  5. jun

    到CSDN上问一句就明白了。。。。

LEAVE A RESPONSE >>CANCEL<<

loader