最近有个项目,要求用C语言连接mysql数据库,苦找了半天才找要一些相关的API,写下来和大家一起分享。
    我用的是linux操作系统(debian 4.0 sid),所在在安装mysql库时十分方便,使用下的几条命令轻松搞定。大家一起来看看吧。
       sudo apt-get install mysql-server-5.0
       sudo apt-get install libmysqlclient15-dev
    为了确保mysql.h(没有它是不行的哦!)这个文件安装完成,使用如下命令查看一下:
       ls -l /usr/include/mysql/mysql.h
    如出现如下类似信息,说明我们所需要的头文件已经安装成功,可以开始写程序了。
       -rw-r--r-- 1 root root 33759 2007-05-19 08:16 /usr/include/mysql/mysql.h
    好了,不多说废话了,让我们开始吧。
    首先要了解与mysql的一些库函数,我们可以到以下的网址去查找(相当多的库函数啊!!!)。
       http://www.linuxforum.net/books/mysqlmanual/manual_toc.html(Mysql中文参考手册) 或者http://dev.mysql.com/doc/refman/5.1/zh/apis.html(Mysql 5.1中文参考手册 推荐)
       现在我们启动mysql,创建数据库及表。
          mysql -h xxx.xxx.xxx.xxx. -u root -p   (回车确认,在提示下输入密码,成功后进入数据库)
       创建数据库
          create database mytest;
       创建表
          create table hotelwebmanager(ROOM_ON int,IP char(15),POWERON_TIME datetime);
       只是为了练习而建的数据库及表,所以结构比较简单。
       为了练习一下用C语言写mysql的程序,我们先一个小试验,此程序的目的是连接一个已有的数据库。
     

/*connect_db.c*/
        #include<stdio.h>
        #include<mysql/mysql.h>
        int main(int argc,char *argv[])
        {
              MYSQL mysql;
              char *hostname="localhost";
              char *username="root";
              char *password="000000";
              char *dbname="mytest";
              mysql_init(&mysql);
              if(!mysql_real_connect(&mysql,hostname,username,password,mytest,0,NULL,0))
              {
                    printf("connect database fail !!!\n");
              }
              else
              {
                    printf("connect database successful !!!\n");
              }
        }


      现在我们开始编译上面的程序,gcc connect_db.c -lmysqlclient



要想对数据进行以上这些操作的话,就要了解一些基本的操作函数,下面是这些函数的介绍 和示例。
    1、mysql_real_query
        原型:int mysql_real_query(MYSQL *mysql,const char *qurey,unsigned int length)
        功能:执行SQL语句。
        参数:MYSQL *mysql  该结构代表1个数据库连接的句柄。几乎所有的MySQL函数均使用它。不应尝试拷贝MYSQL结构。不保证这类拷贝结果会有用。
                  const *qurey  对数据库操作的SQL语句(没有SQL语句中应有的语句结束符号,即“;”)。例如:select * from tablename
                  unsigned int length  操作语句的字符串长度。
         返回值:操作成功返回0,否则返回非0。
          示例:
                  

int i;
                    MYSQL mysql;
                    char *sql="select * from hotelwebmanager";
                    if((i=mysql_real_qurey(&mysql,sql,strlen(sql)))!=0)
                    {
                          printf("successful!!!\n");
                          mysql_close(&mysql);       //close database
                          exit(0);                            //return 0
                    }
                    else
                    {
                          printf("fail!!!\n");
                          mysql_close(&mysql);       //close database
                          exit(1);                            //return 1
                    }


    可是这样并不是把查询的结果显示出来,而只是将查询语句传给数据库,这一点可以从些函数的返回值上看出。如果要想把真正的查询结果显示出来的话,还要继续、耐心的学习。在这一节的最后还会有一个完整的示例,不要急哦!
    2、mysql_store_result
        原型:MYSQL_RES *mysql_store_result(MYSQL *mysql)
        功能:得到查询的结果集。对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。
       参数:MYSQL *mysql  同mysql_real_qurey
       返回值:MYSQL_RES  该结构代表返回行的查询结果(SELECT, SHOW, DESCRIBE, EXPLAIN)。也将查询返回的信息称为“结果集”。
       示例:
               

MYSQL_RES *result;
                 if(result=mysql_store_result(&mysql))!=NULL)
                    printf("result is not NULL\n");
                 else
                    printf("resutl is NULL\n");

    3、mysql_num_rows
       原型:my_ulonglong mysql_num_rows(MYSQL_RES *result)
       功能:返回查询结果的行数。mysql_num_rows()的使用取决于是否采用了mysql_store_result()或mysql_use_result()来返回结果集。如果使用了mysql_store_result(),可以立刻调用mysql_num_rows()。如果使用了mysql_use_result(),mysql_num_rows()不返回正确的值,直至检索了结果集中的所有行为止。
       参数:MYSQL_RES *result  由mysql_store_result返回的结果集。
       返回值:my_ulonglong  用于行数以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的类型。该类型提供的范围为0~1.84e19。在某些系统上,不能打印类型my_ulonglong的值。要想打印这类值,请将其转换为无符号长整数类型并使用%lu打印格式,例如:
     

printf("Number of rows %lu\n",(unsigned long)mysql_num_rows(result));


    4、mysql_num_fields
       原型:unsigned int mysql_num_fields(MYSQL_RES *result)
       功能:返回查询结果集的列数。
       参数:同上
       返回值:无符号整数。
       示例:
            

int i;
                i=mysql_num_fields(result);
                printf("%u",i);


    5、mysql_fetch_row
原型:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
         功能:检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。
       返回值:下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。
    6、mysql_free_result
       原型:void mysql_free_result(MYSQL_RES *result)
       功能:释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。释放完成后,不要尝试访问结果集。
       返回值:无
    好了,有了以上这些函数,就可以从表中查询数据了,看一具体的例子吧。

/*select.c*/
     #include<stdio.h>
     #include<mysql/mysql.h>
     #include<stdlib.h>
     #include<string.h>
 int main(void)
 {
     MYSQL mysql;
     MYSQL_ROW row;
     MYSQL_RES *result;
     int data_cols;
     char *host_name="127.0.0.1";
     char *db_name="mytest";
     char *user_name="root";
     char *password="000000";
     char *select_arg="select * from hotelwebmanager";
     if(mysql_init(&mysql)==NULL)
     {
        printf("init error !\n");
        exit(1);
     }
     if(!mysql_real_connect(&mysql,host_name,user_name,password,db_name,0,NULL,0))
 {
     printf("connect database error !\n");
     exit(1);
 }
     if(mysql_real_query(&mysql,select_arg,strlen(select_arg))!=0)
     {
        printf("query error !\n");
        exit(1);
     }
     if((result=mysql_store_result(&mysql))!=NULL)
     {
        data_cols=mysql_num_fields(result);
        while(row=mysql_fetch_row(result))
        {
           int cols;
           for(cols=0;cols<data_cols;cols++)
           {
              printf("%s  ",row[cols]);
           }
           printf("\n");
        }
        printf("\n");
        mysql_free_result(result);
        mysql_close(&mysql);
     }
 }