本記事では、OceanBase Connector/CとOceanBaseデータベースを使用してアプリケーションを構築し、テーブルの作成、データの挿入、データのクエリなどの基本操作を実装する方法について説明します。
前提条件
- OceanBaseデータベースがインストール済みで、Oracleモードのユーザーテナントが作成済みであること。OceanBaseデータベースのインストールの詳細については、デプロイの概要を参照してください。
- OceanBase Connector/Cドライバーがインストール済みであること。OceanBase Connector/CドライバープログラムのWindows版のインストールパッケージを入手するには、テクニカルサポートにお問い合わせください。
- Visual Studioがインストール済みであること。
操作手順
説明
本記事で示されている操作手順は、Windows環境下でVisual Studio Community 2019を使用して、このプロジェクトをコンパイルおよび実行する方法です。他のOS環境やコンパイラを使用している場合は、操作手順が若干異なる場合があります。
c-oceanbase-capiプロジェクトを開きます。c-oceanbase-capiプロジェクトのプロパティを設定します。- OceanBaseデータベースの接続情報を取得します。
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:OceanBaseデータベース接続情報を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -usys@oracle001 -p******
パラメータの説明:
-h:OceanBaseデータベースの接続IPアドレスを提供します。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。-P:OceanBaseデータベースの接続ポートを提供します。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズすることができます。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズすることができます。-u:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。-p:アカウントのパスワード。
その他の接続文字列の詳細については、OBClientを使用してOceanBaseテナントに接続するを参照してください。
ステップ4:c-oceanbase-capiプロジェクト内のデータベース接続情報の修正
ステップ3:OceanBaseデータベース接続情報を取得する に記載されている情報に基づいて、test_tbl1.cpp ファイル内のデータベース接続情報を修正します。
例:
if (NULL == mysql_real_connect(&con_oboracle, "xxx.xxx.xxx.xxx", "sys@oracle001", "******", "sys", 2881, 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ライブラリ、暗号化ライブラリ、セキュリティライブラリ、およびOceanBaseデータベースクライアントライブラリです。
コード:
#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() { // 接続インスタンスオブジェクトの作成 // データベースへの接続 // テーブルの作成 // データの挿入 // データのクエリ // ... }変数と配列を宣言します。
- MYSQL型の
con_oboracleという変数を宣言します。この変数を宣言することで、接続インスタンスを作成できます。 - 長さが
1024のsql_strという文字配列を宣言し、{ 0 }で初期化します。この配列は、SQLクエリステートメントを格納するために使用されます。
コード:
MYSQL con_oboracle; char sql_str[1024] = { 0 };- MYSQL型の
接続インスタンスオブジェクトを初期化します。
接続オブジェクト
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関数から非ゼロ値を返して終了します。この値はプログラムの異常終了または初期化失敗の状態を表すために使用できます。
初期化に成功した場合、成功メッセージを出力します。これにより、コンソールで接続オブジェクトの初期化に成功したかどうかを確認できます。
コード:
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");OceanBaseデータベースへの接続に必要なパラメータの説明:
your_ip:OceanBaseデータベースの接続IPアドレスを提供します。ODP接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。your_user:テナントの接続アカウント。ODP接続方式の形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。your_password:アカウントのパスワード。your_schema:アクセスするスキーマ名です。your_port:OceanBaseデータベースの接続ポートを提供します。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズすることができます。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズすることができます。
テーブルを作成します。
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クエリを実行してテーブルからデータを取得し、取得したデータを1行ずつ出力します。データのクエリに成功した場合、成功メッセージを出力します。データのクエリに失敗した場合、エラーメッセージを出力してプログラムを終了します。具体的な手順は以下のとおりです:
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()関数を使用して、結果セットから行ごとにデータを検索し、各行のデータを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;
}
関連ドキュメント
OceanBaseデータベースへの接続に関する詳細については、接続方法の概要を参照してください。
OceanBase Connector/Cの詳細については、OceanBase Connector/Cを参照してください。
クリックしてc-oceanbase-capiサンプルプロジェクトをダウンロード