エルゴード共通APIでのMySQLのクエリの結果(C)

この表で使用されるように:

MySQLのエラー処理機能

 符号なし整数にmysql_errno(MYSQL * mysqlの) 

 const のchar * mysql_error(MYSQL * mysqlの) 

説明:機能それを返すエラー番号、リターン・エラー・メッセージは、両方のパラメータとして* MYSQLに、それは直感的です。

最初のステップ:クエリ操作

使用される機能:

INTするmysql_query(MYSQL * mysqlの、constの char型 * stmt_str) 

int型 mysql_real_query(MYSQL * mysqlの、constの char型 * stmt_str、符号なしlonglength) 

戻り値:成功時に0を返しますが、それが失敗した場合はゼロ以外の故障戻り、エラーメッセージを取得するためにエラー処理機能を利用することができます。

この2つの機能の間の差:クエリは後者のみで、バイナリデータを使用。

 

ステップ2:クエリ結果の保存(クエリ結果を有する唯一のselect文、更新、クエリなしの結果を挿入し、削除します)

使用される機能:

 MYSQL_RES *はmysql_store_result(MYSQL * mysqlの) 

 MYSQL_RES * mysql_use_result(MYSQL * mysqlの) 

戻り値:成功した場合は、それ以外の場合は、非NULLポインタのMYSQL_RESを返し、それはNULLを返します。select文に一致するエントリがない場合でも、select文の実装を成功限り、なお、関数の戻り値はNULLであってはなりません。

二つの機能の違いは:だけmysql_use_resultから、百個のエントリは、メモリ内のすべての存在を呼び出しますにmysql_store_result百個のエントリが存在する場合、クエリの結果を選択し、クライアントの店に結果セット全体をにmysql_store_result結果は、mysql_fetch_rowを使用して設定した場合、テーブル・エントリ内のメモリに結果セットを削除し、次のエントリは、機能サーバから取得され()。mysql_use_resultを使用少ないメモリと実行速度が速くので。しかし、あなたはmysql_store_setそれでまだそれから、結果セットのクライアント側でデータのいくつかの処理が必要な場合。

概要:クライアントのメモリ、そして次のデータがメモリに保存されているクライアントにサーバーから取得したデータのみを使用するためにmysql_use_resultの必要性を維持するために、すべてのサーバーの実行につながる文を選択するにmysql_store_result。

注:結果は、使い切って使用メモリを解放するmysql_free_result() この関数のプロトタイプは  、ボイド mysql_free_result(MYSQL_RES *結果) 

 第三段階:結果を横断します

結果を介して2つの段階に分けることができる:最初にデータの結果セットの行をフェッチし、行データ内のデータの各列を介し。

トラバーサル関数列を使用しました:

 MYSQL_ROWのは、mysql_fetch_row(MYSQL_RES *結果) 

説明:上記の手順クエリ結果を返すMYSQL_ROW構造、この構造は(CHAR *行[elems])、ポインタの文字配列の要素として理解することができる結果セットのデータの行です 、 すべてのデータは、結果でセットが完了横断したとき、この関数はNULLを返します。それでは、どのようにこのような構造にそれを使うのですか?まずによって調製以下の関数の結果セットを取得するために(mysql_num_fields()/は、mysql_field_count() )列の数、そして次にそれを横切る、終了する(列--1の数)に、インデックス0から始まります。現在の列がNULLである場合、それは、COLカラムの現在の世代を指し、また、NULLの値MYSQL_ROW [COL]。

使用例:

1  MYSQL_ROW行。
2符号なし整数 COLS = は、mysql_field_count(conn_ptr)。
3  ながら(!(行=は、mysql_fetch_row(res_ptr))= NULL)
 4  {
 5      ため(符号無し整数 iは= 0 ; I <COLS; ++ I)
 6      {
 7          のprintf(" %sの" 、行[I])。
8      }
 9      のprintf(" \ n " );
10 }

 

出力:

ここで私は少しだった実際には、通常の状況下では判断がNULLであるかどうか[i]の行する必要があり、戸惑うケース内の行[i]が空である理由、結果はセグメンテーションフォールトを作成することなく、またOK通常のprintfです。

1  MYSQL_ROW行。
2符号なし整数 COLS = は、mysql_field_count(conn_ptr)。
3  ながら(!(行=は、mysql_fetch_row(res_ptr))= NULL)
 4  {      
 5      ため(符号無し整数 iは= 0 ; I <COLS; ++ I)
 6      {  
 7          場合(行[I] == NULL)が
 8              のprintf(" I AMヌル" );
9          他の                                     
10              のprintf(" %sの" 、行[I])。
11      }   
12      のprintf(" \ n " );
13 }   

結果:

トラバーサル機能は次のような場合に、列に使用されます。

 符号なしのint mysql_num_fields(MYSQL_RES *結果) 

 符号なし整数は、mysql_field_count(MYSQL * mysqlの) 

 MYSQL_FIELD *のmysql_fetch_field(MYSQL_RES *結果) 

最初の二つの機能のために、パラメータが異なっているが、効果は同じであり、結果セットの列の数は、現在のクエリで返されます。

また、連続ループを使用する必要がありながら、属性列は、第三(カラム名、カラム型情報を含む)の機能、およびその使用mysql_fetch_col()同様のことによって得ることができます。戻り値がnullの場合、何が次の列を表します。

使用例:

1つの   MYSQL_RES * res_ptr = はmysql_store_result(conn_ptr)。
2   なら(res_ptr)
 3  {
 4       のprintf(" 使用の結果成功した\ n " );
5       
6       MYSQL_FIELD * フィールド。
7       一方((フィールド= のmysql_fetch_field(res_ptr)))
 8       {
 9           のprintf(" %sの"、フィールド- > 名);
10       }
 11       のprintf(" \ n " );
12  
13   }

結果: 

 すべてのコード

1の#include <MySQLの/ mysql.h>
 2  
3の#include <STDLIB.H>
 4の#include <stdio.hの>
 5  
6  INT メイン()
 7  {
 8      // MYSQL *にmysql_init(MYSQL *のMySQL)
9      MYSQL * conn_ptr = にmysql_init(NULL)。
10      であれば(conn_ptr == NULL)
 11      {
 12          のfprintf(stderrに、" にmysql_init()が失敗した\ n " );
13          リターン - 1 14      }
 15      //MYSQL *にmysql_real_connect(MYSQL *のMySQL、CONSTのchar *ホスト、
 16      // CONSTのchar *ユーザ、CONSTのchar *のpasswd、CONSTのchar * DB、
 17      // unsigned int型ポート、CONSTのchar * unix_socket、符号なしのロングclientflag)
18      にmysql_real_connect( conn_ptr、" ローカルホスト" 19                                    " リック"" secretpassword "" リック" 20                                    0、NULL、0 );
21      であれば(conn_ptr)
 22      {
 23          のprintf("正常に接続\ N " );
 24          int型 query_ret =するmysql_query(conn_ptr、" 子どもSELECT * FROM; " );
 25          もし(query_ret == 0 26          {
 27              のprintf(" クエリ成功\ N " );
 28の 
29の              MYSQL_RES * res_ptr = はmysql_store_result(conn_ptr)、
 30              であれば(res_ptr)
 31              {
 32                  のprintf(" 使用の結果成功した\ n " );
 33  
34                 MYSQL_FIELD * フィールド。
35                  一方((フィールド= のmysql_fetch_field(res_ptr)))
 36                  {
 37                      のprintf(" %sの"、フィールド- > 名);
38                  }                                                
 39                  のprintf(" \ n " );
40  
41                  MYSQL_ROW行。
42                  の符号なし整数 COLS = は、mysql_field_count(conn_ptr)。
43                  一方((行=は、mysql_fetch_row(res_ptr))!=NULL)
 44                  {
 45                      のための(符号なし整数 iは= 0 ; I <COLS; ++ I)
 46                      {
 47                          のprintf(" %sの" 、行[I])。
48                      }
 49                      のprintf(" \ n " );
50                  }
 51              }
 52              他の
53              {
 54                  のfprintf(stderrに、" 使用結果が失敗%のD:%S \ n "、にmysql_errno(conn_ptr)、mysql_error(conn_ptr))。
55              }
 56              mysql_free_result(res_ptr)。
57          }
 58          他の
59          {
 60              のfprintf(stderrに、" クエリ失敗%のD:%S \ n " 、にmysql_errno(conn_ptr)、mysql_error(conn_ptr))。
61          }
 62  
63      }
 64      他の
65      {
 66          のprintf(" 失敗\ nて接続" )。
67      }
 68      // 無効にmysql_close(MYSQL *靴下)
69     mysql_close(conn_ptr)。
70      リターン 0 ;
71 }

 

おすすめ

転載: www.cnblogs.com/XiaoXiaoShuai-/p/11923311.html