mysql c apiの概要

6898 ワード

mysql c apiのいくつかの一般的なパラメータを紹介する前に、対応するデータ構造を学ぶ必要があります.
データ構造
MYSQL
データベースに接続する前に、多くのMysql API関数で使用されるMYSQL変数を作成する必要があります.接続情報などのデータが含まれています.
typedef struct st_mysql {
NET           net;            /* Communication parameters */
gptr          connector_fd;   /* ConnectorFd for SSL */
char          *host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsigned int  port,client_flag,server_capabilities;
unsigned int  protocol_version;
unsigned int  field_count;
unsigned int  server_status;
unsigned long thread_id;      /* Id for connection in server */
my_ulonglong affected_rows;
my_ulonglong insert_id;       /* id if insert on table with NEXTNR */
my_ulonglong extra_info;              /* Used by mysqlshow */
unsigned long packet_length;
enum mysql_status status;
MYSQL_FIELD   *fields;
MEM_ROOT      field_alloc;
my_bool       free_me;        /* If free in mysql_close */
my_bool       reconnect;      /* set to 1 if automatic reconnect */
struct st_mysql_options options;
char          scramble_buff[9];
struct charset_info_st *charset;
unsigned int  server_language;
} MYSQL;

MYSQL_RES
MYSQL_RES構造体には、クエリー結果セット、すなわちデータベースからクエリーされたデータが含まれています.mysql_を使用できますstore_resultまたはmysql_use_result関数を取得します.この構造は戻り行のクエリ(SELECT,SHOW,DESCRIBE,EXPLAIN)の結果を表す.返されるデータを「データセット」といい、CのAPIで対応しているのがMYSQL_RESは、データベースからデータを読み出し、最後にMYSQL_からRESでデータを読み出します.
typedef struct st_mysql_res {
my_ulonglong row_count;
unsigned int  field_count, current_field;
MYSQL_FIELD   *fields;
MYSQL_DATA    *data;
MYSQL_ROWS    *data_cursor;
MEM_ROOT      field_alloc;
MYSQL_ROW     row;            /* If unbuffered read */
MYSQL_ROW     current_row;    /* buffer to current row */
unsigned long *lengths;       /* column lengths of current row */
MYSQL         *handle;        /* for unbuffered reads */
my_bool       eof;            /* Used my mysql_fetch_row */
} MYSQL_RES;

MYSQL_ROW
これは、行データのタイプセキュリティ(type-safe)の表現です.現在、カウントバイトの文字列配列として実装されています.(フィールド値にバイナリデータが含まれる可能性がある場合は、mysql_を呼び出すことで、これらの値を空の終端列と見なすことはできません.fetch_row()を取得します.
typedef char **MYSQL_ROW;

MYSQL_FIELD
MYSQL_FIELDには、フィールド名、フィールドタイプ、サイズなどの情報が含まれています.mysqlを繰り返し呼び出すことができます.fetch_field関数は、すべてのフィールドの情報を取得します.mysql_を繰り返し呼び出すことができます.fetch_Field()は、各列に対してMYSQL_を取得するFIELD構造.フィールド値はこの構造の部分ではありません.MYSQL_に含まれていますROW構造中.
typedef struct st_mysql_field {
char *name;                   /* Name of column */
char *table;                  /* Table of column if column was a field */
char *def;                    /* Default value (set by mysql_list_fields) */
enum enum_field_types type;   /* Type of field. Se mysql_com.h for types */
unsigned int length;          /* Width of column */
unsigned int max_length;      /* Max width of selected set */
unsigned int flags;           /* Div flags */
unsigned int decimals;        /* Number of decimals in field */
} MYSQL_FIELD;

c api使用手順
1、まずmysqlのヘッダファイルを含め、mysqlダイナミックライブラリをリンクします.
#include 

2、MYSQL変数を作成する.次のようになります.
MYSQL mysql;

3、MYSQL変数を初期化する.
mysql_init(&mysql);

4、mysqlを呼び出すreal_接続関数Mysqlデータベースに接続します.
MYSQL *  STDCALL mysql_real_connect(MYSQL *mysql, 
const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);    

パラメータの説明:
mysql:前に定義したMYSQL変数;
host:MYSQLサーバのアドレス;
user:ログインユーザー名;
passwd:ログインパスワード;
db:接続するデータベース;
port:MYSQLサーバーのTCPサービスポート;
unix_socket:unix接続方式、NULLの場合socketまたはパイプメカニズムを使用しないことを示す.
Clientflag:MysqlはODBCデータベースのタグとして実行され、一般的に0を取ります.
接続に失敗した場合、関数は0を返します.
5、mysqlを呼び出すreal_query関数はデータベースクエリーを行います.
int  STDCALL mysql_real_query(MYSQL *mysql, 
const char *q, 
unsigned long length);

パラメータの説明:
mysql:前に定義したMYSQL変数;
q:SQLクエリ文;
length:クエリー文の長さ.
クエリが成功すると、関数は0を返します.
6、mysqlを呼び出すstore_resultまたはmysql_use_result関数が返すMYSQL_RES変数はクエリ結果データを取得する.
2つの関数のプロトタイプは、次のとおりです.
MYSQL_RES *     STDCALL mysql_store_result(MYSQL *mysql);

MYSQL_RES *     STDCALL mysql_use_result(MYSQL *mysql);

この2つの関数は、クエリーの結果を取得する2つの方法を表します.
1つ目はmysql_を呼び出すstore_result関数はMysqlサーバからクエリされたすべてのデータをクライアントに格納し、読み出します.
2つ目はmysqlを呼び出すuse_resultは取得を初期化し、後続の行1行の読み取り結果セットを容易にします.それ自体はサーバからデータを読み込んでいません.この方法は、最初の方法よりも速く、必要なメモリが少なくなりますが、サーバをバインドし、他のスレッドがテーブルを更新するのを阻止し、mysql_を繰り返し実行する必要があります.fetch_rowはNULLを返すまでデータを読み出します.そうしないと、読み込まれていない行は次のクエリで結果の一部として返されるので、mysql_をよく使用します.store_result.
7、mysqlを呼び出すfetch_row関数は結果セットデータを読み出します.
上記の2つの方式は最後にmysql_を繰り返し呼び出す.fetch_row関数はデータを読み出します.
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

パラメータresultはmysql_ですstore_resultまたはmysql_use_resultの戻り値.
この関数はMYSQL_を返します.ROW型の変数、すなわち文字列配列は、rowと仮定すると、row[i]はi番目のフィールドの値となる.結果セットの最後になると、この関数はNULLを返します.
8、結果セットが切れたらmysqlを呼び出すfree_result関数は、メモリの漏洩を防ぐために結果セットを解放します.
void  STDCALL mysql_free_result(MYSQL_RES *result);

9、Mysqlデータベースを検索しなくなった場合、mysql_を呼び出すclose関数はデータベース接続を閉じます.
void STDCALL mysql_close(MYSQL *sock);

簡単な例
#include 
#include 

int main()
{
	MYSQL mysql;     // need a instance to init
	MYSQL_RES *res;
	MYSQL_ROW row;
	char *query;
	int t,r;
	
	// connect the database
	mysql_init(&mysql);
	if (!mysql_real_connect(&mysql, 
							”localhost”, 
							“mmim”, 
							“mmim”, 
							“test”,
							0, 
							NULL, 
							0)) {
		printf( “Error connecting to database: %s
”,mysql_error(&mysql)); } else printf(“Connected…
”); // get the result from the executing select query query = “select * from t1″; t = mysql_real_query(&mysql, query, (unsigned int) strlen(query)); if (t) { printf(“Error making query: %s
”, mysql_error(&mysql)); } else printf(“[%s] made…
”, query); res = mysql_store_result(&mysql); while(row = mysql_fetch_row(res)) { for(t=0; t < mysql_num_fields(res); t++) { printf(“%s “,row[t]); } printf(“
”); } mysql_free_result(res); //free result after you get the result sleep(1); // execute the insert query query = “insert into t1(id, name) values(3, ‘kunp’)”; t = mysql_real_query(&mysql,query,(unsigned int) strlen(query)); if (t) { printf(“Error making query: %s
”, mysql_error(&mysql)); } else printf(“[%s] made…
”, query); mysql_close(&mysql); return 0; }
mysqlのヘッダファイルが/usr/include/mysql、ライブラリファイルが/usr/lib/mysqlであると仮定し、次のコマンドを実行してコンパイルします.
gcc testsql.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
参照先:
http://ourmysql.com/archives/413
http://blog.51cto.com/a1liujin/1686202