目次
序文
こんにちは、友達、皆さんこんにちは!今日は、C/C++ 言語を使用してデータベースにアクセスし、データベースの内容の追加、削除、確認、変更を実現する方法について説明します。
1. サードパーティライブラリの導入
データベースにアクセスするために、MySQL は対応するサードパーティ ライブラリを提供します。C/C++ 言語を使用してアクセスする場合は、サードパーティ ライブラリを含めるだけで済みます。デフォルトでは、使用時にサードパーティ ライブラリがローカルにダウンロードされています。 MySQL をインストールするための yum ソース はい、そのため、gcc を使用してコンパイルおよび接続して実行可能プログラムを生成する場合、含める必要があるのはライブラリ パスとライブラリ名だけです。
メイクファイル:
mysql:mysql.c
gcc -o $@ $^ -L/usr/lib64/mysql -lmysqlclient
mysql_get_client_info() 関数を使用して、導入が成功したかどうかを確認します。
#include<stdio.h>
#include<mysql/mysql.h> //包含头文件
int main()
{
printf("mysql client Version: %s\n", mysql_get_client_info());
return 0;
}
操作結果:
[myl@VM-8-12-centos レッスン 41]$ ./mysql
mysql クライアント バージョン: 5.7.42
2. MySQL インターフェースの紹介
mysql_init(): 初期化が完了しました
戻り値: MySQL ハンドルを返します。MySQL は基本的に、MySQL 管理の関連属性を含む構造をカーネル内に維持します。後続の操作は、このハンドルを通じて実行されます。
mysql_real_connect(): データベースに接続します
MYSQL *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);
パラメータの紹介:
パラメータ 1: MySQL ハンドル
パラメータ 2: ホストに接続する
パラメータ 3: ユーザー名
パラメータ 4: パスワード
パラメータ 5: 接続データベース名
パラメータ 6: バインディングポート番号
パラメータ 7: ドメイン間ソケットを使用した通信は通常、NULL に設定されます。
パラメータ 8: NULL に設定しても問題ありません
リンク確立後の英語の取得は問題ありませんが、取得した中国語が文字化けしている場合、リンク設定時のデフォルト文字セットはutf8で、本来のデフォルトはlatin1です
。
mysql_query(): mysql コマンドを発行します。
int mysql_query(MYSQL *mysql, const char *q);
パラメータ 1: MySQL ハンドル
パラメータ 2: 実行される SQL ステートメント
戻り値:失敗時は-1が返され、エラーコードが設定されます。
SQLの実行後、クエリ文であればもちろんデータを読み取る必要がありますが、updateやinsertなどの文であれば、その操作が成功するかどうかで決まります。クエリ結果を取得する方法を見てみましょう。mysql_query が正常に返された場合は、mysql_store_result関数を通じて結果を読み取ります。プロトタイプは次のとおりです。
MYSQL_RES *mysql_store_result(MYSQL *mysql);
この関数は、MYSQL 変数の st_mysql_methods の read_rows 関数ポインタを呼び出して、クエリの結果を取得します。同時に、関数は MYSQL_RES などの変数を返します。これは主にクエリの結果を保存するために使用されます。同時に、この関数はクエリされたデータを保存するためにメモリ領域の一部を割り当てます。そのため、free(result) を覚えておく必要があります。そうしないと、確実にメモリ リークが発生します。mysql_store_result を実行した後、データはすでに MYSQL_RES 変数にあり、次の API は基本的に MYSQL_RES 内のデータを読み取ります。
mysql_num_rows(): 結果の行数を取得します。
my_ulonglong mysql_num_rows(MYSQL_RES *res);
mysql_num_fields(): 結果の列の数を取得します。
unsigned int mysql_num_fields(MYSQL_RES *res);
mysql_fetch_fields(): カラム名を取得する
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
mysql_fetch_row(): 結果の内容を取得します
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
mysql_close(): mysql 接続を閉じる
void mysql_close(MYSQL *sock);
コード例:
#include <stdio.h>
#include <string.h>
#include <mysql/mysql.h>
#define HOST "127.0.0.1"
#define USER "root"
#define PORT 3306
#define PASS "123456"
#define DBNAME "test"
int main()
{
//1.初始化mysql句柄
// MYSQL *mysql_init(MYSQL *mysql);
MYSQL* mysql = mysql_init(NULL);
if(mysql == NULL) {
printf("mysql init failed!\n");
return -1;
}
//2.连接服务器
//MYSQL *mysql_real_connect(mysql, host, user, pass, dbname, port, unix_socket, flag);
if(mysql_real_connect(mysql,HOST,USER,PASS,DBNAME,PORT,NULL,0) == NULL) {
printf("connect mysql server failed: %s\n",mysql_error(mysql));
mysql_close(mysql);
return -1;
}
//3.设置客户端字符集:
// int mysql_set_character_set(mysql, "utf8");
if(mysql_set_character_set(mysql,"utf8") != 0) {
printf("set_character mysql client failed: %s\n",mysql_error(mysql));
mysql_close(mysql);
return -1;
}
//4.选择要操作的数据库:
// int mysql_select_db(mysql, dbname)
// mysql_select_db(mysql, DBNAME);
//5.执行SQL语句:
// int mysql_query(MYSQL *mysql, char *sql);
// char* sql = "insert stu values(null,'小明',18,45,78,65);";
// char* sql = "update stu set ch=ch+40 where sn=1;";
// char* sql = "delete from stu where sn=1;";
char* sql = "select* from stu;";
int ret = mysql_query(mysql,sql);
if(ret != 0) {
printf("%s\n",sql);
printf("mysql query failed : %s\n", mysql_error(mysql));
mysql_close(mysql);
return -1;
}
//6.如果SQL语句是查询语句,则需要将结果保存到本地:
// MYSQL_RES *mysql_store_result(MYSQL *mysql)
MYSQL_RES* res = mysql_store_result(mysql);
if(res == NULL) {
mysql_close(mysql);
return -1;
}
//7.获取结果集中的结果条数:
// int mysql_num_rows(MYSQL_RES *res);
// int mysql_num_fields(MYSQL_RES *res);
int num_rows = mysql_num_rows(res);
int num_cols = mysql_num_fields(res);
//8.遍历保存到本地的结果集:
for(int i = 0; i < num_rows; i++) {
// MYSQL_ROW mysql_fetch_row(MYSQL *res);
MYSQL_ROW row = mysql_fetch_row(res);
for(int i = 0; i < num_cols; i++) {
printf("%s\t",row[i]);
}
printf("\n");
}
//9.释放结果集:
mysql_free_result(res);
//10.关闭连接,释放结果集
mysql_close(mysql);
return 0;
}
要約する
以上はC/C++言語を使ってデータベースにアクセスするための共通インターフェースの紹介でしたが、公式サイトの紹介に従ってさらに詳しいインターフェースの紹介や使い方ができます。