Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7549802
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: Mysql/postgreSQL

2011-07-19 20:34:13

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

 

A:select  *  from tablename

B:select *   from tablename

服务器一般处理方式:

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

 

服务器采取预处理机制

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

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

 

 

示例1

/*

 * 客户端到服务端

 */

#include

#include

#include

 

int main(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;

    }

 

    int id; char name[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);

   

    return 0;

}

 

示例2

/*

 * 服务端到客户端

 */

#include

#include

#include

 

int main(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;

    }

 

    int id; char name[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);

   

    return 0;

}

 

示例3

/*

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

 */

#include

#include

#include

 

int main(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;

    }

 

    int id; char name[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);

   

    return 0;

}

阅读(16587) | 评论(2) | 转发(3) |
给主人留下些什么吧!~~

linglongzhen2019-07-19 18:37:45

讲得好,帮了我大忙。

linglongzhen2019-07-19 18:37:41

讲得好,帮了我大忙。