ODBCとは、Open DataBase Connectivityの略で1992年Microsoft社が提唱し、後に広く無償で公開された広義のDBやSQLをサポートしたRDB・リレーショナルデータベースに接続する為の標準技術・規格となったC言語ベースのAPI/Application Program Interface(Application Programming Interface)です。
ODBCからJava用APIとして派生したものにJDBCがあります。
尚、ODBCでは、RDBだけでなくExcelをはじめとする表計算ソフトやテキストファイル、電子メールデータ等々、広義のデータベースに接続することができます。
ODBCは、1995年The Open GroupによってSQL/CLIとして標準化され、ODBCは、この標準化されたCLIをベースとした技術という位置づけになっており、環境(実装、処理系)に依存しないデータベースアクセス技術として国際標準となっています。
このSQL/CLIのCLIは、CLI/Call Level Interface(呼び出しレベルインタフェース≒呼び出して使うインタフェース≒埋め込みではないインタフェース≒動的インタフェース)ですが、同様にCLIと呼ばれるものに、やはり同社の.NET Frameworkのベースとなる技術としても公開されている世界標準CLI/Common Language Infrastructure(共通言語基盤)がありますが、これらは全く異なるもので「C++/CLI」は、「Standard ECMA-372(1st Edition:2005/12)」として標準化団体Ecma Internationalによって標準化されています。
ウェブシステムやクライアントサーバーシステム上では、一般にデータベースはサーバ上にあり、ネットワークを介してアクセスしますが、ISAM/Indexed Sequential Access Method(索引付き順次アクセスメソッド)を採用した、いわゆるOracle、SQL Server、PostgreSQL、MySQL等々のRDBMSにアクセスする際にはSQLを利用します。
その際、SQLをサポートしない一般的なプログラミング言語とRDBMSを仲介する「標準的な専用のミドルウェア」という技術領域を確立したのもODBC(SQL/CLI)であると言ってもいいでしょう。
様々なプログラム言語が様々なDB/RDBに接続する事ができるのは橋渡しをしてくれるこれら複数のRDB対応のODBC等の規格が存在するからとも言えますし、そもそも各プログラム言語がそれぞれにRDBに接続する為に機能を実装することは現実的ではありません。
なぜなら標準的な規格がない場合、RDBに仕様の変更や追加があった場合を想定すると各プログラム言語において対応しなければならなくなりますし、プログラム言語が実装する事自体プログラムが重くなる一因となりますが、標準の規格があれば、その基準に合わせ、影響のでないように仕様変更・拡張を検討する事もできますし、対応ができるからです。
但し、プログラミング言語やスクリプト言語、RDBMSの違いがODBC(SQL/CLI)の拡張としての派生という形で存在する為、やや仕方ない感もあるものの、それを勘案しても若干標準化の有用性が削がれている感は否めません。
尚、Perlから利用できるデータベース接続インタフェースの1つにDBD/DBIがあり、DBDは各RDBへの専用インタフェースを含むモジュールで、その汎用(共通)インタフェースがDBIで、Oracle/SQL Server/MySQL/PostgreSQL...etc.に利用できます。
ODBCは、CベースのAPIでUNIX/Linux Cまたは、VC(VCを包含するVC++)やC++/VC++によって以下の例のように汎用ODBCドライバを一から書くこともできますし、別途、比較的簡単なMFCを利用する方法もあります。
SQLGetData()メソッド
【第1引数】hStmt:必須
HandleSTateMenT/ステートメントハンドル
【第2引数】(col_num):必須
テーブル上のカラム(列)番号
【第3引数】SQL_C_DATATYPE:必須
ANSIまたはUnicodeにおけるCのデータ型:ODBC C Data Types参照
SQL_C_CHAR/SQL_C_VARCHAR/SQL_C_NUMERIC/SQL_C_FLOAT...etc.
【第4引数】(var):必須
データを格納するポインタ変数
【第5引数】length:必須
データ長(バッファサイズ)
【第6引数】actual_size:必須
データ長(実際のバイト数)
尚、SQLGetData()ではなく、SQLBindCol()メソッドで予め変数と列データを結びつけ(バインドし)ておくこともできます。
SQLBindCol()メソッドは、SQLGetData()メソッドと全く同じ書式、引数で記述することができ、メソッド名と記述する場所だけが異なります。
つまり、SQLBindCol()メソッドは、SQLExecDirect()メソッドによるSELECT文発行の直後からSQLFetch()メソッドを伴うwhileループより前にSQLGetData()メソッドと同じ書式で記述します。