MySQL C語言介面-預先處理語句

來源:互聯網
上載者:User

對於多次執行的語句,預先處理執行比直接執行快,主要原因在於,僅對查詢執行一次解析操作。在直接執行的情況下,每次執行語句時,均將進行查詢。此外,由於每次執行預先處理語句時僅需發送參數的資料,從而減少了網路通訊量

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.