Windows環境にてC言語やC++でODBCを使うには1

ODBCとは Open Database Connectivityのことで,データベースに接続するオープンな規格のこと。

ODBCを一言で言うとアプリケーションとデータベース間の接続の共通ルール。

特定のデータベースだけに依存しないデータベースへの接続手段を提供している。
データベースはODBC用にドライバーを用意してやれば,お手軽にデータベースへのアクセスできる手段を用意できる。

これは データベースを使うプログラムを書く人でないと,あまり意識する必要はないが,データベースを使うソフトウエアをインストールするときは,ODBC用のドライバをインストールしないと動かないといったトラブルが発生する。


ODBCを使う場合と,使わない場合の違いは以下の通り

ODBCを使った場合のデータベースとアプリケーションの通信関係
[アプリケーションプログラム] = [ODBC] = [ODBC用ドライバ] = [データベースドライバ ] = [データベース本体]

ODBCを使わない場合のデータベースとアプリケーションの通信関係
[アプリケーションプログラム] = [データベースドライバ] = [データベース本体]

ODBCを使わない場合は,データベースごとにデータベースドライバに合わせたプログラムを記述しなければならず,新しいデータベースを採用すると,新たに,新しいデータベースのデータベースドライバの使い方を勉強しなければならない。

ODBCを使う場合は,データベースが変わったとしても,プログラムの変更は,接続手続きのODBCに登録しているデータベースドライバ名,データベース名,データベースに接続するためのIDやパスワード等の再設定と,データベースごとに依存するSQLの調整を行うだけですむ。もちろん,この作業は,ODBCを使わない場合でも必須となる。

つまり,ODBCを使えば,プログラムの再利用性がアップし,新しいデータベースを採用した場合でも同じ手順,同じ関数でデータベースにアクセスできる。
これは,作業量・作業時間の低下とバグの混入率を下げる働きがある。

そのため,データベースを使いたいアプリケーション製作者にとって大きな恩恵を受けることが出来る。

ODBCの長所は
任意のデータベースに対して接続・切断・SQL命令の発行が同一の手続で行える。

ODBCの短所は
ODBCはデータベースへの最初の接続開始時に多少時間がかかる(数秒程度)

 共通化できているといえども,共通化できていない部分はある。それは,データベースごとに接続の手続きが若干異なることと,データベース固有のSQL構文が使えることにある。このことは長所でもあり,短所でもある。

 現実的なアプリケーションを作成するには,共通部分しか出来ないようにすると不便な点が多いため,データベース固有の命令や手順が出来るようになっているほうがよい場合が多い。

参考 JDBCについて:
 ODBCとよく似ているものに JDBCがある。これは Javaにおいて,ODBC相当の機能を使えるようにしたもの。ODBCはどんなプログラミング言語からでも使えるが,JDBCは,Javaからしか使えない。ただ,JDBCからODBCへの接続も可能なので,JavaからODBCを使えるようにもしている機能も持つ。

JDBCについて:
http://java.sun.com/j2se/1.3/ja/docs/ja/guide/jdbc/getstart/GettingStartedTOC.fm.html

JDBC-ODBCについて:
http://java.sun.com/j2se/1.3/ja/docs/ja/guide/jdbc/getstart/bridge.doc.html

------------------------------------
ここまでが,前提知識。


さて本題。
「Windows環境にてC言語やC++でODBCを使うには」

データベースのODBCのドライバーを登録しておくこと。

 データベースで手軽にテストできるのが,表計算ソフトのExcelだろう。結果を見るのもExcelの文章を開くだけで済む。また,仕事で使われているほとんどのコンピュータにあらかじめインストールされている。

 ちなみにExcelはインストールすると,自動でExcel用のODBCドライバもインストールしてしまう。まぁ,Accessを持っている人は,Accessの方が分かりやすいかな。Accessも同じく,インストールすると,自動でAccess用のODBCドライバをインストールする。


準備:
当たり前だが,データベースが正常に動作していること。
そのデータベースのODBCが正しく登録されていること。

ODBCの登録状態を確認するには,Win9X系では,コントロールパネルのODBCドライバ(32Bit版)を開く。
Win2000/XP等では,コントロールパネルの「管理ツール」の中に「データベース(ODBC)」があるので,それを開く。

データベースへの接続の設定をODBCに登録する場合:
 「ユーザDSN」か「システムDSN」に自分が使いたいデータベースが登録されているかどうか確認する。なければ,登録する。登録するときに,自分が使いたいデータベースのドライバがない場合は,別途入手してインストールする必要がある。
 なお,ODBCでは,ここに登録していなくても,直接IDやパスワードを指定して接続できる。登録するほうが,アプリケーションの作成が楽で汎用性があがるが,アプリケーションのインストール時にちゃんと登録が行われていないと,アプリケーションがデータベースに接続できなくなる。また,保守・メンテナンスが楽になる。

データベースへの接続の設定をODBCに登録しない場合:
「ドライバ」を見て,自分が使いたいデータベースに対応した,ODBCドライバがインストールされているかどうか確認。されていない場合は,別途入手してインストールする必要がある。

ここでは,お手軽に使うため,Excelのドライバを使うことにする。
ExcelのODBCドライバ名は,
Microsoft Excel Driver (*.xls)
となっている。これは,データベース接続設定をODBCに登録する方式のDSNを使わずに直接接続データベースにするときにこの文字列を使う。

さて,ここからWindows上のC言語でのコーディングのお話

準備:

ODBCを使うプログラムに必要な #include文

#include <windows.h>
#include <sql.h>
#include <sqlext.h>

ODBCを使うプログラムのリンク時に必要なライブラリ
odbc32.lib

これは,Visual C++の環境ならば,C言語のプログラムに
#pragma comment(lib, "odbc32.lib")
を追加しておけば,リンク時に odbc32.lib を追加ライブラリとして自動で追加される。


プログラムコーディング上のデータベースへの接続方法(流れ)の概念


ODBCの環境を用意  SQLAllocEnv();
|データベースへの接続 SQLAllocConnect(); と SQLDriverConnect();等
||SQLステートメント開始・SQL文発行 SQLAllocStmt() と SQLExecDirect();等
|||戻ってきたフィールド名などを取得 SQLDescribeCol(); と SQLNumResultCols();等
|||戻ってきたフィールドの値を取得  SQLFetch(); 等
||SQLステートメントを終了する SQLFreeStmt();
|データベースの接続を閉じる SQLDisconnect(); と SQLFreeConnect();
ODBC環境の後始末 SQLFreeEnv();


これらの内側では,開始,終了が何度も行える。
例えば,1回のデータベース接続で,複数回数のSQL構文を発行でき,複数回のテーブルによる結果の取得が出来る。

SQLによっては結果のテーブル取得が不必要な場合もあるので,その場合はすぐに,SQLの実行を終了する。

ODBC系の関数の名前のルール

関数名は SQL で始まる。

何か,新しいことをするには, SQLAlloc何とか を使ってはじめる。
終わるときは,閉じる処理後に, SQLFree何とか を使って終わる。

何とかとは・・・
Env  ODBCの環境・・・これを用意してやることで,ODBC関係の関数が使える
Connect  データベースへの接続単位・・・これを用意してやることで,SQL文を発行できる
Stmt  SQL実行の単位・・・これを用意してやることで,SQL実行と結果の取得が出来る


長くなってきたので,実際のプログラムのコーディングや詳細については
Windows環境にてC言語やC++でODBCを使うには2
http://sato-si.at.webry.info/200505/article_1.html
で紹介します・・・。



----------------
補足:
Visual C++ならば,ATL OLE DB を使ったり,MFCを使う方法もありますね。
ATL OLE DB関連記事:
http://support.microsoft.com/kb/198486/ja

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 20

なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)
驚いた 驚いた 驚いた 驚いた 驚いた 驚いた 驚いた
面白い 面白い
ナイス ナイス
ガッツ(がんばれ!)
かわいい

この記事へのコメント

yosiyong
2005年05月19日 14:52
超ビギナーです。VC++からのDBアクセス方法について長時間検索して、やっと見つけました。サンプルもあってわかりやすかったんです。次回もいい勉強させていただきます。
Q
2007年05月03日 01:28
俺もDBアクセス方法探してたから
ちょうどいい感じに必要インクルードを書いてくれてるからありがたい。
それをキーに必要なAPIを捜せる
c ski
2010年10月11日 22:27
VC++ データーベース接続参考になりました。次回、さらに詳しく解説期待しています。ありがとう御座いました。
まさる
2017年05月30日 14:21
このサンプルで、エクセルにINSERT、UPDATE、DELETEをするにはどうしたらいいんでしょうか?

この記事へのトラックバック

  • Windows環境にてC言語やC++でODBCを使うには2

    Excerpt: Windows環境にてC言語やC++でODBCを使うには1 http://sato-si.at.webry.info/200503/article_11.html の続きです。 Weblog: さとーC++ぶろぐ@WebryBlog racked: 2005-05-06 15:20
  • Excel ODBC でCREATE TABLEするときに使えるデータ型

    Excerpt: Excel ODBC でCREATE TABLEするときに使えるデータ型 Weblog: さとーC++ぶろぐ racked: 2006-01-23 15:31
  • ODBC

    Excerpt: Open DataBase Connectivity Microsoft Open Database Connectivity (ODBC) DB2 for iSeries SQL 呼び出しレベル・イ.. Weblog: assari (PukiWiki/TrackBack 0.3) racked: 2008-06-18 10:34
  • :log

    Excerpt: ODBC, 日本語 Postgres 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 .. Weblog: assari (PukiWiki/TrackBack 0.3) racked: 2008-09-24 20:47