数据库操作-进阶-C语言访问数据库

本篇介绍C语言访问数据库

c语言操作mysql数据库
数据库引擎:即语言接口
ODBC 是windows内的数据库接入口。所有程序可以通过ODBC来连接数据库
JDBC 是JAVA的数据库接口

  每一种数据库,在linux中都提供了函数库,是数据库操作的接口
  sqlite
  mysql
  
  rpm -ivh /root/Desktop/mysql-devel-5.0.22-2.1.i386.rpm 

操作中需要用到mysql中定义的三个结构
MYSQL //数据库句柄 相当于FILE
MYSQL_RES //数据的结果集 select查询的结果
MYSQL_ROW //数据行 每次在结果集中读取一行数据

操作mysql需要以下API
#include <mysql/mysql.h>

 MYSQL *mysql_init(MYSQL *);
 //这里称之为载入函数吧,返回的MYSQL指针要用到后续的函数中 参数通常设为NULL 返回MYSQL地址
 
 int mysql_options(MYSQL *connection, enum option_to_set,const char *argument);
 //设置MYSQL*的一些属性,比如超时时间等
 
 MYSQL *mysql_real_connect(MYSQL *connection,
                 const char *server_host,  //域名   本地
                 const char *sql_user_name,//用户名 root
                 const char *sql_password, //密码   123456
                 const char *db_name,      //数据库名
                 unsigned int port_number,//置0连接默认端口,一般为3306
                 const char *unix_socket_name,//NULL
                 unsigned int flags);//无另外属性时置0
 //连接函数
 
 void mysql_close(MYSQL *connection);
 //关闭连接
 
 unsigned int mysql_errno(MYSQL *connection);
 //返回错误代码
 
 char *mysql_error(MYSQL *connection);     
 //返回错误信息
 
 int mysql_query(MYSQL *connection, const char *query);
 //执行sql语句
 
 my_ulonglong mysql_affected_rows(MYSQL *connection);
 //返回执行语句过后受影响的行数
 
 MYSQL_RES *mysql_store_result(MYSQL *connection);
 //返回执行结果,适用于数据量较小时
 
 my_ulonglong mysql_num_rows(MYSQL_RES *result);
 //返回上面函数返回结果的行数
 
 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
 //抽取一条记录,返回NULL时表示抽取完记录或者错误
 
 void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);
 //调整数据位置,offset为0时,下次调用mysql_fetch_row将返回result第一条记录
 
 MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);
 //返回当前的位置
 
 MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);
 //移动数据位置,并返回先前的位置,可以和上一个函数结合使用
 
 void mysql_free_result(MYSQL_RES *result);
 //释放result空间
 
 MYSQL_RES *mysql_use_result(MYSQL *connection);
 //返回执行结果,适用于数据量较大时
 
 unsigned int mysql_field_count(MYSQL *connection);
 //返回查询结果中的列数(column数)
 
 MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
 //获得查询结果中的列名等信息(表头信息)


 
 char **row
 

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <mysql/mysql.h>
//头文件 libdb.h
extern int mydb_init(char* host,char* user,char*ps,char* dbname);
extern int mydb_exit();
extern int mydb_query(char* sql);
extern char** mydb_result(char* sql,int* rows,int* clos);

//源码  libdb.c
static MYSQL *pdb;
static MYSQL_RES *res; //查询结果 
static int row,col;    //查询到的数据的行和列
static char** result;
static void mydb_freeitem(){
    int i;
    for(i=0;i<row*col;i++) free(result[i]);
}

int mydb_init(char* host,char* user,char*pw,char* dbname){
    //1.创建MYSQL
    pdb=mysql_init(NULL);
    if (pdb==NULL) goto INITERR;
    //2.连接数据库
    MYSQL *tmp_pdb;
    tmp_pdb=mysql_real_connect(pdb,host,user,pw,dbname,3306,NULL,0);
    if (tmp_pdb==NULL) goto CONNECTERR;
    return 0;
CONNECTERR:
    mysql_close(pdb);
INITERR:
    printf("---- err=%s\n",strerror(errno));
    return -1;
}

int mydb_exit(){
    //1.中途申请的内存释放
    if (result!=NULL){
       mydb_freeitem();//释放每一子项,即每一个字符串内存
       free(result);   //释放指针数组
    }
    //2.释放MYSQL
    mysql_close(pdb);
    return 0;
}

int mydb_query(char* sql){
    //执行sql
    int err=mysql_query(pdb,sql); //err是函数是否执行,而不是代表sql是否成功
    //判断sql是否出错
    unsigned int no= mysql_errno(pdb); //获取错误号
    if (no!=0){ //0代表成功,非0代表sql语句执行出错
        printf("--- query err=%s\n",mysql_error(pdb)); //打印错误信息
        return -1;
    }
    return 0;
}
char** mydb_result(char* sql,int* rows,int* cols){
   //执行sql语句
   int err= mydb_query(sql);
   if (err==-1) return NULL;
   //获取执行的结果
   if (res!=NULL) mysql_free_result(res);
   res=mysql_store_result(pdb);
   if (res==NULL) return NULL;
   //获取行数和列数
   *rows=mysql_num_rows(res);
   *cols=mysql_num_fields(res);
   //申请内存
   int i=0,j,n=((*rows)*(*cols));
   if (result==NULL)
      result=malloc(n*4); //申请
   else{
      mydb_freeitem();//释放每一子项,即每一个字符串内存
      result=realloc(result,n*4); //扩展
   }
   row=*rows;
   col=*cols;
   //-------------------------------------------------------------
   MYSQL_ROW rowdb;
   //读取数据
   while(rowdb=mysql_fetch_row(res)){
       for(j=0;j< *cols;j++){
           if (rowdb[j]!=NULL) {
               result[i*(*cols)+j]=(char*)malloc(strlen(rowdb[j])+1);
               strcpy(result[i*(*cols)+j],rowdb[j]);
           }
           else result[i*(*cols)+j]=NULL;
       }
       i++;
   }
   return result;
}

//应用test.c
int main(){
    //准备
    int err= mydb_init("localhost","root","123456","yecy");
    if (err==-1) return -1;

char buf[256];
char sex[5];
int age;
char sql[256];
while(1){
    scanf("%s",buf);
    if (strcmp(buf,"q")==0) break;
    else if (strcmp(buf,"i")==0){
        printf("input name sex age:\n");
        scanf("%s %s %d",buf,sex,&age);
        sprintf(sql,"insert into student(name,sex,age) values('%s','%s',%d)",buf,sex,age);
        printf("-----  %s\n",sql);
        mydb_query(sql);
    }
    else if (strcmp(buf,"d")==0){
        printf("input name:\n");
        scanf("%s",buf);
        sprintf(sql,"delete from student where name like '%s%%'",buf);
        printf("-----  %s\n",sql);
        mydb_query(sql);
    }
    else if (strcmp(buf,"f")==0){
        printf("input name:\n");
        scanf("%s",buf);
        sprintf(sql,"select * from student where name like '%s%%'",buf);
        printf("-----  %s\n",sql);
        int i,rn,cn;
        char** result= mydb_result(sql,&rn,&cn);
        if (result!=NULL){
           for(i=0;i<rn*cn;i++){
              printf("\t%s ",result[i]);
              if (i%cn==cn-1) printf("\n");
           }
        }
    }

}


//消毁
mydb_exit();

}

编译:gcc  -o test test.c `mysql_config --cflags --libs`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行走在软件开发路上的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值