首页 > 编程资源分享区 > C/C++源代码共享 > 原创连载:利用c语言 访问mysql数据库尝试
2008
05-10

原创连载:利用c语言 访问mysql数据库尝试

今天,突然想试试用c语言访问mysql数据库,在网上找了下,发现都是写linux下的,而windows下的比较少,想想windows下和linux下应该差不多,所以就试了一下,发现还是有区别的,我分别用CodeBlocks和CodeGear和 Visual Studio 2005做了试验。

        CodeBlocks和Visual Studio 2005方法一样,首先建立win32控制台工程,建立一个c源文件:


#include <stdio.h>
#include <windows.h>
#include “D:/MySQL5/include/mysql.h”
#pragma  comment(lib,”ibmysql.lib”)


int main(){
  MYSQL mysql;
  MYSQL_RES *result;
  MYSQL_ROW row;
  mysql_init(&mysql);  //初始化mysql结构
  mysql_real_connect(&mysql,”localhost”,”root”,”root”,”test”,0,NULL,0);//连接服务器
  mysql_query(&mysql,”select * from user”); //进行查询
  result=mysql_store_result(&mysql); //获得结果集
  while((row=mysql_fetch_row(result))){   //取出结果集中记录
    fprintf(stdout,”userID:%s password:%s  \n”,row[0],row[1]);  //输出这行记录
  }
  mysql_free_result(result);    //释放结果集
  mysql_close(&mysql);          //释放连接
  return 0;
}


然后在工程属性中,修改library加入D:\MySQL5\lib\opt目录,这样才能找到ibmysql.lib。


编译链接后会生成exe文件,但是会提示找不到libmysql.dll文件,我把libmysql.dll文件放到c:\windows\system32目录ok了,运行程序输出所有用户ID和密码,访问数据库成功了。


下面说一下在CodeGear下使用的方法,在CodeGear下与Visual Studio 2005和CodeBlocks不同,因为mysql的lib,CodeGear是无法直接使用的,需要用coff2omf.exe转换一下,方法是cmd下直接输入coff2omf就可以出现使用帮助


使用后生成一个新的lib,我命名为new.lib,然后就可以一样使用这个新的lib了,代码如下:


#include <stdio.h>
#include <windows.h>
#include “mysql.h”
#pragma  comment(lib,”new.lib”)     //这个位置变成新的lib名字


int main(){
  MYSQL mysql;
  MYSQL_RES *result;
  MYSQL_ROW row;
  mysql_init(&mysql);  //初始化mysql结构
  mysql_real_connect(&mysql,”localhost”,”root”,”root”,”ngo”,0,NULL,0);//连接服务器
  mysql_query(&mysql,”select * from user”); //进行查询
  result=mysql_store_result(&mysql); //获得结果集
  while((row=mysql_fetch_row(result))){   //取出结果集中记录
    fprintf(stdout,”%s-%s\n”,row[0],row[1]);  //输出这行记录
  }
  mysql_free_result(result);    //释放结果集
  mysql_close(&mysql);          //释放连接
  return 0;
}


运行效果和 CodeBlocks和Visual Studio 2005一样。


好了就写这些吧,写的肤浅的请大家见谅。


原创连载:利用c语言 访问mysql数据库尝试》有 8 条评论

  1. as7575612 说:

    靠   我看得脑袋都大 了

  2. zwind_fancy 说:

    没用C连过数据库 学习下

  3. miliya 说:

    再接着发一个对上面例子的修改版本:

    #include <stdio.h>
    #include <windows.h>
    #include “D:/MySQL5/include/mysql.h”
    #pragma  comment(lib,”ibmysql.lib”)

    int main(){
      MYSQL mysql;
      MYSQL_RES *result;
      MYSQL_ROW row;
      mysql_init(&mysql);  //初始化mysql结构
      if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
        printf(“\n不能连接到mysql数据库\n”);
      }else{
        printf(“\n连接数据库成功\n”);
        if(mysql_query(&mysql,”select * from book”)){ //如果查询失败
          printf(“\n查询book表失败\n”);
        }else{
          mysql_query(&mysql,”select * from book”); //进行查询
          result=mysql_store_result(&mysql); //获得结果集
          if(mysql_num_rows(result)!=NULL){  //有记录的情况,只有有记录取数据才有意义
            while((row=mysql_fetch_row(result))){   //取出结果集中记录
             fprintf(stdout,”ID:%s BookName:%s author:%s bookconcern:%s \n”,row[0],row[1],row[2],row[3]);  //输出这行记录
            }
          }else{
            printf(“\n没有一行记录被发现\n”);
          }
          mysql_free_result(result);    //释放结果集
        }
      }
      mysql_close(&mysql);          //释放连接
      return 0;
    }

     

    表结构如下:

    CREATE TABLE `book` (
      `ID` int(10) unsigned NOT NULL COMMENT ‘ID’,
      `bookname` char(50) NOT NULL,
      `author` char(50) NOT NULL,
      `bookconcern` char(100) NOT NULL,
      PRIMARY KEY  (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

     

     

     

  4. miliya 说:

    今天把上次的练习加点功能,增加上字段和记录数的获取,以及mysql标准错误的输出。
    下面我在CodeBlocks中进行练习,这个例子在CodeGear下不能编译通过,原因在开始时候说过了,需要转换,这里就不说了
    以后我都会以这个为c开发环境,vs2005和CodeGear都只用来查东西和测试用,如果您还没有CodeBlocks可以去下载一个下载
    地址为:http://www.codeblocks.org

    #include <stdio.h>
    #include <windows.h>
    #include “D:/MySQL5/include/mysql.h”
    #pragma  comment(lib,”ibmysql.lib”)

    int main(){
      MYSQL mysql;
      MYSQL_RES *result;
      MYSQL_ROW row;
      mysql_init(&mysql);  //初始化mysql结构
      if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
        fprintf(stderr,”数据库连接发生错误”,mysql_error(&mysql));    //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
      }else{
        printf(“\n连接数据库成功\n”);
        if(mysql_query(&mysql,”select * from book”)){
          fprintf(stderr,”数据库查询发生错误”,mysql_error(&mysql));  //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
        }else{
          mysql_query(&mysql,”select * from book”);
          printf(“\n开始查询……..\n”);
          result=mysql_store_result(&mysql); //获得结果集
          if(mysql_num_rows(result)!=NULL){  //有记录的情况
            int numRecords=mysql_num_rows(result); //得到表中记录数
            int numField=mysql_num_fields(result); //得到表中字段数
            printf(“\n共发现:”);
            printf(“\t%d个字段”,numField);
            printf(“\t%d行记录”,numRecords);
            while((row=mysql_fetch_row(result))){   //取出结果集中记录
             int i=0;
             printf(“\n————————————————\n”);
             for(i=0;i<numField;i++){
               fprintf(stdout,”第%d个字段值为:%s \n”,i,row[i]);  //取出字段的值
             }
             printf(“\n————————————————\n”);
            }
          }else{
            printf(“\n没有一行记录被发现\n”);
          }
          mysql_free_result(result);    //释放结果集
        }
      }
      mysql_close(&mysql);          //释放连接
      return 0;
    }

    运行结果如下:

    连接数据库成功

    开始查询……..

    共发现: 4个字段 2行记录
    ————————————————
    第0个字段值为:1
    第1个字段值为:english
    第2个字段值为:ranka lee
    第3个字段值为:china book concern

    ————————————————

    ————————————————
    第0个字段值为:2
    第1个字段值为:c program
    第2个字段值为:sheryl
    第3个字段值为:hainan book concern

    ————————————————

    上面的练习,只是指出字段以及值,下面我们看看加上自动获取字段名以后的情况,把代码改一下,如下:

    #include <stdio.h>
    #include <windows.h>
    #include “D:/MySQL5/include/mysql.h”
    #pragma  comment(lib,”ibmysql.lib”)

    int main(){
      MYSQL mysql;
      MYSQL_RES *result;
      MYSQL_ROW row;
      MYSQL_FIELD *field;
      mysql_init(&mysql);  //初始化mysql结构
      if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
        fprintf(stderr,”数据库连接发生错误”,mysql_error(&mysql));    //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
      }else{
        printf(“\n连接数据库成功\n”);
        if(mysql_query(&mysql,”select * from book”)){
          fprintf(stderr,”数据库查询发生错误”,mysql_error(&mysql));  //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
        }else{
          mysql_query(&mysql,”select * from book”);
          printf(“\n开始查询……..\n”);
          result=mysql_store_result(&mysql); //获得结果集
          if(mysql_num_rows(result)!=NULL){  //有记录的情况
            int numRecords=mysql_num_rows(result); //得到表中记录数
            int numField=mysql_num_fields(result); //得到表中字段数
            while(field=mysql_fetch_field(result)){  //这里怎么就执行了两次呢?我不明白为什么只读取了两个字段,谁知道请留言
              field=mysql_fetch_field(result);
              printf(“%s\t”,field->name);
            }
            printf(“\n”);
            while((row=mysql_fetch_row(result))){   //取出结果集中记录
             int i=0;
             for(i=0;i<numField;i++){
               fprintf(stdout,”%s\t”,row[i]);  //取出字段的值
             }
             printf(“\n”);
            }
          }else{
            printf(“\n没有一行记录被发现\n”);
          }
          mysql_free_result(result);    //释放结果集
        }
      }
      mysql_close(&mysql);          //释放连接
      return 0;
    }

    运行结果如下:

    连接数据库成功

    开始查询……..
    bookname        bookconcern
    1       english ranka lee       china book concern
    2       c program       sheryl  hainan book concern

    这个练习做完了,但是另外迷茫的是字段名字为什么少了两个,如果谁知道请给我留言,谢谢拉。

     

     

     

     

  5. miliya 说:

    mysql来做插入,修改,删除的动作

    #include <stdio.h>
    #include <windows.h>
    #include “mysql.h”
    #pragma  comment(lib,”ibmysql.lib”)

    int main(){
      MYSQL mysql;
      mysql_init(&mysql);  //初始化mysql结构
      if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
        fprintf(stderr,”数据库连接发生错误”,mysql_error(&mysql));    //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
      }else{
        printf(“连接数据库成功!\n”);
    //    if(mysql_query(&mysql,”insert into book (ID,bookname,author,bookconcern) values (4,’aa’,'aa’,'aa’)”)!=0){  //执行插入语句
    //    if(mysql_query(&mysql,”update book set bookname=’hello beijing’ where ID=3″)!=0){   //执行更新语句
        if(mysql_query(&mysql,”delete from book where ID=4″)!=0){    //执行删除语句
          fprintf(stderr,”在执行插语句时错误发生”,mysql_error(&mysql));
        }else{
          printf(“执行插语句成功!\n”);
        }
      }
      mysql_close(&mysql);          //释放连接
      return 0;
    }

  6. miliya 说:

    修改一下之前的那个例子,少了字段的那个。同时增加二进制blob字段的判断

    #include <stdio.h>
    #include <windows.h>
    #include “mysql.h”
    #pragma  comment(lib,”ibmysql.lib”)

    int main(){
      MYSQL mysql;
      MYSQL_RES *result;
      MYSQL_ROW row;
      MYSQL_FIELD *field;
      mysql_init(&mysql);  //初始化mysql结构
      if(!mysql_real_connect(&mysql,”localhost”,”root”,”root”,”exercise”,0,NULL,0)){
        fprintf(stderr,”数据库连接发生错误”,mysql_error(&mysql));    //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
      }else{
        printf(“\n连接数据库成功\n”);
        if(mysql_query(&mysql,”select * from book”)){
          fprintf(stderr,”数据库查询发生错误”,mysql_error(&mysql));  //这里的输出我们换成标准错误输出,这个是mysql自己带的异常
        }else{
          mysql_query(&mysql,”select * from book”);
          printf(“\n开始查询……..\n”);
          result=mysql_store_result(&mysql); //获得结果集
          if(mysql_num_rows(result)!=NULL){  //有记录的情况
            int numRecords=mysql_num_rows(result); //得到表中记录数
            int numField=mysql_num_fields(result); //得到表中字段数
            int blobflag=0;
            int counter=0;
            while(field=mysql_fetch_field(result)){  //这里怎么就执行了两次呢?我不明白为什么只读取了两个字段,谁知道请留言
              printf(“%s\t”,field->name);
              counter++;
              if(field->flags&BINARY_FLAG){
                blobflag=counter;
              }
            }
            printf(“\n”);
            while((row=mysql_fetch_row(result))){   //取出结果集中记录
             int i=0;
             for(i=0;i<numField;i++){
               if(i!=blobflag-1){
                 fprintf(stdout,”%s\t”,row[i]);  //取出字段的值
               }else{
                 fprintf(stdout,”%s\t”,”[二进制数据]“);  //取出字段的值
               }
             }
             printf(“\n”);
            }
          }else{
            printf(“\n没有一行记录被发现\n”);
          }
          mysql_free_result(result);    //释放结果集
        }
      }
      mysql_close(&mysql);          //释放连接
      return 0;
    }

     

  7. hiroki 说:

    多谢楼主啊

留下一个回复