ODBC (Open Database Connectivity)は、リレーショナル・データベース・マネージメント・システム (RDBMS) にアクセスするための共通インタフェースです。
ODBC (Open Database Connectivity) は、リレーショナル・データベース・マネージメント・システム (RDBMS) にアクセスするための共通インタフェースです。
呼び出しレベル・インタフェース (Call Level Interface: CLI) が統一されていることにより、アプリケーションが呼び出すAPIの仕様が、複数の異なるRDBMS間で統一されています。
ODBCアプリケーションでは、データベース接続やSQL文などの基本的な機能をハンドルを使用して定義し、一連のリソースを管理している。
識別子 | 説明 | データ型 |
---|---|---|
SQL_HANDLE_ENV | 環境ハンドル | SQLHENV |
SQL_HANDLE_DBC | データベース接続ハンドル | SQLHDBC |
SQL_HANDLE_STMT | ステートメント・ハンドル | SQLHSTMT |
SQL_HANDLE_DESC | 記述子ハンドル | SQLHDESC |
ODBC関数の戻り値のデータ型は SQLRETURN である。ODBC関数の戻り値を表す識別子がヘッダファイルで定義されている。ODBC関数の戻り値を次の表に示す。
戻り値 | 意味 | 診断情報 |
---|---|---|
SQL_SUCCESS | 正常に終了した | なし |
SQL_SUCCESS_WITH_INFO | 正常に終了した | あり |
SQL_NO_DATA_FOUND | これ以上のデータなし | なし |
SQL_ERROR | 失敗した | あり |
SQL_INVALID_HANDLE | 無効なハンドルがパラメータとして渡された | なし |
ODBC関数呼び出しの戻り値が SQL_ERROR または SQL_SUCCESS_WITH_INFO だった場合、診断情報が生成されます。次のODBC関数を呼び出すことにより、診断情報を取得することができます。
ただし、これらの関数自体が診断情報を生成することはありません。
次のODBC関数を呼び出すことにより、ハンドルを割り当てることができます。
ODBCバージョン3より前のバージョンでは、SQLAllocEnvやSQLAllocConnect、SQLAllocStmtのように、割り付けるハンドルの種類ごとに関数が分かれていましたが、ODBCバージョン3からSQLAllocHandle関数に統一されました。
環境ハンドルおよびデータベース接続ハンドルを割り当てる例を次に示します。
SQLHENV henv;
SQLHDBC hdbc;
SQLRETURN rc;
/* 環境ハンドルの割り当て */
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
/* データベース接続ハンドルの割り当て */
rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
...
}
/* データベース接続ハンドルの解放 */
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
/* 環境ハンドルの解放 */
SQLFreeHandle(SQL_HANDLE_ENV, henv);
アプリケーションは、環境ハンドルとデータベース接続ハンドルを割り付けてからデータ・ソースに接続します。接続には、次の3種類のいずれかのODBC関数を使用します。
SQLConnect関数は最も簡単な接続関数で、データ・ソース名 (DSN)とユーザー名、パスワードを指定して、データ・ソースに接続します。
SQLDriverConnect関数は、接続文字列を指定してデータ・ソースに接続します。接続文字列には、データ・ソース名やユーザー名、パスワードだけでなく、様々な属性を指定することができます。ただし、プラットフォームに依存するため、汎用性が無くなることがあります。
データ・ソースとの接続を確立した後、SQLSetConnectOption関数を使用して、接続オプションを指定することができます。
ODBCには、SQL文を実行するために2つの方法が用意されています。
直接実行する場合、SQLExecDirect関数でSQL文を直接実行します。
準備後に実行する場合、あらかじめSQLPrepare関数でSQL文を準備しておき、SQLExecute関数で実行します。同じSQL文を繰り返し実行する場合には、準備しておいたSQL文を実行した方がパフォーマンスが向上します。
SQL文を実行した後、結果セットを取り出します。
SQLの実行結果(列)とアプリケーション・プログラム変数を関連付けるには、SQLBindCol関数でバインドします。
結果セットから1行ずつ行を取り出すには、SQLFetch関数を使用します。
結果セットからまとめて行を取り出すには、SQLExtendedFetch関数を使用します。
ODBCの仕様では、デフォルトで自動コミットが有効になっています。自動コミットのON/OFFを切り替えるには、SQLSetConnectOption関数を使用します。
自動コミットが有効な場合、SQL文を実行するたびに自動的にコミットが行われます。したがって、明示的にコミットを行う必要はありませんが、ロールバックすることができません。
自動コミットが無効な場合、コミットおよびロールバックを明示的に行うことができます。ODBCでは、 COMMIT や ROLLBACK などのSQL文でトランザクション制御は行いません。トランザクション制御は SQLTransact関数で行います。
データベースとの切断を行うには、SQLDisconnect関数を使用します。
データベースとの接続を確立する関数には、SQLConnectとSQLDriverConnectの2種類ありますが、どちらを使用して接続した場合でもSQLDisconnect関数で切断することができます。
次のODBC関数を呼び出すことにより、ハンドルを解放することができます。
ODBCバージョン3より前のバージョンでは、SQLFreeConnect関数やSQLFreeEnv関数のように、解放するハンドルの種類ごとに関数が分かれていましたが、ODBCバージョン3からSQLFreeHandle関数に統一されました。
SQLAllocConnect関数は、データベース接続ハンドルと関連するリソースを割り当てるODBC関数です。SQLAllocConnect関数を呼び出す前に、SQLAllocEnv関数を呼び出して環境ハンドルを割り当てる必要があります。
ODBCバージョン3からは、SQLAllocHandle関数に置き換えられました。
SQLRETURN SQLAllocConnect(
SQLHENV henv,
SQLHDBC *phdbc
);
SQLAllocConnectは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効な環境ハンドル |
SQLAllocEnv関数は、環境ハンドルと関連するリソースを割り当てるODBC関数です。
ODBCバージョン3からは、SQLAllocHandle関数に置き換えられました。
SQLRETURN SQLAllocEnv(SQLHENV *phenv);
SQLAllocEnvは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQLAllocHandle関数は、ハンドルを割り付けるODBC関数です。
SQLRETURN SQLAllocHandle(
SQLSMALLINT iType
SQLINTEGER hParent,
SQLINTEGER *pHandle
);
識別子 | ハンドルの種類 |
---|---|
SQL_HANDLE_ENV | 環境ハンドル |
SQL_HANDLE_DBC | データベース接続ハンドル |
SQL_HANDLE_STMT | ステートメント・ハンドル |
SQL_HANDLE_DESC | 記述子ハンドル |
割り当てるハンドルの種類 | 親項目のハンドル |
---|---|
環境ハンドル | 無し (SQL_NULL_HANDLE )
|
データベース接続ハンドル | 環境ハンドル |
ステートメント・ハンドル | データベース接続ハンドル |
環境ハンドルには親項目が存在しませんので、親項目のハンドルの代わりに、識別子
SQL_NULL_HANDLE
を指定します。
項目 | ハンドルの型 |
---|---|
環境ハンドル | SQLHENV |
データベース接続ハンドル | SQLHDBC |
ステートメント・ハンドル | SQLHSTMT |
記述子ハンドル | SQLHDESC |
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なハンドル |
SQLAllocStmt() は新規のステートメント・ハンドルを割り当て、このハンドルをデータベース接続ハンドルで指定した接続に関連付けます。 SQLAllocStmt() を呼び出す前に SQLConnect()を呼び出す必要があります。
ODBCバージョン3からは、SQLAllocHandle関数に置き換えられました。
SQLRETURN SQLAllocStmt(
SQLHDBC hdbc,
SQLHSTMT *phstmt
);
SQLAllocStmtは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なデータベース接続ハンドル |
SQLBindCol() はアプリケーション・プログラム変数に対して列をバインドします。通常、 SQLBindCol() を呼び出す前に SQLExecDirect()を呼び出します。
SQLRETURN SQLBindCol(
SQLHSTMT hstmt,
SQLSMALLINT iCol,
SQLSMALLINT fType,
SQLPOINTER pValue,
SQLINTEGER cbValueMax,
SQLLEN *pcbValue
);
SQLBindColは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なステートメント・ハンドル |
SQLConnect関数は、データベースへの接続を確立するODBC関数です。SQLConnect関数を呼び出す前に、データベース接続ハンドルを割り当てる必要があります。
SQLRETURN SQLConnect(
SQLHDBC hdbc,
SQLCHAR *szDSN,
SQLSMALLINT cbDSN,
SQLCHAR *szUID,
SQLSMALLINT cbUID,
SQLCHAR *szPsw,
SQLSMALLINT cbPsw
);
SQLConnectは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なデータベース接続ハンドル |
SQLDisconnectは接続ハンドルと関連する接続をクローズします。
SQLRETURN SQLDisconnect(SQLHDBC hdbc);
SQLDisconnectは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なデータベース接続ハンドル |
SQLDriverConnect関数は、データベースへの接続を確立するODBC関数で、SQLConnectの代替関数です。
SQLRETURN SQLDriverConnect(
SQLHDBC hdbc,
SQLHWND hWindow,
SQLCHAR *szConnStr,
SQLSMALLINT cbConnnStr,
SQLCHAR *szConnOut,
SQLSMALLINT cbConnOutMax,
SQLSMALLINT *pcbConnOut,
SQLSMALLINT fDriverConpletion
);
属性 | 説明 |
---|---|
DSN | データ・ソース名 |
UID | ユーザーID |
PWD | ユーザーIDに対応したパスワード |
SQLDriverConnectは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なデータベース接続ハンドル |
SQL_NO_DATA_FOUND | データが無い |
SQLRETURN rc;
SQLHDBC hDbc;
SQLCHAR szConnStr[] = "DSN=SalesDB;UID=scott;PWD=tiger;";
SQLCHAR szConnOut[255];
SQLSMALLINT cbConnOut;
rc = SQLDriverConnect(hDbc,
NULL
szConnStr,
SQL_NTS,
szConnOut,
255,
&cbConnOut,
SQL_DRIVER_NOPROMPT);
SQLError 関数は、診断情報を取得します。他の関数呼び出しの戻り値がSQL_ERRORまたはSQL_SUCCESS_WITH_INFOだったときに、情報を取得できます。
ODBCバージョン3からは、SQLGetDiagRec関数に置き換えられました。
SQLRETURN SQLError(
SQLHENV henv,
SQLHDBC hdbc,
SQLHSTMT hstmt,
SQLCHAR *szSqlState,
SQLINTEGER *pfNativeError,
SQLCHAR *szErrorMsg,
SQLSMALLINT cbErroMsgMax,
SQLSMALLINT *pcbErrorMsg
);
SQLErrorは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なハンドル |
SQL_NO_DATA_FOUND | エラー無し |
SQLExecDirect関数は、指定されたSQLステートメントを直接実行するODBC関数です。
SQLRETURN SQLExecDirect(
SQLHSTMT hstmt,
SQLCHAR szSqlStr,
SQLINTEGER cbSqlStr
);
SQLExecDirectは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なステートメント・ハンドル |
SQL_NO_DATA_FOUND | SQL文の検索条件に合う行が無い |
SQLExecute関数は、SQLPrepare関数で準備されたSQL文を実行するODBC関数です。
SQLRETURN SQLExecute(SQLHSTMT hstmt);
SQLExecuteは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なステートメント・ハンドル |
SQL_NO_DATA_FOUND | SQL文の検索条件に合う行が無い |
SQLExtendedFetch関数は、各バインド列ごとに複数の行が入った行セットを戻すことで、SQLFetch関数の機能を拡張をします。
SQLRETURN SQLExtendedFetch(
SQLHSTMT hstmt,
SQLSMALINT fFetchOrientation,
SQLINTEGER FetchOffset,
SQLINTEGER *pRowCount,
SQLSMALLINT *RowStatusArray
);
SQLExtendedFetchは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なステートメント・ハンドル |
SQL_NO_DATA_FOUND | 結果セットに行が無い |
SQLFreeConnect関数は、SQLAllocConnect関数で割り付けた接続ハンドルを解放するODBC関数です。
ODBCバージョン3からは、SQLFreeHandle関数に置き換えられました。
SQLRETURN SQLFreeConnect(SQLHDBC hdbc);
SQLFreeConnectは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なデータベース接続ハンドル |
SQLFetch() は結果セットの次の行にカーソルを進め、バインド列を更新します。
SQLRETURN SQLFetch(SQLHSTMT hstmt);
SQLFetchは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なステートメント・ハンドル |
SQL_NO_DATA_FOUND | 結果セットに行が無いか、結果セットの全ての行の取り出しが完了した |
SQLFreeEnv関数は、SQLAllocEnv関数で割り付けた環境ハンドルを解放するODBC関数です。
ODBCバージョン3からは、SQLFreeHandle関数に置き換えられました。
SQLRETURN SQLFreeEnv(SQLHENV henv);
SQLFreeEnvは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効な環境ハンドル |
SQLFreeHandle 関数は、SQLAllocHandle関数で割り付けたハンドルを解放するODBC関数です。
SQLRETURN SQLFreeHandle(
SQLSMALLINT iType,
SQLINTEGER iHandle
);
解放するハンドルの種類を示す識別子を指定します。指定できる識別子は、次のとおりです。
識別子 | ハンドルの種類 |
---|---|
SQL_HANDLE_ENV | 環境ハンドル |
SQL_HANDLE_DBC | 接続ハンドル |
SQL_HANDLE_STMT | ステートメント・ハンドル |
SQL_HANDLE_DESC | 記述子ハンドル |
SQLFreeHandleは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なハンドル |
SQLFreeStmt() はステートメント・ハンドルを解放します。 SQLFreeStmt() を呼び出す前に SQLAllocStmt()を呼び出す必要があります。
SQLRETURN SQLFreeStmt(
SQLHSTMT hstmt,
SQLSMALLINT fOption
);
識別子 | 説明 |
---|---|
SQL_CLOSE | ステートメント・ハンドルをクローズして、保留中の結果は破棄する。 |
SQLFetchは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なステートメント・ハンドル |
SQLGetDiagRec関数は、診断情報を取得します。他のODBC関数呼び出しの戻り値がSQL_ERRORまたはSQL_SUCCESS_WITH_INFOだったときに、診断情報を取得できます。
SQLRETURN SQLGetDiagRec(
SQLSMALLINT iType,
SQLINTEGER handle,
SQLSMALLINT recNum,
SQLCHAR *szSqlState,
SQLINTEGER *pfNativeError,
SQLCHAR *szErrorMsg,
SQLSMALLINT cbErroMsgMax,
SQLSMALLINT *pcbErrorMsg
);
識別子 | ハンドルの種類 |
---|---|
SQL_HANDLE_ENV | 環境ハンドル |
SQL_HANDLE_DBC | 接続ハンドル |
SQL_HANDLE_STMT | ステートメント・ハンドル |
SQL_HANDLE_DESC | 記述子ハンドル |
SQLGetDiagRecは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なハンドル |
SQL_NO_DATA_FOUND | エラー無し |
SQLGetInfoは、一般情報を取得するODBC関数です。
SQLRETURN SQLGetInfo(
SQLHDBC hdbc,
SQLSMALLINT fInfoType,
SQLPOINTER pInfoValue,
SQLSMALLINT cbInfoValueMax,
SQLSMALLINT *pcbInfoValue
);
値 | 形式 | 説明 |
---|---|---|
SQL_DATA_SOURCE_NAME | 文字列 | 接続先のデータソース名 |
SQL_DBMS_NAME | 文字列 | DBMSの製品名 |
使用するDBMS固有の情報タイプを指定できることがあります。
SQLGetInfoは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なデータベース接続ハンドル |
SQLPrepare関数は、SQL文を準備するODBC関数です。準備したSQL文は、SQLExecute関数で実行することができます。
SQLRETURN SQLPrepare(
SQLHSTMT hstmt,
SQLCHAR szSqlStr,
SQLINTEGER cbSqlStr
);
SQLPrepareは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なステートメント・ハンドル |
SQLSetConnectOption関数は、接続オプションを指定するODBC関数です。
SQLRETURN SQLSetConnectOption(
SQLHDBC hdbc,
SQLSMALLINT fOption,
SQLPOINTER pvParam
);
識別子 | 意味 |
---|---|
SQL_AUTOCOMMIT | 自動コミットのON/OFFを指定します。ODBCの仕様では、自動コミットはONがデフォルトです。 |
引数 fOption にSQL_AUTOCOMMITを指定した場合は、次の値を指定することができます。
識別子 | 意味 |
---|---|
SQL_AUTOCOMMIT_ON | 自動コミットON |
SQL_AUTOCOMMIT_OFF | 自動コミットOFF |
SQLSetConnectOptionは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_SUCCESS_WITH_INFO | 成功(警告あり) |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なデータベース接続ハンドル |
SQLTransact関数は、接続中の現在のトランザクションをコミットまたはロールバックするODBC関数です。
SQLRETURN SQLTransact(
SQLHENV henv,
SQLHDBC hdbc,
SQLSMALLINT fType
);
識別子 | 意味 |
---|---|
SQL_COMMIT | コミット |
SQL_ROLLBACK | ロールバック |
SQLTransactは次に示すSQLRETURN型の戻り値を返す。
戻り値 | 説明 |
---|---|
SQL_SUCCESS | 成功 |
SQL_ERROR | 失敗 |
SQL_INVALID_HANDLE | 無効なハンドル |