amwdnuff 发表于 2010-5-5 15:59

C 访问Mysql数据库函数总结

C 访问Mysql数据库函数总结
                                                                      自己写的两个例子

1、db_mysql_sample1.c

/****************************************************************************
文件名:db_mysql_sample1.c
说明:
    1、这个例子从数据库中读出数据并打印出来(BLOB型数据不可以),该方法将各种数据格式化后以字符串
       的形式保存在MYSQL_ROW中。
    2、函数名表:
    ----------------------------------------------------------------
       函数名                        功能
    ----------------------------------------------------------------
       Connect_Server                连接服务器
       Execute                     执行查询语句,结果存入MYSQL_RES对象中
       Select_Row                  从查询的结果集中取出某一行,格式化为字符串,存入MYSQL_ROW结构中
       Next_Row                      从查询的结果集中取出下一行,格式化为字符串,存入MYSQL_ROW结构中
       Free_result                   释放结果集占用的内存空间
       Mysql_Close                   关闭与数据库的连接,并释放内存
    ------------------------------------------------------------------
    3、一般执行顺序:
       ConnectServer-->Execute-->Select_Row或者Next_Row取结果-->Free_result-->Mysql_Close
      
****************************************************************************/

#include <stdio.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include <sys/wait.h>
#include <mysql.h>
#include <stdlib.h>

#define BUFFER_SIZE 1000000
#define bool int
#define true 1
#define false 0

bool Connect_Server(MYSQL **sql,char *host,char *user,char *passwd,char *dbname)
{
      my_bool b = 0;
      if(!(*sql=mysql_init(NULL)))
      {
                printf("%s\n",mysql_error(*sql));
                return 0;
      }
      mysql_opti**(*sql,MYSQL_REPORT_DATA_TRUNCATION,&b);
      if(!mysql_real_connect(*sql,host,user,passwd,dbname,0,"//home//mysql//mysql.sock",0))
      {
                fprintf(stderr,"%s\n",mysql_error(*sql));
                return 0;
      }
      return 1;// true;
}

bool Execute(MYSQL *mysql,MYSQL_RES **res,char *query,int length)
{
if(length!=0)
{
   if(mysql_real_query(mysql,query,length))
   {
    printf("query error!\n");
    return false;
   }
}
else
{
   if(mysql_query(mysql,query))
   {
    printf("query error!\n");
    return false;
   }
}
*res = mysql_store_result(mysql);
if(!*res)
{
   if(mysql_field_count(mysql)>0)
   {
    printf("store_result error!");
    return false ;
   }

}
return true;
}

bool Select_Row(MYSQL_ROW *row,MYSQL_RES *res,my_ulonglong num_row)
{
if(num_row>mysql_num_rows(res)||num_row<0)
{
   printf("Select row error!");
   return false;
}
mysql_data_seek(res,num_row);
*row=mysql_fetch_row(res);
if(*row==NULL)
{
   printf("fetch_row error!");
   return false;
}
return true;
}

bool Next_Row(MYSQL_ROW *row,MYSQL_RES *res)
{
*row=mysql_fetch_row(res);
if(*row==NULL)
{
   printf("fetch_row error!");
   return false;
}
return true;
}

unsigned long Num_Rows(MYSQL_RES *res)
{
return (unsigned long)mysql_num_rows(res);
}

void Free_result(MYSQL_RES *res)
{
mysql_free_result(res);
}

void Mysql_Close(MYSQL *sql)
{
      mysql_close(sql);
}

int main(void)
{
char query;
//STEP 1:定义变量
///////////定义mysql对象变量
MYSQL *mysql;
MYSQL_RES *res;
MYSQL_ROW row;
/////////////////////////////////////////////////////////////////////////////////////

//STEP 2:连接数据库
//其中:
//"202.122.33.53",是服务器地址;
//"guest"和"guestpass",分别是用户名和密码;
//"offlinedb",是服务器中数据库的名字
if(!Connect_Server(&mysql,"202.122.33.53","guest","guestpass","offlinedb"))
{
   return 0;
}

//////////////////////////////////////////////////////////////////////////////////////
      
//STEP 3:查询
////////设置查询语句.
//其中:
//"DedxCalC**t",是表的名字;
//"ser_no",是表中数据类型为int型的列;
//"resolcalib",是该表中数据类型为longblob的一列;
strcpy(query,"SELECT ser_no FROM DedxCalC**t");
/////////执行查询
if(!Execute(mysql,&res,query,0))
{
   return 0;
}
///////////////////////////////////////////////////////////////////////////////////////

//STEP 4:逐行取得查询结果,并将其打印出来      
printf("%d rows in result.\n",Num_Rows(res));

if(Select_Row(&row,res,100))
{
   printf("num 100 row:ser_no=%s\n",row);
}

getchar();
printf("\nGo on search in result...\n");

while(Next_Row(&row,res))
{
   printf("ser_no=%s\n",row);
}

      Free_Result(res);
////////////////////////////////////////////////////////////////////////////////////////

//STEP 5:断开连接
Mysql_Close(mysql);
}

2、db_mysql_sample2.c

/****************************************************************************
文件名:db_mysql_sample2.c
说明:
    1、这些以Stmt开头的函数,可以将数据库中数据项存入一定类型的变量中,这些变量的类型应该与数据库中数据项类型相匹配,
       但是,操作有点麻烦。如果仅仅是想把数据打印出来(BLOB型数据不可以),则参见db_mysql_sample1.c,不需用这些函数。
    2、函数相关说明,参见word文档;
    3、函数名表:
    ----------------------------------------------------------------
       函数名                        功能
    ----------------------------------------------------------------
       ConnectServer               连接服务器
       Stmt_Init                     初始化Stmt
       Stmt_Prepare_Search         绑定您的查询语句
       Stmt_Execute                  执行查询
       Stmt_Set_Bind               设置您用来接收查询结果的变量
       Stmt_Bind_Result            变量与结果集连接
       Stmt_Data_Fetch               指定某一行写入指定变量
       Stmt_Data_Fetch_Next          将结果集内的下一行写入变量
       Stmt_Num_Rows               返回结果集中有多少行
    ------------------------------------------------------------------
    4、一般执行顺序:
       ConnectServer-->Stmt_Init-->Stmt_Execute-->Stmt_Set_Bind-->
       Stmt_Bind_Result-->Stmt_Data_Fetch或Stmt_Data_Fetch_Next
      
****************************************************************************/
#include <stdio.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include <sys/wait.h>
#include <mysql.h>
#include <stdlib.h>

#define BUFFER_SIZE 1000000
#define bool int
#define true 1
#define false 0
bool ConnectServer(MYSQL **sql,char *host,char *user,char *passwd,char *dbname)
{
      my_bool b = 0;
      if(!(*sql=mysql_init(NULL)))
      {
                printf("%s\n",mysql_error(*sql));
                return 0;
      }
      mysql_opti**(*sql,MYSQL_REPORT_DATA_TRUNCATION,&b);
      if(!mysql_real_connect(*sql,host,user,passwd,dbname,0,"//home//mysql//mysql.sock",0))
      {
                fprintf(stderr,"%s\n",mysql_error(*sql));
                return 0;
      }
      return 1;// true;
}
bool Stmt_Init(MYSQL *sql,MYSQL_STMT **stmt)
{
      *stmt = mysql_stmt_init(sql);
      if(!(*stmt))
      {
                printf("stmt_init() error!\n%s",mysql_stmt_error(*stmt));
                return false;
      }
      if(!(*stmt))
      {
                printf("stmt_init() error!\n%s",mysql_stmt_error(*stmt));
                return false;
      }
      return true;
}
bool Stmt_Prepare_Search(MYSQL *sql,MYSQL_STMT **stmt,char *query)
{
      unsigned count;
      MYSQL_RES *res;
      if(sql==NULL)
      {
                printf("Must connect server first!!");
                return false;
      }

      if(mysql_stmt_prepare(*stmt,query,strlen(query)))
      {
                printf("stmt_perpare()!\n");
                printf("%s\n",query);
                return false;
      }

      ///Get parameter count
      count=mysql_stmt_param_count(*stmt);
      if(count!=0)
      {
                printf("parameter count error!");
                return false;
      }

      //Get MYSQL_RES
      res = mysql_stmt_result_metadata(*stmt);
      if(!res)
      {
                printf("Get MYSQL_RES error!");
                return false;
      }

      //Column in result
      //column_count = mysql_num_fields(res);
      //printf("res column = %d\n",column_count);
      return true;
}
bool Stmt_Execute(MYSQL_STMT *stmt)
{
      if(mysql_stmt_execute(stmt))
      {
                printf("Excecute()!");
                return false ;
      }
      else return true ;
}

void Stmt_Set_Bind(MYSQL_BIND *bind,enum enum_field_types ft,char *buffer,unsigned long *length,\
                        my_bool *is_null,unsigned long buffer_length)
{
memset(bind,0,sizeof(bind));
      bind->buffer_type = ft;
      bind->buffer = buffer;
      bind->is_null = is_null;
      bind->length = length;
      if(buffer_length!=0)
      {
                bind.buffer_length = buffer_length;
      }
}

bool Stmt_Bind_Result(MYSQL_STMT *stmt,MYSQL_BIND *bind)
{
      if(mysql_stmt_bind_result(stmt,bind))
      {
                printf("bind_result() !");
                return false;
      }
      if(mysql_stmt_store_result(stmt))
      {
                printf("store_reslut() !");
                return false;
      }
      return true;
}
bool Stmt_Data_Fetch(MYSQL_STMT *stmt,my_ulonglong row)
{
      mysql_stmt_data_seek(stmt,row);
      if(mysql_stmt_fetch(stmt))
      {
                return false ;
      }
      return true;
}

bool Stmt_Data_Fetch_Next(MYSQL_STMT *stmt)
{
      if(mysql_stmt_fetch(stmt))
      {
                return false ;
      }
      return true;
}

unsigned long Stmt_Num_Rows(MYSQL_STMT * stmt)
{
      return mysql_stmt_num_rows(stmt);
}

void Stmt_Close(MYSQL_STMT *stmt)
{
      mysql_stmt_close(stmt);
}

void Mysql_Close(MYSQL *sql)
{
      mysql_close(sql);
}

int main(void)
{
      char query;

//STEP 1:定义变量
///////////定义mysql对象变量
MYSQL *mysql;
MYSQL_STMT *stmt;
MYSQL_BIND bind;

///////////保存读出数据项的变量
//其中:                                             
//data_size将返回数据项长度,单位是字节;         
//bb,用来保存返回的longblob数据;                     
//data_int,用来保存返回的int型数据;               
//is_null,说明数据项是否为空。                     
unsigned long data_size;               
char bb;                  
int data_int;                              
char str;                              
my_bool is_null;                           
/////////////////////////////////////////////////////////////////////////////////////

//STEP 2:连接数据库
//其中:
//"202.122.33.53",是服务器地址;
//"guest"和"guestpass",分别是用户名和密码;
//"offlinedb",是服务器中数据库的名字
      if(!ConnectServer(&mysql,"202.122.33.53","guest","guestpass","offlinedb"))
       {
                return 0;
      }
//////////////////////////////////////////////////////////////////////////////////////
      
//STEP 3:查询
////////初始化stmt对象
      if(!Stmt_Init(mysql,&stmt)) return 0;

////////设置查询语句.
//其中:
//"DedxCalC**t",是表的名字;
//"ser_no",是表中数据类型为int型的列;
//"resolcalib",是该表中数据类型为longblob的一列;
      strcpy(query,"SELECT ser_no,wiregcalib FROM DedxCalC**t WHERE ser_no=100");

/////////绑定查询语句和stmt对象
      if(!Stmt_Prepare_Search(mysql,&stmt,query)) return 0;

/////////执行查询
      if(!Stmt_Execute(stmt)) return 0;
///////////////////////////////////////////////////////////////////////////////////////


//STEP 4:将查询结果存入指定变量(数据类型要一致)
/////////设置MYSQL_BIND的结构体
      Stmt_Set_Bind(&bind,MYSQL_TYPE_LONG,(char *)&data_int,&data_size,&is_null,4);
      Stmt_Set_Bind(&bind,MYSQL_TYPE_LONG_BLOB,&bb,&data_size,&is_null,BUFFER_SIZE);

/////////将设置好的MYSQL_BIND结构体和这次查询连接起来
      if(!Stmt_Bind_Result(stmt,bind)) return 0;

////////逐行取得查询结果,并将其打印出来      
      while(Stmt_Data_Fetch_Next(stmt))
      {
   int i;
      printf("ser_no=%d\t",data_int);
   printf("wiregcalib(show 20bytes in hex format)=");
   if(is_null)
   {
    printf("NULL\n");
   }
   else
   {
    for(i=0;i<19;i++)
    {
   printf("%x-",(unsigned char)bb);
    }
         printf("%x\n",(unsigned char)bb);
      }
      }
//////////////////////////////////////////////////////////////////////////////////////

//STEP 5:关闭对象
Stmt_Close(stmt);
Mysql_Close(mysql);
//////////////////////////////////////////////////////////////////////////////////////

      return 0;
}

wj65321545 发表于 2010-5-7 22:42

头晕!佩服楼主,你晕不晕呀!

hndf 发表于 2010-5-9 21:40

哎,看不懂

py1181 发表于 2010-5-9 23:47

支持原创帖!
页: [1]
查看完整版本: C 访问Mysql数据库函数总结