文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C 访问Mysql数据库函数总结

C 访问Mysql数据库函数总结

时间:2010-05-02  来源:ubuntuer

                                                                      自己写的两个例子

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_options(*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[200];
//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:查询
////////设置查询语句.
//其中:
//"DedxCalConst",是表的名字;
//"ser_no",是表中数据类型为int型的列;
//"resolcalib",是该表中数据类型为longblob的一列;
strcpy(query,"SELECT ser_no FROM DedxCalConst");
/////////执行查询
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[0]);
}

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

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

        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_options(*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[0].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[300];

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

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

//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;

////////设置查询语句.
//其中:
//"DedxCalConst",是表的名字;
//"ser_no",是表中数据类型为int型的列;
//"resolcalib",是该表中数据类型为longblob的一列;
        strcpy(query,"SELECT ser_no,wiregcalib FROM DedxCalConst 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[0],MYSQL_TYPE_LONG,(char *)&data_int,&data_size[0],&is_null[0],4);
        Stmt_Set_Bind(&bind[1],MYSQL_TYPE_LONG_BLOB,&bb[0],&data_size[1],&is_null[1],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[1])
   {
    printf("NULL\n");
   }
   else
   {
    for(i=0;i<19;i++)
    {
     printf("%x-",(unsigned char)bb[i]);
    }
           printf("%x\n",(unsigned char)bb[19]);
        }
        }
//////////////////////////////////////////////////////////////////////////////////////

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

        return 0;
}

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载