c语言操作mysql基础

相关函数定义在mysql.h头文件中
MYSQL *     STDCALL mysql_init(MYSQL *mysql);
//mysql初始化原型 参数mysql句柄 返回初始化的句柄


MYSQL *     STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
                       const char *user,
                       const char *passwd,
                       const char *db,
                       unsigned int port,
                       const char *unix_socket,
                       unsigned long clientflag);
//mysql创建连接原型后两个参数一般为NULL和0;连接成功返回非0(mysql * 句柄);失败返回NULL。


void mysql_close(MYSQL *mysql);//关闭与mysql服务的连接,释放内存;


-----------------------------------------------------------------------------------------
int mysql_query(MYSQL *mysql,const char *query);
//对指定的连接进行查询,成功返回0,出错返回非0。query为传入的mysql语句 
int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
//只能查询单个语句,包含二进制的数据(可能包含\0字符),只能用这个查询,成功返回0,出错返回非0。
mysql_query() cannot be used for statements that contain binary data; you must use mysql_real_query() instead. (Binary data may contain the “\0” character, which mysql_query() interprets as the end of the statement string.) In addition, mysql_real_query() is faster than mysql_query() because it does not call strlen() on the statement string.  
mysql_query()不能用于语句包含二进制数据,你必须使用mysql_real_query()代替。 (二进制数据可能包含“\ 0”的性质,这mysql_query()作为字符串结束的声明解释。)此外,mysql_real_query()比快mysql_query(),因为它不调用strlen()来对语句查询字符串。
-----------------------------------------------------------------------------------------


MYSQL_RES *mysql_store_result(MYSQL *mysql);
//从select语句或者其他返回数据的语句中检索所有数据,在mysql_query后调用这个函数,在结果中集中存储数据(将检索的服务器中的数据存储到客户机中),成功返回(结果集结构)的指针,失败返回NULL;


my_ulonglong mysql_num_rows(MYSQL_RES *result);
//它从mysql_store_result取得返回的结果结构,并且在该结果集中返回行数,行数可能为0如果mysql_store_result成功,则mysql_num_rows可以成功返回表的行数。


MYSQL_RES *mysql_use_result(MYSQL *mysql);
//为无缓冲的结果集获得结果标识符,错误返回NULL;要按需要逐行检索数据,而不是立即获取全部数据并将它存储在客户机中,与mysql_store_result区别是实际上没有将任何数据检索到结果集,只是初始化结果集以准备好检索数据。


MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
//(先获取结果集结构)检索一个结果集合单一行,如果没有更多的行可检索或如果出现一个错误,NULL;


void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);
//(先获取结果集结构)offset 是行号(它必须在从0到结果集中的行数减1的范围内),传递1将导致在下一次调用mysql_fetch_row时返回第2行。


MYSQL_ROW_OFFEST mysql_row_tell(MYSQL_RES *result);
//这个函数返回一个偏移值,它表示结果集中的当前位置。它不是行号,不能将它用于mysql_data_seek,可以用于下边的函数


MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);
//它移动结果集中的当前位置,并返回以前的位置。


unsigned int mysql_num_fields(MYSQL_RES *res);
//返回指定结果集中列的数量,结果集合中字段数量的一个无符号整数


void mysql_free_result(MYSQL_RES *result);
//完成结果集时,必须总是调用这个函数,以允许MySQL库整理分配给它的对象。


int mysql_create_db(MYSQL *mysql,const char *db);
//创建一个数据库 成功返回0 失败非0 。。。


int mysql_select_db(MYSQL *mysql,const char *db);

//选择一个数据库 成功返回0 失败非0 。。。

#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stddef.h>
#include"mysql.h"

char *timm(char *str)
{
	time_t timer;//time_t就是long int 类型
  struct tm *tb;
  timer=time(NULL);
  tb =localtime(&timer);
  sprintf(str,"%s\n",asctime(tb));
	return str;
}

void print(char *buff)
{
	FILE *fp=NULL;
	char filename[36]={0};
	char str[64]={0};
	char *str1=str;
	timm(str1);
	sprintf(filename,"/home/zxd/%s.log",str1);
	fp=fopen(filename,"w");
	fputs(str1,fp);
	fputs(buff,fp);
	fflush(fp);
	return;	
}

int main()
{
MYSQL sql;//mysql句柄定义
int ret;//保存函数返回值
char buff[64];

mysql_init(&(sql));//初始化mysql

if(mysql_real_connect((&sql),"192.168.1.96","root","capnet","zxd",4417,NULL,0))
{
	printf("connect sucess!\n");
}
else{
	fprintf(stderr,"connect failed!\n");
	if(mysql_errno(&sql)) {//错误信息显示到终端或者保存到日志
		fprintf(stderr,"connect failed: %d,%s\n",mysql_errno(&sql),mysql_error(&sql));
		//sprintf(buff,"%s",mysql_error(&sql));
		//print(buff);
		return -1;
	}
}

ret=mysql_query(&sql,"insert into ss values(8,'txt',8)");//插入一组数据
if(!ret)
printf("insert sucess!\n");
else
printf("insert bad!\n");

char *sqll="delete from ss where id=8";
ret= mysql_real_query(&sql,sqll,strlen(sqll));//删除一组数据
if(!ret)
printf("delete sucess!\n");
else
printf("delete bad!\n");

MYSQL_ROW row;
MYSQL_RES *res;
MYSQL_FIELD *fields;
int t;
my_ulonglong mm;

char *allData = "select * from ss";
res = mysql_real_query(&sql, allData, (unsigned int)strlen(allData));//选择我的数据表ss
if(!ret)
printf("select sucess!\n");
else
printf("select bad!\n"); 

res = mysql_store_result(&sql); //从服务器上获取我的数据表ss的结果结构集到本地
//res = mysql_use_result(&sql);
if(res)
printf("get data from server sucess!\n");
else
printf("get data from server bad!\n"); 

mm=mysql_num_rows(res);//从结果结构集中得到数据表的行数
printf("table long:%d\n",mm);

mysql_data_seek(res,1);//设置偏移量为1 则MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)从结构集合集的第2行开始检索
int my;
my=mysql_num_fields(res);//获取数据表的列数
/*----------------------------------------------------------------------------
//MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)作用是返回结果集中代表字段(列)的对象的数组(所有MYSQL_FIELD 结构的一个数组。)
//MYSQL_FIELD *mysql_fetch_field (MYSQL_RES *result)作用是返回作为一个MYSQL_FIELD 结构的一个结果集合的一个列的定义,需重复调用
fields = mysql_fetch_fields(res);
int ii=0;
for(ii=0;ii<my;ii++)//数据表的列数
{
	printf("%s\t", fields[ii].name);
}
printf("\n");//调用一次和循环调用区别
--------------------------------------------------------------------------------*/
int ii=0;
for(ii=0;ii<my;ii++)//数据表的列数
{
	if(( fields= mysql_fetch_field(res)) !=NULL)
	printf("%s\t", fields->name);
}
printf("\n");

while(row=mysql_fetch_row(res))//从结果结构集中检索一行,再次调用跳到下一行知道没有数据为止。
{
	for(t=0; t<mysql_num_fields(res); t++)
  {
	  printf("%s\t",row[t]);
	}
	 printf("\n");//换行符--按表打印出来-方便查看
}

mysql_free_result(res);					 
mysql_close(&sql);//关闭与服务器的连接,释放内存;
								       

return 0;

}
编译:gcc 1.c -o a -ldl -L/usr/libmysqld/lib -lmysqlclient_r -I/usr/libmysqld/include

猜你喜欢

转载自blog.csdn.net/linuxzhuxiaodi/article/details/78203869