對於多次執行的語句,預先處理執行比直接執行快,主要原因在於,僅對查詢執行一次解析操作。在直接執行的情況下,每次執行語句時,均將進行查詢。此外,由於每次執行預先處理語句時僅需發送參數的資料,從而減少了網路通訊量
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,intlength);
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;}
原文地址:http://blog.chinaunix.net/uid-24219701-id-1745030.html