本記事では、OceanBase Connector/C と OB Cloud を使用してアプリケーションを構築し、テーブルの作成、データの挿入、クエリなどの基本的な操作を実現する方法を紹介します。
前提条件
- OB Cloudデータベースアカウントに登録し、クラスタインスタンスとOB CloudのOracleモードテナントを作成していること。詳細については、クラスタインスタンスの作成およびテナントの作成をご参照ください。
- OceanBase Connector/Cドライバーをインストール済みであること。OceanBase Connector/CドライバーのWindows版インストールパッケージは、テクニカルサポートにお問い合わせください。
- Visual Studioをインストール済みであること。
操作手順
説明
本記事で示す操作手順は、Windows環境でVisual Studio Community 2019を使用してこのプロジェクトをコンパイルおよび実行する場合のものです。他のOS環境やコンパイラを使用する場合は、手順が若干異なる可能性があります。
c-oceanbase-capiプロジェクトを開きます。c-oceanbase-capiプロジェクトのプロパティを設定します。- OB Cloudクラウドデータベースの接続情報を取得します。
c-oceanbase-capiプロジェクト内のデータベース接続情報を修正します。- プロジェクトをビルドします。
- アプリケーションを実行します。
- 出力結果を確認します。
ステップ1:c-oceanbase-capiプロジェクトを開く
Visual Studio Community 2019を起動します。
既存のプロジェクトを開きます。
Visual Studio Community 2019の開始画面で、使用を開始する前に プロジェクトまたはソリューションを開く(P) ボタンをクリックします。または、Visual Studio Community 2019の開始画面で、使用を開始する前に コードなしで続行(W) ボタンをクリックするか、上部メニューバーから ファイル -> オープン -> プロジェクト/ソリューション(P) を選択します。
c-oceanbase-capi プロジェクト フォルダに移動し、プロジェクトファイル(
c-oceanbase-capi.slnまたはc-oceanbase-capi.vcxproj)を選択して、オープン をクリックします。
ステップ2:c-oceanbase-capiプロジェクトのプロパティを設定する
プロジェクトのプロパティページを開きます。
ソリューションエクスプローラーで 選択したプロジェクトを右クリックし、コンテキストメニューで 属性 を選択するか、Visual Studioの上部メニューバーで プロジェクト -> 属性 を選択するか、ショートカットキー Alt + Enter を使用します。
構成マネージャーの設定を行います。
プロパティページで、上部にある 設定(C) のドロップダウンメニューを選択します。ドロップダウンメニューで、Debug を選択します。
プロパティページで、上部にある プラットフォーム(P) のドロップダウンメニューを選択します。ドロップダウンメニューで、x64 を選択します。
コンパイラのヘッダーファイルパスを設定します。
プロパティページで VC++ディレクトリ タブを選択し、インクルードディレクトリ 項目を見つけて、OceanBase Connector/Cライブラリのヘッダーファイルパスを追加します。
コンパイラのリンクライブラリパスを設定します。
プロパティページで VC++ディレクトリ タブを選択し、ライブラリディレクトリ 項目を見つけて、OceanBase Connector/Cライブラリのリンクライブラリパスを追加します。
文字セットの設定を行います。
プロパティページで 詳細 タブを選択し、文字セット 項目を見つけます。ドロップダウンメニューで、マルチバイト文字セットの使用 を選択します。
ステップ3:OB Cloudクラウドデータベースの接続情報を取得する
OB Cloudデータベースコンソールにログインします。インスタンス一覧ページで、対象インスタンスの情報を展開し、対象テナントで、接続 > 接続文字列を取得 を選択します。
詳細な操作については、接続文字列の取得をご参照ください。
作成済みのOB Cloudデータベースに基づいて、以下のURLの該当する情報を入力します。
例:
obclient -h t********.********.oceanbase.cloud` -P1521 -u oracle001 -p******パラメータ説明:
-h:OB Cloudデータベースの接続アドレスを指定します。例:t********.********.oceanbase.cloud。-P:OB Cloudデータベースの接続ポートを指定します。デフォルトは1521です。-u:データベースへのアクセスアカウントを指定します。-p:アカウントのパスワードを指定します。
接続文字列の詳細については、OBClientを使用したOceanBaseテナントへの接続をご参照ください。
ステップ4:c-oceanbase-capiプロジェクトのデータベース接続情報を修正する
ステップ3:OB Cloudデータベース接続情報を取得する の情報に基づいて、test_tbl1.cpp ファイル内のデータベース接続情報を修正します。
例:
if (NULL == mysql_real_connect(&con_oboracle, "t********.********.oceanbase.cloud", "oracle001", "******", "sys", 1521, NULL, 0))
ステップ5:プロジェクトをビルドする
ビルド メニューを選択し、ソリューションのビルド を選択します。ビルド中、コンパイラの出力およびエラーや警告情報が表示されます。
ステップ6:アプリケーションを実行する
デバッグ メニューを選択し、デバッグの開始 または 実行の開始(デバッグなし) を選択してアプリケーションを実行します。
ステップ7:出力結果を確認する
出力結果はデバッグコンソールに表示されます。プログラムの設計ロジックとコードに基づいて、出力の処理方法を判断できます。
プロジェクトコードについて
c-oceanbase-capi をクリックしてプロジェクトコードをダウンロードします。これは、c-oceanbase-capi.zip という名前の圧縮ファイルです。
解凍すると、c-oceanbase-capi という名前のフォルダが作成されます。ディレクトリ構造は以下のとおりです:
c-oceanbase-capi
├─ c-oceanbase-capi.sln
├─ c-oceanbase-capi.vcxproj
├─ c-oceanbase-capi.vcxproj.filters
├─ c-oceanbase-capi.vcxproj.user
└─ test_tbl1.cpp
ファイルの説明:
c-oceanbase-capi.sln:Visual Studioのソリューションファイルで、1つまたは複数のプロジェクトを管理するために使用されます。c-oceanbase-capi.vcxproj:Visual Studioのプロジェクトファイルで、C/C++プロジェクトの構造と設定を記述するために使用されます。c-oceanbase-capi.vcxproj.filters:Visual Studioのプロジェクトフィルターファイルで、プロジェクト内のファイルのディレクトリ構造と編成方法を定義するために使用されます。c-oceanbase-capi.vcxproj.user:ユーザー固有のプロジェクト設定を格納するファイルです。test_tbl1.cpp:データテーブルの構造を定義し、データテーブル操作を実装したソースコードファイルです。
test_tbl1.cppファイルのコード紹介
test_tbl1.cpp ファイルは、test_tbl1 という名前のデータテーブルを定義するために使用され、データテーブルの作成、データの挿入、クエリ操作を実装しています。
本記事の test_tbl1.cpp ファイルのコードは、主に以下の部分で構成されています:
- ヘッダーファイルとライブラリファイルのインポート。
- ヘッダーファイル
stdio.h、stdlib.h、mysql.hをインポートします。 - リンカーに対して、特定のライブラリファイル
Shlwapi.lib、ws2_32.lib、Crypt32.lib、Secur32.lib、obclnt.libのリンクを指示します。これらのライブラリファイルは、それぞれWindows APIライブラリ、WinSockライブラリ、暗号化ライブラリ、セキュリティライブラリ、およびOB Cloudクラウドデータベースクライアントライブラリです。
コード:
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#pragma comment(lib, "Shlwapi.lib")
#pragma comment( lib, "ws2_32.lib" )
#pragma comment(lib, "Crypt32.lib")
#pragma comment(lib, "Secur32.lib")
#pragma comment(lib, "obclnt.lib")
main関数の定義。プログラムのエントリ関数
mainを定義し、整数値を返します。main関数内には、データベース接続やデータ操作に関連するコードが記述されています。コード:
int main() { // 接続インスタンスオブジェクトを作成 // データベースに接続 // テーブルを作成 // データを挿入 // データをクエリ // ... }変数と配列の宣言。
con_oboracleという名前の変数をMYSQL型で宣言します。この変数を宣言することで、接続インスタンスを作成できます。sql_strという名前の文字配列を1024の長さで宣言し、{ 0 }で初期化します。この配列はSQLクエリ文を格納するために使用されます。
コード:
MYSQL con_oboracle;
char sql_str[1024] = { 0 };
接続インスタンスオブジェクトの初期化。
接続オブジェクト
con_oboracleを初期化し、初期化結果に応じて適切な処理を行います。初期化に失敗した場合は、エラーメッセージを出力して非ゼロ値を返し、初期化に成功した場合は成功メッセージを出力して後続の操作を続行します。具体的な手順は以下のとおりです:mysql_init()関数を呼び出して、接続オブジェクトcon_oboracleを初期化します。この関数は初期化された接続オブジェクトへのポインタを返します。初期化に失敗した場合はNULLを返します。NULLはヌルポインタを表すマクロです。NULLとmysql_init()の戻り値を比較して、初期化の成功・失敗を判断します。fprintf()関数は、エラーメッセージを標準エラーストリームstderrに出力するために使用されます。fprintf()関数の最初のパラメータは出力ストリーム、"Error: %s\n"はフォーマット文字列、mysql_error(&con_oboracle)はフォーマット文字列内の%sを置き換える実際のパラメータです。mysql_error(&con_oboracle)は接続オブジェクトcon_oboracleのエラー情報を取得します。return 1を使用して、初期化に失敗した場合にmain関数を終了し、非ゼロ値を返します。この値は、プログラムが異常終了または初期化失敗した状態を示すために使用できます。初期化が成功した場合、成功メッセージを出力します。これにより、コンソールで接続オブジェクトの初期化が成功したかどうかを確認できます。
**コード:**
```c
if (NULL == mysql_init(&con_oboracle)) {
fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle));
return 1;
}
printf("mysql_init() success\n");
```
データベースに接続します。
プログラム内でデータベースへの接続を試み、接続結果に応じて適切な処理を行います。接続に失敗した場合は、エラーメッセージを出力して非ゼロ値を返します。接続に成功した場合は、成功メッセージを出力して、その後の操作を続行します。具体的な手順は以下のとおりです:
mysql_real_connect()関数を呼び出してデータベースに接続します。この関数は、接続済みオブジェクトへのポインタを返します。接続に失敗した場合はNULLを返します。fprintf()関数は、エラー情報を標準エラーストリームstderrに出力するために使用されます。fprintf()関数の最初のパラメータは出力ストリーム、"Error: %s\n"はフォーマット文字列、mysql_error(&con_oboracle)はフォーマット文字列内の%sを置き換える実際のパラメータです。mysql_error(&con_oboracle)は、接続オブジェクトcon_oboracleのエラー情報を取得します。接続に失敗した場合、
return 1を使用してmain関数を終了し、非ゼロ値を返します。この値は、プログラムの異常終了または接続失敗の状態を示すために使用できます。
接続に成功した場合、成功メッセージを出力します。これにより、コンソールでデータベースへの接続が成功したかどうかを確認できます。
コード:
if (NULL == mysql_real_connect(&con_oboracle, "your_ip", "your_user", "your_password", "your_schema", your_port, NULL, 0)) { fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle)); return 1; } printf("mysql_real_connect() success\n");OB Cloudデータベース接続に必要なパラメータの説明:
your_ip:OB Cloudデータベースの接続アドレスを指定します。例:t********.********.oceanbase.cloud。your_user:データベースへのアクセスアカウントを指定します。your_password:アカウントのパスワードを指定します。your_schema:アクセスするスキーマ名を指定します。your_port:OB Cloudデータベースの接続ポートを指定します。デフォルトは1521です。
テーブルを作成します。
SQLクエリステートメントを実行してテーブルを作成します。テーブルの作成に成功した場合は成功メッセージを出力します。テーブルの作成に失敗した場合はエラーメッセージを出力してプログラムを終了します。具体的な手順は以下のとおりです:
sprintf_s()関数を使用してSQLクエリ文字列をフォーマットし、sql_str文字配列に格納します。このSQLクエリステートメントは、id(主キー)、name、age列を含むtest_tbl1という名前のテーブルを作成するために使用されます。mysql_query()関数を使用してSQLクエリステートメントを実行します。&con_oboracleはデータベース接続オブジェクトへのポインタであり、クエリ操作を実行する接続オブジェクトを指定するために使用されます。sql_strは実行するクエリステートメントです。次に、クエリの実行結果が成功したかどうかをチェックします。クエリの実行に失敗した場合(戻り値が0ではない場合)、以下のコードブロックを実行します。fprintf()関数は、エラー情報を標準エラーストリームstderrに出力するために使用されます。fprintf()関数の最初のパラメータは出力ストリーム、"Error: %s\n"はフォーマット文字列、mysql_error(&con_oboracle)はフォーマット文字列内の%sを置き換える実際のパラメータです。mysql_error(&con_oboracle)は、接続オブジェクトcon_oboracleのエラー情報を取得します。データベースへの接続を閉じ、接続オブジェクトのリソースを解放します。
テーブルの作成に失敗した場合、
return 1を使用してmain関数を終了し、非ゼロ値1を返します。この値は、プログラムの異常終了の状態を示すために使用されます。
テーブルの作成に成功した場合、テーブルが正常に作成されたことを示す成功メッセージを出力します。
コード:
sprintf_s(sql_str, "CREATE TABLE test_tbl1(id NUMBER PRIMARY KEY, name VARCHAR2(50),age NUMBER NOT NULL)"); if (mysql_query(&con_oboracle, sql_str) != 0) { fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle)); mysql_close(&con_oboracle); return 1; } printf("Table created successfully\n");データを挿入します。
SQLクエリステートメントを実行して、テーブルにデータを挿入します。データの挿入が成功した場合は成功メッセージを出力し、失敗した場合はエラーメッセージを出力してプログラムを終了します。具体的な手順は以下のとおりです:
sprintf_s()関数を使用して、SQLクエリ文字列をフォーマットし、sql_str文字配列に格納します。このSQLクエリステートメントは、test_tbl1テーブルにデータを挿入するために使用されます。挿入するデータには、id、name、age列の値が含まれます。mysql_query()関数を使用して、SQLクエリステートメントを実行します。&con_oboracleはデータベース接続オブジェクトへのポインタであり、クエリ操作を実行する接続オブジェクトを指定するために使用されます。sql_strは実行するクエリステートメントです。その後、クエリの実行結果が成功したかどうかを確認します。クエリの実行に失敗した場合(戻り値が0ではない場合)、以下のコードブロックを実行します。fprintf()関数は、エラーメッセージを標準エラーストリームstderrに出力するために使用されます。fprintf()関数の最初のパラメータは出力ストリーム、"Error: %s\n"はフォーマット文字列、mysql_error(&con_oboracle)はフォーマット文字列内の%sを置き換える実際のパラメータです。mysql_error(&con_oboracle)は接続オブジェクトcon_oboracleのエラー情報を取得します。データベースとの接続を閉じ、接続オブジェクトのリソースを解放します。
データの挿入に失敗した場合、
return 1を使用してmain関数を終了し、非ゼロ値1を返します。これはプログラムが異常終了した状態を示します。
データの挿入に成功した場合、データが正常に挿入されたことを示す成功メッセージを出力します。
コード:
sprintf_s(sql_str, "INSERT INTO test_tbl1 (id,name,age) VALUES (1,'Tom', 18),(2,'Jerry', 20),(3,'Bob', 22)"); if (mysql_query(&con_oboracle, sql_str) != 0) { fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle)); mysql_close(&con_oboracle); return 1; } printf("Data inserted successfully\n");データをクエリします。
SQLクエリを実行してテーブル内のデータを取得し、取得したデータを行ごとに出力します。データの取得に成功した場合は成功メッセージを出力し、失敗した場合はエラーメッセージを出力してプログラムを終了します。具体的な手順は以下のとおりです:
sprintf_s()関数を使用して、SQLクエリ文字列をフォーマットし、sql_str文字配列に格納します。このSQLクエリステートメントは、test_tbl1テーブルからすべての列のデータを取得するために使用されます。mysql_query()関数を使用して、SQLクエリステートメントを実行します。&con_oboracleはデータベース接続オブジェクトへのポインタであり、クエリ操作を実行する接続オブジェクトを指定するために使用されます。sql_strは実行するクエリステートメントです。その後、クエリの実行結果が成功したかどうかを確認します。クエリの実行に失敗した場合(戻り値が0ではない場合)、以下のコードブロックを実行します。fprintf()関数は、エラーメッセージを標準エラーストリームstderrに出力するために使用されます。fprintf()関数の最初のパラメータは出力ストリーム、"Error: %s\n"はフォーマット文字列、mysql_error(&con_oboracle)はフォーマット文字列内の%sを置き換える実際のパラメータです。mysql_error(&con_oboracle)は接続オブジェクトcon_oboracleのエラー情報を取得します。データベースとの接続を閉じ、接続オブジェクトのリソースを解放します。
クエリに失敗した場合、
return 1を使用してmain関数を終了し、非ゼロ値1を返します。これはプログラムが異常終了した状態を示します。
mysql_store_result()関数を使用して、クエリ結果セットをMYSQL_RES構造体に格納します。&con_oboracleはデータベース接続オブジェクトへのポインタであり、結果セットを取得する接続オブジェクトを指定するために使用されます。結果セットが空かどうかを確認します。結果セットが空の場合、クエリ結果セットの格納に失敗したことを意味し、以下のコードブロックを実行します。
fprintf()関数は、エラーメッセージを標準エラーストリームstderrに出力するために使用されます。fprintf()関数の最初のパラメータは出力ストリーム、"Error: %s\n"はフォーマット文字列、mysql_error(&con_oboracle)はフォーマット文字列内の%sを置き換える実際のパラメータです。mysql_error(&con_oboracle)は接続オブジェクトcon_oboracleのエラー情報を取得します。データベースとの接続を閉じ、接続オブジェクトのリソースを解放します。
クエリ結果セットの格納に失敗した場合、
return 1を使用してmain関数を終了し、非ゼロ値1を返します。これはプログラムが異常終了した状態を示します。
データの取得に成功した場合、データが正常に取得されたことを示す成功メッセージを出力します。
MYSQL_ROW型の変数rowを定義し、各行のデータを格納します。mysql_fetch_row()関数を使用して結果セットのデータを1行ずつ取得し、各行のデータをrow変数に格納します。whileループは、結果セット内のすべての行が取得されるまで繰り返し実行されます。ループ内では、各行のデータを出力します。row[0]、row[1]、row[2]は、それぞれ現在の行の1番目、2番目、3番目の列の値を表します。
コード:
sprintf_s(sql_str, "SELECT * FROM test_tbl1"); if (mysql_query(&con_oboracle, sql_str) != 0) { fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle)); mysql_close(&con_oboracle); return 1; } MYSQL_RES* result = mysql_store_result(&con_oboracle); if (result == NULL) { fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle)); mysql_close(&con_oboracle); return 1; } printf("Data retrieved successfully\n"); MYSQL_ROW row; while ((row = mysql_fetch_row(result)) != NULL) { printf("id: %s, name: %s, age: %s\n", row[0], row[1], row[2]); }プログラム終了。
リソースを解放し、データベース接続を閉じます。具体的な手順は以下のとおりです:
mysql_free_result(result)を使用して、mysql_store_result()関数で格納された結果セットのリソースを解放します。resultはMYSQL_RES構造体へのポインタであり、クエリ結果セットの情報とデータを格納しています。mysql_close(&con_oboracle)を使用してデータベース接続を閉じ、接続オブジェクトが占有するリソースを解放します。&con_oboracleはデータベース接続オブジェクトへのポインタです。mysql_close()関数を呼び出すことで、データベース接続を閉じ、接続オブジェクトに関連するリソースを解放できます。return 0;を使用して、プログラムが正常に実行終了したことを示し、プログラムの終了ステータスとして0を返します。
コード:
mysql_free_result(result); mysql_close(&con_oboracle); printf("finish\n"); return 0; }
全コード表示
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#pragma comment(lib, "Shlwapi.lib")
#pragma comment( lib, "ws2_32.lib" )
#pragma comment(lib, "Crypt32.lib")
#pragma comment(lib, "Secur32.lib")
#pragma comment(lib, "obclnt.lib")
int main() {
MYSQL con_oboracle;
char sql_str[1024] = { 0 };
if (NULL == mysql_init(&con_oboracle)) {
fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle));
return 1;
}
printf("mysql_init() success\n");
if (NULL == mysql_real_connect(&con_oboracle, "your_ip", "your_user", "your_password", "your_schema", your_port, NULL, 0)) {
fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle));
return 1;
}
printf("mysql_real_connect() success\n");
sprintf_s(sql_str, "CREATE TABLE test_tbl1(id NUMBER PRIMARY KEY, name VARCHAR2(50),age NUMBER NOT NULL)");
if (mysql_query(&con_oboracle, sql_str) != 0) {
fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle));
mysql_close(&con_oboracle);
return 1;
}
printf("Table created successfully\n");
sprintf_s(sql_str, "INSERT INTO test_tbl1 (id,name,age) VALUES (1,'Tom', 18),(2,'Jerry', 20),(3,'Bob', 22)");
if (mysql_query(&con_oboracle, sql_str) != 0) {
fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle));
mysql_close(&con_oboracle);
return 1;
}
printf("Data inserted successfully\n");
sprintf_s(sql_str, "SELECT * FROM test_tbl1");
if (mysql_query(&con_oboracle, sql_str) != 0) {
fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle));
mysql_close(&con_oboracle);
return 1;
}
MYSQL_RES* result = mysql_store_result(&con_oboracle);
if (result == NULL) {
fprintf(stderr, "Error: %s\n", mysql_error(&con_oboracle));
mysql_close(&con_oboracle);
return 1;
}
printf("Data retrieved successfully\n");
MYSQL_ROW row;
while ((row = mysql_fetch_row(result)) != NULL) {
printf("id: %s, name: %s, age: %s\n", row[0], row[1], row[2]);
}
mysql_free_result(result);
mysql_close(&con_oboracle);
printf("finish\n");
return 0;
}
関連ドキュメント
OB Cloudデータベースへの接続方法の詳細については、接続方法の概要をご参照ください。
OceanBase Connector/Cの詳細については、OceanBase Connector/Cに関するドキュメントをご参照ください。