mysql statement

本文详细阐述了SQL预处理机制如何提高服务器响应速度并减少网络通信量,通过预处理语句减少服务器负荷,实现高效数据查询。介绍了预处理机制的特点、数据类型以及执行流程,包括初始化、绑定参数、执行查询等关键步骤。并通过代码示例展示了如何使用MySQL函数进行预处理操作,以提升查询效率。

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

 

A:select  *  from tablename

B:select *   from tablename

服务器一般处理方式:

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

 

服务器采取预处理机制

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

 

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 *)释放

int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, unsigned long length)

    给定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()用于将结果集中的列与数据缓冲和长度缓冲关联(绑定)起来

int mysql_stmt_execute(MYSQL_STMT *stmt)

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

int mysql_stmt_store_result(MYSQL_STMT *stmt)

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

int mysql_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语句绑定 int mysql_stmt_prepare(MYSQL_STMT * st,char* sql,int length);

 

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

 

4. mysql语句的参数

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

   给参数赋值

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

  

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

   对参数操作

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

   int id;

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

 

   para[1].buffer_type=MYSQL_TYPE_STRING

   char str[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);



#include <stdio.h>
#include <windows.h>
#include "mysql.h" 
#include <string.h>
#include "winsock.h" 
#define STRING_SIZE 50
int main(void)
{
MYSQL *conn = mysql_init(NULL);     //初始化服务器句柄
/*登陆服务器*/
if(!mysql_real_connect(conn, "192.168.9.171", "root", "root", "fanren2_2.0.6.5", 0, NULL, 0))  
{
fprintf(stderr, "mysql_real_connect: %s\n", mysql_error(conn));
return -1;
}


char * query = "set names \'GBK\'";
mysql_real_query(conn,query,strlen(query));


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


query = "select player_id,name from t_player where player_id > ?;";
if(mysql_stmt_prepare(stmt, query, strlen(query)))
{
fprintf(stderr, "mysql_stmt_prepare: %s\n", mysql_error(conn));
return -1;
}


int           int_data;
int           row_count = 0;
char          str_data[STRING_SIZE];
int id; char name[20];
printf("id name: ");
scanf("%d", &id);


MYSQL_BIND params[1];
MYSQL_BIND    bind[2];
my_bool       is_null[2];
my_bool       error[2];
unsigned long length[2];
memset(params, 0, sizeof(params));
params[0].buffer_type = MYSQL_TYPE_LONG;
params[0].buffer = &id;




mysql_stmt_bind_param(stmt, params);

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


//while(mysql_stmt_fetch(stmt) == 0) //返回结果集中的下一行
// printf("%d\n", id);


int rows = mysql_stmt_num_rows(stmt);
printf("rows %d\n",rows);


int param_count= mysql_stmt_param_count(stmt);
fprintf(stdout, " total parameters in SELECT: %d\n", param_count);


MYSQL_RES*  prepare_meta_result = mysql_stmt_result_metadata(stmt);
if (!prepare_meta_result)
{
fprintf(stderr,
" mysql_stmt_result_metadata(), \
returned no meta information\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}


/* Get total columns in the query */
int column_count= mysql_num_fields(prepare_meta_result);
fprintf(stdout,
" total columns in SELECT statement: %d\n",
column_count);




/* INTEGER COLUMN */
bind[0].buffer_type= MYSQL_TYPE_LONG;
bind[0].buffer= (char *)&int_data;
bind[0].is_null= &is_null[0];
bind[0].length= &length[0];
bind[0].error= &error[0];


/* STRING COLUMN */
bind[1].buffer_type= MYSQL_TYPE_STRING;
bind[1].buffer= (char *)str_data;
bind[1].buffer_length= STRING_SIZE;
bind[1].is_null= &is_null[1];
bind[1].length= &length[1];
bind[1].error= &error[1];


mysql_stmt_bind_result(stmt, bind);
mysql_stmt_store_result(stmt);




while (!mysql_stmt_fetch(stmt))
{
row_count++;
fprintf(stdout, "  row %d\n", row_count);


/* column 1 */
fprintf(stdout, "   column1 (integer)  : ");
if (is_null[0])
fprintf(stdout, " NULL\n");
else
fprintf(stdout, " %d(%ld)\n", int_data, length[0]);


/* column 2 */
fprintf(stdout, "   column2 (string)   : ");
if (is_null[1])
fprintf(stdout, " NULL\n");
else
fprintf(stdout, " %s(%ld)\n", str_data, length[1]);


fprintf(stdout, "\n");
}


mysql_stmt_close(stmt);             
mysql_close(conn);
system("PAUSE");


return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值