最近有个项目,要求用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);
    }
}


Logo

更多推荐