MySQL C言語インタフェース-前処理文

7081 ワード

複数回実行された文の場合、直接実行よりも前処理の実行が速いのは、クエリに対して1回の解析操作のみが実行されるためです.直接実行する場合、文を実行するたびにクエリーが行われます.また、前処理文を実行するたびにパラメータのデータを送信するだけであるため、ネットワーク通信量が減少する
 
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文のパラメータに基づいて決定する(クライアント-->サービス).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
", 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
", 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
", 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
", 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
", 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
", 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
", 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
", id, name); mysql_stmt_close(stmt); mysql_close(conn); return 0; }

原文住所:http://blog.chinaunix.net/uid-24219701-id-1745030.html