c mysql预处理_MySQL C语言接口-预处理语句

对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量

A:select*from tablename

B:select*from tablename

服务器一般处理方式:

A--->S--->AB--->S--->B

服务器采取预处理机制

A--->S--->AS--->B减少一次解释执行

A:select*from tablename where id=?

B:select*from tablename where name=?

预处理机制特点:

1.减少服务器负荷

2.提高服务器响应的速度

3.可以提供参数机制,让客户有更多查询方法

预处理机制数据类型

MYSQL_STMT该结构表示预处理语句

MYSQL_BIND该结构用于语句输入(发送给服务器的数据值)和输出(从服务器返回的结果值)

1.从客户传送数据到服务器

2.从服务器传输数据到客户

函数:

MYSQL_STMT*mysql_stmt_init(MYSQL*mysql)

创建MYSQL_STMT句柄。对于该句柄,应使用mysql_stmt_close(MYSQL_STMT*)释放

intmysql_stmt_prepare(MYSQL_STMT*stmt,constchar*query,unsignedlonglength)

给定mysql_stmt_init()返回的语句句柄,准备字符串查询指向的SQL语句,并返回状态值。字符串长度应由“length”参量给出

my_bool mysql_stmt_bind_param(MYSQL_STMT*stmt,MYSQL_BIND*bind)

用于为SQL语句中的参数标记符绑定数据

my_bool mysql_stmt_bind_result(MYSQL_STMT*stmt,MYSQL_BIND*bind)

mysql_stmt_bind_result()用于将结果集中的列与数据缓冲和长度缓冲关联(绑定)起来

intmysql_stmt_execute(MYSQL_STMT*stmt)

mysql_stmt_execute()执行与语句句柄相关的预处理查询

intmysql_stmt_store_result(MYSQL_STMT*stmt)

以便后续的mysql_stmt_fetch()调用能返回缓冲数据

intmysql_stmt_fetch(MYSQL_STMT*stmt)

mysql_stmt_fetch()返回结果集中的下一行

my_bool mysql_stmt_close(MYSQL_STMT*)

关闭预处理语句

预处理机制步骤:

1.MYSQL_STMT*st;

2.对处理的数据类型初始化MYSQL_STMT*mysql_stmt_init(MYSQL*)st=mysql_stmt_init(MYSQL*);

3.将预处理句柄与具体sql语句绑定intmysql_stmt_prepare(MYSQL_STMT*st,char*sql,intlength);

mysql_stmt_prepare(st,sql,strlen(str));

4.mysql语句的参数

select*from tablename where id=?and name=?

给参数赋值

MYSQL_BINDpara[n]//1.n根据语句中参数确定(客户-->服务)2.n根据语句中的字段数确定(服务-->客户)

memset(para,0,sizeof(para));

对参数操作

para[0].buffer_type=MYSQL_TYPE_LONG//设置参数的数据类型

intid;

para[0].buffer=&id;//参数传值

para[1].buffer_type=MYSQL_TYPE_STRING

charstr[20];

para[1].buffer_length=sizeof(str);

para[1].buffer=str;

预处理与参数绑定mysql_stmt_bind_param(st,para);

执行mysql_stmt_execute(st);

释放预处理机制所占的空间mysql_stmt_close(MYSQL_STMT*)mysql_stmt_close(st);

示例1:

/*

*客户端到服务端

*/

#include

#include

#include

intmain(void)

{

MYSQL*conn=mysql_init(NULL);//初始化服务器句柄

/*登陆服务器*/

if(!mysql_real_connect(conn,"localhost","root","","test",0,NULL,0))

{

fprintf(stderr,"mysql_real_connect: %s\n",mysql_error(conn));

return-1;

}

MYSQL_STMT*stmt=mysql_stmt_init(conn);//创建MYSQL_STMT句柄

char*query="insert into stu values(?, ?);";

if(mysql_stmt_prepare(stmt,query,strlen(query)))

{

fprintf(stderr,"mysql_stmt_prepare: %s\n",mysql_error(conn));

return-1;

}

intid;charname[20];

printf("id name: ");

scanf("%d %s",&id,name);

MYSQL_BIND params[2];

memset(params,0,sizeof(params));

params[0].buffer_type=MYSQL_TYPE_LONG;

params[0].buffer=&id;

params[1].buffer_type=MYSQL_TYPE_STRING;

params[1].buffer=name;

params[1].buffer_length=strlen(name);

mysql_stmt_bind_param(stmt,params);

mysql_stmt_execute(stmt);//执行与语句句柄相关的预处理

mysql_stmt_close(stmt);

mysql_close(conn);

return0;

}

示例2:

/*

*服务端到客户端

*/

#include

#include

#include

intmain(void)

{

MYSQL*conn=mysql_init(NULL);//初始化服务器句柄

/*登陆服务器*/

if(!mysql_real_connect(conn,"localhost","root","","test",0,NULL,0))

{

fprintf(stderr,"mysql_real_connect: %s\n",mysql_error(conn));

return-1;

}

MYSQL_STMT*stmt=mysql_stmt_init(conn);//创建MYSQL_STMT句柄

char*query="select * from stu;";

if(mysql_stmt_prepare(stmt,query,strlen(query)))

{

fprintf(stderr,"mysql_stmt_prepare: %s\n",mysql_error(conn));

return-1;

}

intid;charname[20];

//printf("id name: ");

//scanf("%d %s", &id, name);

MYSQL_BIND params[2];

memset(params,0,sizeof(params));

params[0].buffer_type=MYSQL_TYPE_LONG;

params[0].buffer=&id;

params[1].buffer_type=MYSQL_TYPE_STRING;

params[1].buffer=name;

params[1].buffer_length=sizeof(name);

//mysql_stmt_bind_param(stmt, params);

mysql_stmt_bind_result(stmt,params);//用于将结果集中的列与数据缓冲和长度缓冲关联(绑定)起来

mysql_stmt_execute(stmt);//执行与语句句柄相关的预处理

mysql_stmt_store_result(stmt);//以便后续的mysql_stmt_fetch()调用能返回缓冲数据

while(mysql_stmt_fetch(stmt)==0)//返回结果集中的下一行

printf("%d\t%s\n",id,name);

mysql_stmt_close(stmt);

mysql_close(conn);

return0;

}

示例3:

/*

*客户端到服务端,再到客户端

*/

#include

#include

#include

intmain(void)

{

MYSQL*conn=mysql_init(NULL);//初始化服务器句柄

/*登陆服务器*/

if(!mysql_real_connect(conn,"localhost","root","","test",0,NULL,0))

{

fprintf(stderr,"mysql_real_connect: %s\n",mysql_error(conn));

return-1;

}

MYSQL_STMT*stmt=mysql_stmt_init(conn);//创建MYSQL_STMT句柄

char*query="select * from stu where id=?;";

if(mysql_stmt_prepare(stmt,query,strlen(query)))

{

fprintf(stderr,"mysql_stmt_prepare: %s\n",mysql_error(conn));

return-1;

}

intid;charname[20];

printf("id: ");

scanf("%d",&id);

MYSQL_BIND params[2];

memset(params,0,sizeof(params));

params[0].buffer_type=MYSQL_TYPE_LONG;

params[0].buffer=&id;

params[1].buffer_type=MYSQL_TYPE_STRING;

params[1].buffer=name;

params[1].buffer_length=sizeof(name);

mysql_stmt_bind_param(stmt,params);

mysql_stmt_bind_result(stmt,params);//用于将结果集中的列与数据缓冲和长度缓冲关联(绑定)起来

mysql_stmt_execute(stmt);//执行与语句句柄相关的预处理

mysql_stmt_store_result(stmt);//以便后续的mysql_stmt_fetch()调用能返回缓冲数据

while(mysql_stmt_fetch(stmt)==0)//返回结果集中的下一行

printf("%d\t%s\n",id,name);

mysql_stmt_close(stmt);

mysql_close(conn);

return0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值