Wednesday, August 10, 2011

環境変数の展開について

  • 環境変数の即時展開
    バッチファイルを書いていると、変数が思っても見なかった動きをして、困ってしまうことがあります。例えば
    @echo off
    
    setlocal
    set HOGEHOGE="foobar"
    if %HOGEHOGE% == "foobar" (
    set HOGEHOGE="hogehuga"
    echo %HOGEHOGE%
    )
    endlocal
    といった内容のバッチファイルがあったとします。これをぱっと見ると"hogehuga"という出力がされると期待してしまいますが、実際に実行してみる と"foobar"という出力結果が得られます。なぜこのような結果になるかといいますと、各コマンドが実行されるときに環境変数が展開されるのではな く、バッチファイルのテキスト行が読み取られるときに展開が行われてしまうからで、上の例は次のように解釈されているために期待した結果が得られないので す。
    @echo off
    
    setlocal
    set HOGEHOGE="foobar"
    if "foobar" == "foobar" (
    set HOGEHOGE="hogehuga"
    echo "foobar"
    )
    endlocal
    これを、環境変数の即時展開と呼びます。
  • 遅延環境変数の展開
    環境変数の即時展開を避けたい場合には"遅延環境変数の展開"という機能を使います。
    setlocal enabledelayedexpansion
    と、バッチファイル中に書きますとその行から、endlocalに達するまで遅延環境変数の展開が有効になり、変数名を"!"(感嘆符)で囲うことで即時展開を避けることが可能になります。
    @echo off
    
    setlocal enabledelayedexpansion
    set HOGEHOGE="foobar"
    if %HOGEHOGE% == "foobar" (
    set HOGEHOGE="hogehuga"
    echo !HOGEHOGE!
    )
    endlocal
    このようにしますと"hogehuga"という出力結果を得ることが出来るようになります。

バッチファイル内での特殊文字のエスケープについて。

バッチファイル(というかコマンドプロンプト)での特殊文字のエスケープについてメモしておきます。

※ ここでいう「特殊文字」というのは、以下の記号のことです。

  • <」 (小なり記号)
  • >」 (大なり記号)
  • |」 (縦棒/パイプ記号)
  • 改行

とくにリダイレクト関係の記号については、そのまま使うと「コマンドの構文が誤っています。」とおこられること請け合いです。

話は単純でして、上記のような特殊な文字をバッチファイル内(やコマンドプロンプト)でただの文字として使用するには、特殊文字の前に「^」 (サーカムフレックス/ハット記号)を置けばよいです。

つまり、

ECHO ^< ECHO ^> ECHO ^| ECHO aaa^ bbb

のように記述すれば、

< > | aaabbb
と表示されるわけなのでした

Monday, May 2, 2011

ODBC3 の開発

1、ODBC基本概念

ODBCはRDBMSにアクセスするための共通のインタフェースです。

ハンドル
ODBCアプリケーションでは、データベース接続やSQL文など基本的機能をハンドルを使用して
定義し、一連のリソースを管理している

SQL_HANDLE_ENV 環境ハンドル
SQL_HANDLE_DBC データベース接続ハンドル
SQL_HANDLE_STMT ステートメントハンドル
SQL_HANDLE_DESC 記述子ハンドル

関数の戻り値とエラー処理
戻り値のデータ型はSQLRETURNである。
戻り値は、以下のように
SQL_SUCCESS 正常に終了した。
SQL_SUCCESS_WITH_INFO 正常に終了した
SQL_NO_DATA_FOUND これ以上のデータなし
SQL_ERROR 失敗した
SQL_INVALID_HANDLE 無効なハンドルがパラメータとしてわたれた。

SQL_ERRORまたははSQL_SUCESS_WITH_INFO場合、診断情報を生成されます。
SQLERROR(ODBCバージョン3より前)
SQLGetDiagRec(ODBCバージョン3以降)


2、開発流れ

ハンドルの割付
次のODBC関数を呼び出すことにより、ハンドルを割り当てることができます
・SQLAllocEnv,SQLAllocConnect,SQLAllocStmt( ODBCバージョン3前)
・SQLAllocHandle( ODBCバージョン3以降)


データソースへの接続
アプリケーションは環境ハンドルとデータベース接続ハンドルを割り付けてから、
データソースに接続します。
・SQLConnect
・SQLDriverConnect
・SQLBrowseConnect


SQL文の実行
二つの方法が用意されています。
・直接実行
・準備後の実行
直接実行する場合、SQLExecDirect関数でSQL文を直接実行します。
準備後に実行する場合、あらかじめSQLPrepare関数でSQL文を準備しておき,
SQLExecute関数で実行します。


結果セットの取り出し
SQLの実行結果(列)とアプリケーション・プログラム変数を関連つけるは、
SQLBindCol関数でバインドします。
結果セットから1行ずつ行を取り出すには、SQLFetch関数を使用する
結果セットからまとめて行を取り出すには、SQLExtendedFetch関数を使用する

トランザクション制御
ODBCの仕様では、デフォルトで自動コミットが有効になっています。
自動コミットのON/OFFを切り替えるには、SQLSetConnectionOption関数を使用する

自動コミットが無効な場合、コミット及びロールバックを明示的に行う。
トランザクション制御はSQLTransact関数を行います。


データベースとの切断
データベースの切断を行うには、SQLDisconnect関数を使用する。


ハンドルの解放
次の関数を呼び出すことにより、バンドルを解放することができます。
・SQLFreeStmt, SQLFreeConnect, SQLFreeEnv(ODBCバージョン3前)
・SQLFreeHandle(ODBCバージョン3以降)