Linux下C语言连接MySQL

来源:互联网 发布:医院和农合的网络系统 编辑:程序博客网 时间:2024/05/22 03:20

    Linux 发行版本:RHEL 6.1

    Linux 内核版本: 2.6.32-131.0.15.el6.i686

    gcc 版本: 4.4.4 20100726

    MySQL版本:mysql-5.1.52-1.el6_0.1.i686mysql-devel-5.1.52-1.el6_0.1.i686,mysql-server-5.1.52-1.el6_0.1.i686

        全部是RHEL 6.1自带的rpm包,由于红帽的升级服务需要额外费用,所以一般人都将镜像当成更新源。另一方面,红帽发行的企业版是很稳定的,当然稳定的前提是使用配套的rpm包。

1.建立MySQL服务器

    #yum install mysql    #yum install mysql-devel    #yum install mysql-server

2.创建数据库

    #/etc/init.d/mysqld start//启动MySQL服务器    #mysqladmin –u root password YOUR.PASSWORD//添加MySQL的root账号    #mysql –u root –p//以root身份登录数据库    mysql>create database iSql;//创建一个数据库,名叫“iSql”    mysql>grant all privileges on iSql.* to jiutian@localhost identified by 'PASSWORD';                       //为iSql创建一个数据库账户,名叫“jiutian”,最后的密码要用单引号括起来    mysql>use iSql;//切换到iSql数据库    Database changed    mysql>CREATE TABLE votelanguage(        ->id INT NOT NULL AUTO_INCREMENT,        ->choice TINYINT NOT NULL,        ->ts TIMESTAMP,        ->PRIMARY KEY(id);//创建新表votelanguage(摘自MySQL 5 权威指南 第三版)    Query OK, 0 rows affected(0.75 sec)//创建成功    mysql>describe votelanguage//显示votelanguage表的结构

3.客户端编写程序

       C 程序源代码如下:

#include <stdio.h>#include <mysql.h>int main(int argc, char *argv[]){    int i;    MYSQL *conn;        //connection    MYSQL_RES *result;  //result of SELECT query    MYSQL_ROW row;      //a record of the SELECT query    //create connection to MySQL    conn = mysql_init(NULL);    if (mysql_real_connect(conn, "localhost", "jiutian", "DATABASE.PASSWD", "iSql", 0, NULL, 0) == NULL){        fprintf(stderr, "Sorry, no database connection ...\n");        return 1;    }    //only if Unicode output(utf8) is desired    mysql_query(conn, "SET NAMES 'utf8'");    //create list of all    const char *sql = "SELECT ts as 'time'\                       FROM votelanguage\                       WHERE choice = 1;";    if (mysql_query(conn, sql)){        fprintf(stderr, "%s\n\n", mysql_error(conn));        fprintf(stderr, "%s\n", sql);        return 1;    }    //process result    result = mysql_store_result(conn);    if (result == NULL){        if (mysql_error(conn))            fprintf(stderr, "%s\n", mysql_error(conn));        else            fprintf(stderr, "%s\n", "unknown error\n");        return 1;    }    printf("%i records found \n", (int)mysql_num_rows(result));    //loop over all records    while ((row = mysql_fetch_row(result)) != NULL){        for (i = 0; i < mysql_num_fields(result); i++){            if (row[i] == NULL)                printf ("[NULL]\t");            else                printf ("%s\n", row[i]);        }    }    //release memory, server connection    mysql_free_result(result);    mysql_close(conn);    return 0;}

4.gcc编译

    gcc -o link -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient//由于mysql的lib文件不在默认的库文件目录下,所以编译的时候要把-L加进去,include文件也是同理//不然的话,就会提示各种找不到的抓狂错误..//比如 /usr/bin/ld: cannot find -lmysqlclient 其实就是找不到mysql的某个库文件

        至于如果不加参数编译不通过的造成的原因,个人认为是mysql的rpm包默认配置路径的问题,在/usr/lib/mysql下有几个连接文件和连接的源文件在同一个目录下。所以如果不想每次编译的时候都将路径输入,就在gcc默认的lib位置加个连接就好了。


5.makefile文件

CC = gccINCLUDES = -I/usr/include/mysql#link libmysqlclient functions dynamicallyLIBS = -L/usr/lib/mysql -lmysqlclientall:linklink_MySql.o: link_MySql.c$(CC) -c $(INCLUDES) link_MySql.clink: link_MySql.o$(CC) -o link $(LIBS) link_MySql.oclean:rm -f link *.o
        makefile文件中的每条命令前面用tab作为开始标记,不然是会报错的..

6.关于客户端Linux无法连接服务器MySQL的原因
        由于装的是RHEL6.1,所以很犀利的防火墙..只能在setup里添加MySQL的端口3306,protocol是tcp(会提示小写的)~

        PS:本文很多是手工输入,如果错误请提示,谢谢~


原创粉丝点击