このトピックでは、MySQL 用 Open Database Connectivity(ODBC)ドライバーを使用して C または C++ アプリケーションを開発する方法について説明します。
前提条件
インスタンスで MySQL 互換機能が有効になっていること。詳細については、MySQL 互換機能を有効にするをご参照ください。
クライアントの IP アドレスが Lindorm インスタンスのホワイトリストに追加されていること。詳細については、ホワイトリストを構成するをご参照ください。
手順
MySQL 公式 Web サイトから MySQL 用 ODBC ドライバーをダウンロードしてインストールします。
接続コンポーネント unixODBC をインストールします。次のコマンドは、Linux に unixODBC をインストールする例を示しています。
yum install unixODBC-develodbcinst.ini 設定ファイルの MySQL 依存関係を変更します。
[MySQL] Description = ODBC for MySQL Driver = /usr/lib/libmyodbc8a.so Setup = /usr/lib/libmyodbc8w.so Driver64 = /usr/lib64/libmyodbc8a.so Setup64 = /usr/lib64/libmyodbc8w.so FileUsage = 1次の表は、ファイル内で構成できるパラメーターについて説明しています。
パラメーター
説明
Description
MySQL 依存関係の説明。カスタムの説明を指定できます。
Driver
ODBC ドライバー。このパラメーターには、ODBC ドライバーが格納されているパスを設定します。
Setup
ODBC ドライバーのインストーラー。このパラメーターには、ODBC ドライバーのインストーラーが格納されているパスを設定します。
Driver64
64 ビット ODBC ドライバー。このパラメーターには、64 ビット ODBC ドライバーが格納されているパスを設定します。
Setup64
64 ビット ODBC ドライバーのインストーラー。このパラメーターには、64 ビット ODBC ドライバーのインストーラーが格納されているパスを設定します。
FileUsage
このパラメーターのデフォルト値は 1 です。この値は変更しないでください。
接続パラメーターを構成します。
ret = SQLDriverConnect(dbc, NULL, (SQLCHAR*)"DRIVER={MySQL};SERVER=ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com;PORT=33060;DATABASE=default;USER=user;PASSWORD=test", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);パラメーター
PASSWORD
パラメーター
説明
DRIVER
MySQL 用 ODBC ドライバーの名前。このパラメーターには、odbcinst.ini ファイルで構成された MySQL 依存関係名を設定します。
SERVER
MySQL 用の [lindormtable エンドポイント]。エンドポイントの取得方法の詳細については、エンドポイントの表示をご参照ください。
重要アプリケーションが ECS インスタンスにデプロイされている場合は、セキュリティの向上とネットワークレイテンシの低減のために、VPC を使用して Lindorm インスタンスに接続することをお勧めします。
アプリケーションがローカルサーバーにデプロイされていて、インターネット経由で Lindorm インスタンスに接続する必要がある場合は、Lindorm コンソールでインスタンスのインターネットエンドポイントを有効にするために、次の手順を実行できます。左側のナビゲーションペインで、 を選択します。[ワイドテーブルエンジン] タブで、[パブリックエンドポイントを有効にする] をクリックします。
VPC を使用して Lindorm インスタンスにアクセスする場合は、SERVER の値に MySQL 用の [lindormtable VPC エンドポイント] を指定します。VPC を使用して Lindorm インスタンスにアクセスする場合は、SERVER の値に MySQL 用の [lindormtable インターネットエンドポイント] を指定します。
PORT
MySQL を使用して LindormTable にアクセスするために使用するポート。このパラメーターの値は 33060 に固定されています。
DATABASE
接続先のデータベースの名前。デフォルトでは、クライアントは default という名前のデータベースに接続されます。
USER
パスワードを忘れた場合は、LindormTable のクラスター管理システムでパスワードを変更できます。詳細については、ユーザーの管理をご参照ください。
LindormTable に接続するために使用するパスワード。
接続を確立し、LindormTable SQL を使用して LindormTable で操作を実行します。次のコードブロックは、LindormTable SQL を使用してすべてのデータベースを照会する例を示しています。
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { printf("Connection established. \n"); // クエリを実行します。 SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); SQLExecDirect(stmt, (SQLCHAR*)"show databases", SQL_NTS); // クエリ結果を取得します。 SQLCHAR result[50]; while (SQLFetch(stmt) == SQL_SUCCESS) { SQLGetData(stmt, 1, SQL_C_CHAR, result, sizeof(result), NULL); printf("database: %s\n", result); } // リソースを解放します。 SQLFreeHandle(SQL_HANDLE_STMT, stmt); SQLDisconnect(dbc); } else { SQLCHAR sqlState[6]; SQLCHAR msg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER nativeError; SQLSMALLINT actualMsgLen; SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, sqlState, &nativeError, msg, sizeof(msg), &actualMsgLen); printf("Connection failed: %s\n", msg); } // リソースを解放します。 SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_ENV, env); return 0; }
サンプルコード
次のコードは、ODBC ドライバーを使用して LindormTable に接続して使用する方法の完全な例を示しています。
#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlext.h>
int main() {
// 接続情報を定義します。
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
// 環境を初期化します。
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
// 接続を確立します。
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
SQLSetConnectAttr(dbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, SQL_IS_INTEGER);
// lindorm_mysql_url を MySQL 用の LindormTable エンドポイントに、database を接続先のデータベースに、lindorm_user を LindormTable に接続するために使用するユーザー名に、lindorm_password を LindormTable に接続するために使用するパスワードに設定します。
ret = SQLDriverConnect(dbc, NULL, (SQLCHAR*)"DRIVER={MySQL};SERVER=ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com;PORT=33060;DATABASE=default;USER=user;PASSWORD=test", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
printf("Connection established. \n");
// クエリを実行します。
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
SQLExecDirect(stmt, (SQLCHAR*)"show databases", SQL_NTS);
// クエリ結果を取得します。
SQLCHAR result[50];
while (SQLFetch(stmt) == SQL_SUCCESS) {
SQLGetData(stmt, 1, SQL_C_CHAR, result, sizeof(result), NULL);
printf("database: %s\n", result);
}
// リソースを解放します。
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(dbc);
}
else {
SQLCHAR sqlState[6];
SQLCHAR msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER nativeError;
SQLSMALLINT actualMsgLen;
SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, sqlState, &nativeError, msg, sizeof(msg), &actualMsgLen);
printf("Connection failed: %s\n", msg);
}
// リソースを解放します。
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 0;
}現在のインスタンスに default という名前のデータベースのみが含まれている場合、次の結果が返されます。
Connection established.
database: default
database: information_schema