自己写的两个例子
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
#include
#include
#include
#include
#include
#include
#include
#include
#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
#include
#include
#include
#include
#include
#include
#include
#include
#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;
}