1.mysql_init
MYSQL *mysql_init(MYSQL *mysql);
mysql_init関数の役割: MYSQL オブジェクトを作成します (このオブジェクトはデータベースへの接続に使用されます)。
mysql_init関数のパラメータ:
① mysql: MYSQL 構造ポインタ。通常は NULL に設定されます。
mysql_init関数の戻り値:
① 成功すると、MYSQL オブジェクトへのポインタが返されます。
②失敗した場合はNULLを返す。
MYSQL オブジェクトは次のように定義されます。
typedef 構造体 st_mysql
{
ネットネット。/* 通信パラメータ */
unsigned char *connector_fd; /* SSL 用の ConnectorFd */
char *ホスト、*ユーザー、*パスワード、*unix_socket、*サーバーバージョン、*ホスト情報;
char *情報、*db;
struct charset_info_st *charset;
MYSQL_FIELD *フィールド;
MEM_ROOT フィールド_割り当て;
my_ulonglong 影響を受けた_行数;
my_ulonglong 挿入 ID; /* NEXTNR を使用してテーブルに挿入する場合の ID */
my_ulonglong extra_info; /* 使用されていない */
符号なしの長い thread_id; /* サーバーでの接続用の ID */
符号なしの長いパケット長;
unsigned int ポート。
unsigned long client_flag,server_capabilities;
unsigned int プロトコルバージョン;
unsigned int フィールド数;
unsigned int サーバーステータス;
unsigned int サーバー言語;
unsigned int warning_count;
struct st_mysql_options オプション;
enum mysql_status ステータス;
my_bool free_me; /* mysql_close で空きの場合 */
my_bool 再接続; /* 自動再接続の場合は 1 に設定 */
/* セッション全体のランダムな文字列 */
文字スクランブル[SCRAMBLE_LENGTH+1];
my_bool 未使用1;
void *unused2、*unused3、*unused4、*unused5;
LIST *stmts; /* すべてのステートメントのリスト */
const struct st_mysql_methods *メソッド;
void *thd;
/*
MYSQL_RES または MYSQL_STMT のブール型フラグを指します。私たちはこのフラグを立てます
close がこのオブジェクトの結果セットをキャンセルする必要がある場合は、mysql_stmt_close から。
*/
my_bool *unbuffered_fetch_owner;
/* 組み込みサーバーに必要 - 「情報」を保存するためのネット バッファーがありません */
char *info_buffer;
void *拡張子;
MYSQL;
MYSQL オブジェクトには、多くの基本的な接続パラメータがあります。また、st_mysql_methods と呼ばれる構造変数も含まれており、これには多くの関数ポインタが含まれています。これらの関数ポインタは、データベース接続が成功した後、さまざまなデータ操作で呼び出されます。
2.mysql_real_connect
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
const char *ユーザー、
const char *passwd、
const char *db、
未署名の int ポート、
const char *unix_socket、
符号なしの長いクライアントフラグ);
mysql_real_connect関数の役割: データベースに接続します。
mysql_real_connect関数のパラメータ:
① mysql: MYSQL オブジェクトポインタ。
②ホスト:接続するMySQLサーバーのIPアドレス。
③ user: ユーザー名、どのユーザーとして接続するか。
④ passwd: ユーザーのパスワード。
⑤ db: 接続するデータベースです。
⑥ port: 接続するMySQLサーバーのポート番号です。
⑦ unix_socket: 通常は NULL に設定されます。
⑧ clientflag: 通常は 0 に設定されます。
mysql_real_connect関数の戻り値:
① 成功すると、MYSQL オブジェクトへのポインタが返されます。これは、最初のパラメータ mysql の値と同じです。
②失敗した場合はNULLを返す。
3.mysql_close
void mysql_close(MYSQL *sock);
mysql_close関数の役割: データベース接続を閉じます。
mysql_close関数のパラメータ:
① sock: MYSQL オブジェクト ポインタ。
mysql_close関数の戻り値: None。
4.mysql_set_character_set
データベースに接続した後、データ対話中の文字化けを避けるために、クライアントとサーバーのエンコード形式を統一する必要があります。
int mysql_set_character_set(MYSQL *mysql, const char *csname);
mysql_set_character_set関数の役割: エンコード形式を設定します。
mysql_set_character_set関数のパラメータ:
① mysql: MYSQL オブジェクトポインタ。
② csname: どの文字セットを設定するか。
mysql_set_character_set関数の戻り値:
①成功、0。
②失敗、非0。
5. mysql_query
int mysql_query(MYSQL *mysql, const char *q);
mysql_query関数の役割: SQL リクエストを発行します。
mysql_query関数のパラメータ:
① mysql: MYSQL オブジェクトポインタ。
② q:実行するSQL文(文末にセミコロンは無くても構いません)。
mysql_query関数の戻り値:
①成功、0。
②失敗、非0。
6. mysql_store_result
MYSQL_RES *mysql_store_result(MYSQL *mysql);
mysql_store_result関数の役割: クエリ結果を取得します。
mysql_store_result関数のパラメータ:
① mysql: MYSQL オブジェクトポインタ。
mysql_store_result関数の戻り値:
① 成功した場合、MYSQL_RES オブジェクトへのポインタを返します。
②失敗した場合はNULLを返す。
この関数は、MYSQL 変数の st_mysql_methods 内の対応する関数ポインターを呼び出して、クエリ結果を取得します。
この関数は、MYSQL_RES 構造体変数を malloc し、取得したクエリ結果を変数に保存し、最後に変数のポインタを返します。
MYSQL_RES のメモリ空間は再割り当てされるため、使用後に必ず free 関数 (mysql_free_result 関数) を呼び出して対応するメモリ空間を解放する必要があります。そうしないとメモリ リークが発生します。
mysql_store_resultを実行した後、クエリされるデータは実際にはすでに MYSQL_RES 変数内にあります。次の関数は基本的に MYSQL_RES 内のデータを読み取り、パラメータはすべて MYSQL_RES オブジェクト ポインタです。
// 結果の行数を取得します
my_ulonglong mysql_num_rows(MYSQL_RES *res);
// 結果の列数を取得します
unsigned int mysql_num_fields(MYSQL_RES *res);
// 結果の列プロパティを取得します
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
// 結果からレコードの行を取得します
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
mysql_fetch_row関数の戻り値MYSQL_ROWについて:
MYSQL_ROW、つまり結果内のレコードの行は複数の列情報に対応し、実際には文字列配列であるため、MYSQL_ROW 型は本質的に char** 型であり、その定義は次のとおりです。
typedef char **MYSQL_ROW; /* データを文字列の配列として返します */
7.mysql_free_result()
void mysql_free_result(MYSQL_RES *result);
機能: mysql_store_result によって以前に割り当てられたメモリを解放するために使用されます。
3. 使用例
1. データベースに接続し、データベース接続を閉じます。
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
const char host[] = "127.0.0.1"; //MySQL が配置されているマシンの IP
const int port = 0; // MySQL が配置されているマシンのポート
const char db[] = "test"; // データベース名
const char user[] = "root"; // ユーザー名
const char passwd[] = "test123"; // ユーザーパスワード
int main()
{
//1. MySQL インスタンスを取得します (MySQL ハンドルの作成と同等)
MYSQL* ms = mysql_init(nullptr);
//2. データベースに接続します
if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {
printf("データベース接続に失敗しました!\n");
1 を返します。
}
printf("データベース接続に成功しました!\n");
//3. データベースにアクセスする
//4. データベース接続を閉じる
mysql_close(ms);
printf("データベース接続が正常に閉じられました!\n");
0を返します。
}
2. データベースにアクセスする
mysql_query:
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
const char host[] = "127.0.0.1"; //MySQL が配置されているマシンの IP
const int port = 0; // MySQL が配置されているマシンのポート
const char db[] = "test"; // データベース名
const char user[] = "root"; // ユーザー名
const char passwd[] = "test123"; // ユーザーパスワード
int main()
{
//1. MySQL インスタンスを取得します (MySQL ハンドルの作成と同等)
MYSQL* ms = mysql_init(nullptr);
//2. データベースに接続します
if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {
printf("データベース接続に失敗しました!\n");
1 を返します。
}
//接続エンコード形式を設定する
mysql_set_character_set(ms, "utf8");
printf("データベース接続に成功しました!\n");
//3. データベースにアクセスする
//3.1 の選択は実際に対処するのが最も困難です。select SQL の実行は最初のステップにすぎず、データをさらに分析する必要があります。
char sql[] = "注文項目から * を選択;";
int コード = mysql_query(ms, sql);
if(コード != 0){
printf("実行: %s が失敗しました\n", sql);
2を返します。
}
printf("実行: %s 成功\n", sql);
//3.2 データを解析します -- 行番号と列番号を取得します
MYSQL_RES *結果 = mysql_store_result(ms);
int rows = mysql_num_rows(結果);
intcols = mysql_num_fields(結果);
printf("行数: %d、列数: %d\n", 行数, 列数);
//3.3 データを解析します -- テーブル内の列名を取得します -- コードの整合性をテストするためだけに、通常は使用されません
MYSQL_FIELD *フィールド = mysql_fetch_fields(結果);
for(int i = 0; i <cols; i++){
printf("%s\t", フィールド[i].name);
}
printf("\n");
//3.4 データの解析 -- テーブル内のデータの取得 -- 重要
for(int i = 0; i < 行; i++){
MYSQL_ROW line = mysql_fetch_row(result); // レコードの完全な行を取得します (デフォルトは前から後ろまで)
for(int j = 0; j <cols; j++){
printf("%s\t", line[j]); // レコード行内の複数列の文字列を順番に出力します。
}
printf("\n");
}
mysql_free_result(result); // メモリ空間を解放する
//4. データベース接続を閉じる
mysql_close(ms);
printf("データベース接続が正常に閉じられました!\n");
0を返します。
}
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
const char host[] = "127.0.0.1"; //MySQL が配置されているマシンの IP
const int port = 0; // MySQL が配置されているマシンのポート
const char db[] = "test"; // データベース名
const char user[] = "root"; // ユーザー名
const char passwd[] = "test123"; // ユーザーパスワード
// テーブルの内容をクエリします
int select(MYSQL* ミリ秒)
{
//3.1 の選択は実際に対処するのが最も困難です。select SQL の実行は最初のステップにすぎず、データをさらに分析する必要があります。
char sql[] = "select * from man;";
int コード = mysql_query(ms, sql);
if(コード != 0){
printf("実行: %s が失敗しました\n", sql);
2を返します。
}
printf("実行: %s 成功\n", sql);
//3.2 データを解析します -- 行番号と列番号を取得します
MYSQL_RES *結果 = mysql_store_result(ms);
int rows = mysql_num_rows(結果);
intcols = mysql_num_fields(結果);
printf("行数: %d、列数: %d\n", 行数, 列数);
//3.3 データを解析します -- テーブル内の列名を取得します -- コードの整合性をテストするためだけに、通常は使用されません
MYSQL_FIELD *フィールド = mysql_fetch_fields(結果);
for(int i = 0; i <cols; i++){
printf("%s\t", フィールド[i].name);
}
printf("\n");
//3.4 データの解析 -- テーブル内のデータの取得 -- 重要
for(int i = 0; i < 行; i++){
MYSQL_ROW line = mysql_fetch_row(result); // レコードの完全な行を取得します (デフォルトは前から後ろまで)
for(int j = 0; j <cols; j++){
printf("%s\t", line[j]); // レコード行内の複数列の文字列を順番に出力します。
}
printf("\n");
}
mysql_free_result(result); // メモリ空間を解放する
0を返します。
}
int main()
{
//1. MySQL インスタンスを取得します (MySQL ハンドルの作成と同等)
MYSQL* ms = mysql_init(nullptr);
//2. データベースに接続します
if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {
printf("データベース接続に失敗しました!\n");
1 を返します。
}
//接続エンコード形式を設定する
mysql_set_character_set(ms, "gb2312");
printf("データベース接続に成功しました!\n");
//3. データベースにアクセスする
選択(ミリ秒);
// 挿入操作
char sql_insert[] = "man 値 (\'小刚\', 19) に挿入;";
int res = mysql_query(ms, sql_insert);
if(res != 0){
printf("実行: %s が失敗しました\n", sql_insert);
2を返します。
}
printf("実行: %s 成功\n", sql_insert);
選択(ミリ秒);
//4. データベース接続を閉じる
mysql_close(ms);
printf("データベース接続が正常に閉じられました!\n");
0を返します。
}
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
const char host[] = "127.0.0.1"; //MySQL が配置されているマシンの IP
const int port = 0; // MySQL が配置されているマシンのポート
const char db[] = "test"; // データベース名
const char user[] = "root"; // ユーザー名
const char passwd[] = "test123"; // ユーザーパスワード
// テーブルの内容をクエリします
int select(MYSQL* ミリ秒)
{
//3.1 の選択は実際に対処するのが最も困難です。select SQL の実行は最初のステップにすぎず、データをさらに分析する必要があります。
char sql[] = "select * from man;";
int コード = mysql_query(ms, sql);
if(コード != 0){
printf("実行: %s が失敗しました\n", sql);
2を返します。
}
printf("実行: %s 成功\n", sql);
//3.2 データを解析します -- 行番号と列番号を取得します
MYSQL_RES *結果 = mysql_store_result(ms);
int rows = mysql_num_rows(結果);
intcols = mysql_num_fields(結果);
printf("行数: %d、列数: %d\n", 行数, 列数);
//3.3 データを解析します -- テーブル内の列名を取得します -- コードの整合性をテストするためだけに、通常は使用されません
MYSQL_FIELD *フィールド = mysql_fetch_fields(結果);
for(int i = 0; i <cols; i++){
printf("%s\t", フィールド[i].name);
}
printf("\n");
//3.4 データの解析 -- テーブル内のデータの取得 -- 重要
for(int i = 0; i < 行; i++){
MYSQL_ROW line = mysql_fetch_row(result); // レコードの完全な行を取得します (デフォルトは前から後ろまで)
for(int j = 0; j <cols; j++){
printf("%s\t", line[j]); // レコード行内の複数列の文字列を順番に出力します。
}
printf("\n");
}
mysql_free_result(result); // メモリ空間を解放する
0を返します。
}
int main()
{
//1. MySQL インスタンスを取得します (MySQL ハンドルの作成と同等)
MYSQL* ms = mysql_init(nullptr);
//2. データベースに接続します
if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {
printf("データベース接続に失敗しました!\n");
1 を返します。
}
//接続エンコード形式を設定する
mysql_set_character_set(ms, "gb2312");
printf("データベース接続に成功しました!\n");
//3. データベースにアクセスする
選択(ミリ秒);
//削除操作
char sql_delete[] = "man where name=\'小刚\'から削除";
int res = mysql_query(ms, sql_delete);
if(res != 0){
printf("実行: %s が失敗しました\n", sql_delete);
2を返します。
}
printf("実行: %s 成功\n", sql_delete);
選択(ミリ秒);
//4. データベース接続を閉じる
mysql_close(ms);
printf("データベース接続が正常に閉じられました!\n");
0を返します。
}
#include <stdio.h>
#include <winsock.h>
#include <mysql.h>
const char host[] = "127.0.0.1"; //MySQL が配置されているマシンの IP
const int port = 0; // MySQL が配置されているマシンのポート
const char db[] = "test"; // データベース名
const char user[] = "root"; // ユーザー名
const char passwd[] = "test123"; // ユーザーパスワード
// テーブルの内容をクエリします
int select(MYSQL* ミリ秒)
{
//3.1 の選択は実際に対処するのが最も困難です。select SQL の実行は最初のステップにすぎず、データをさらに分析する必要があります。
char sql[] = "select * from man;";
int コード = mysql_query(ms, sql);
if(コード != 0){
printf("実行: %s が失敗しました\n", sql);
2を返します。
}
printf("実行: %s 成功\n", sql);
//3.2 データを解析します -- 行番号と列番号を取得します
MYSQL_RES *結果 = mysql_store_result(ms);
int rows = mysql_num_rows(結果);
intcols = mysql_num_fields(結果);
printf("行数: %d、列数: %d\n", 行数, 列数);
//3.3 データを解析します -- テーブル内の列名を取得します -- コードの整合性をテストするためだけに、通常は使用されません
MYSQL_FIELD *フィールド = mysql_fetch_fields(結果);
for(int i = 0; i <cols; i++){
printf("%s\t", フィールド[i].name);
}
printf("\n");
//3.4 データの解析 -- テーブル内のデータの取得 -- 重要
for(int i = 0; i < 行; i++){
MYSQL_ROW line = mysql_fetch_row(result); // レコードの完全な行を取得します (デフォルトは前から後ろまで)
for(int j = 0; j <cols; j++){
printf("%s\t", line[j]); // レコード行内の複数列の文字列を順番に出力します。
}
printf("\n");
}
mysql_free_result(result); // メモリ空間を解放する
0を返します。
}
int main()
{
//1. MySQL インスタンスを取得します (MySQL ハンドルの作成と同等)
MYSQL* ms = mysql_init(nullptr);
//2. データベースに接続します
if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {
printf("データベース接続に失敗しました!\n");
1 を返します。
}
//接続エンコード形式を設定する
mysql_set_character_set(ms, "gb2312");
printf("データベース接続に成功しました!\n");
//3. データベースにアクセスする
選択(ミリ秒);
// 更新操作
char sql_update[] = "update man set age = 20 where name=\'小明\'";
int res = mysql_query(ms, sql_update);
if(res != 0){
printf("実行: %s が失敗しました\n", sql_update);
2を返します。
}
printf("実行: %s 成功\n", sql_update);
選択(ミリ秒);
//4. データベース接続を閉じる
mysql_close(ms);
printf("データベース接続が正常に閉じられました!\n");
0を返します。
}
- 更新操作を実行します。
- 削除操作を実行します。
- 挿入操作を実行します。
- 選択操作を実行します。