MySQL C语言接口-预处理语句
2015-05-07 17:42
357 查看
MySQL C语言接口-预处理语句
对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量
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 <stdio.h>
#include <mysql.h>
#include <string.h>
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 <stdio.h>
#include <mysql.h>
#include <string.h>
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 <stdio.h>
#include <mysql.h>
#include <string.h>
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;
}
对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量
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 <stdio.h>
#include <mysql.h>
#include <string.h>
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 <stdio.h>
#include <mysql.h>
#include <string.h>
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 <stdio.h>
#include <mysql.h>
#include <string.h>
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;
}
相关文章推荐
- MySQL C语言接口-预处理语句
- 利用mysql提供的c语言接口操作数据库
- PHP MySQL 预处理语句
- MySQL 预处理语句prepare、execute、deallocate的使用
- mysql之预处理语句prepare、execute、deallocate
- 012_C语言预处理命令及自定义接口
- PHP MySQL 预处理语句
- MySQL中预处理语句prepare、execute与deallocate的使用教程
- 最新_MySQL 的 C API预处理语句
- Linux下C语言执行MySQL语句
- MySQL C语言接口-预处理语句
- SQlite数据库的C编程接口(三) 预处理语句(Prepared Statements)
- MySQL 游标(PREPARE预处理语句)
- php中对MYSQL操作之预处理技术(2)数据库dql查询语句
- Linux下C语言执行MySQL语句
- MYSQL预处理语句
- mysql的C语言的接口基本应用
- 【mysql】-内置函数和预处理语句
- PHP MySQL 预处理语句
- MySQL预处理语句