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:
例2:
例3:
原文住所:http://blog.chinaunix.net/uid-24219701-id-1745030.html
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