ヘッダーをスキップ
Oracle TimesTen In-Memory Database TTClassesガイド
リリース6.0
B25771-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

アプリケーションで最も一般的に使用されるクラス

TTStatus、TTError、TTWarning

TTStatusクラスは、TTClassesコレクション内の他のクラスで、エラーおよび警告をレポートするために使用されます。TTStatusは、ODBC関数SQLErrorの付加価値C++ラッパーとみなすことができます。

TTErrorはTTStatusのサブクラスであり、ODBCエラー(リターン・コード: SQL_ERROR、SQL_INVALID_HANDLE)をカプセル化するために使用されます。TTWarningはTTStatusのサブクラスであり、ODBC警告(リターン・コード: SQL_SUCCESS_WITH_INFO)をカプセル化するために使用されます。

通常、ODBC警告はODBCエラーほど深刻ではないため、異なるロジックで処理します(たとえば、通常、ODBC警告はアプリケーションのログに記録するだけで十分ですが、ODBCエラーはプログラムで処理する必要があります)。

パブリック・メンバー

rc

ODBCコールに失敗した場合のリターン・コードです。このフィールドの通常の値は、SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERRORおよびSQL_NO_DATA_FOUNDです。

native_error

ODBCコールに失敗した場合のTimesTenネイティブ・エラー番号(存在する場合)です。

odbc_error

ODBCコールに失敗した場合のODBCエラー・コードです。

err_msg

ODBCコールに失敗した場合のASCII形式の出力可能なエラー・メッセージです。

パブリック・メソッド

friend ostream& operator<<(ostream&, TTStatus&)

このメソッドを使用すると、見やすく出力されるバージョンでエラーをストリームに送信できます。

例1.1 ostreamsでのTTStatusの使用
TTStatus stat; 
// ... 
cerr << "Error fetching data: " << stat << endl; 

使用方法

TTStatusオブジェクトは、TTClassesライブラリがビルドされた方法に応じて、次のいずれかの方法で使用されます。

TTEXCEPTプリプロセッサ変数を定義してライブラリがビルドされた場合(これはデフォルトで、推奨されるTTClassesの使用方法)は、エラーが発生するたびに、TTStatusオブジェクトが例外としてスローされます。これによって、C++アプリケーションでC++の{try/catch}による障害の検出とリカバリが可能となり、ソース・コードが非常に読みやすくなります。

例1.2 例外ありでのTTStatusの使用
try { 
  cmd1.Prepare(&conn, "select * from foo", stat); 
  cmd2.Prepare(&conn, "insert into foo values(?,?,?)", 
               stat); 
  cmd3.Prepare(&conn, "update foo set x = ? where y=?", 
               stat); 
  conn.Commit(stat); 
} 
catch (TTStatus st) { 
  cerr << "Error preparing statements: " << st << endl; 
  // Rollback, exit(), throw -- whatever is appropriate 
} 
 

TTEXCEPTプリプロセッサ変数を定義しないでTTClassesがビルドされた場合は、ほとんどのメソッドのコールからTTStatusオブジェクトが(参照ごとに)返されます。コール元は、次の例に示すように、メソッドをコールするたびにエラーの有無を明示的にチェックする必要があります。

例1.3 例外なしでのTTStatusの使用
TTStatus stat; 
[...] 
cmd1.Prepare(&conn, "select * from foo", stat); 
if (stat.rc) { 
  cerr << "Error preparing statement: " << stat << endl;  
  // Rollback, exit(), throw -- whatever is appropriate 
} 
cmd2.Prepare(&conn, "insert into foo values(?,?,?)",  
             stat); 
if (stat.rc) { 
  cerr << "Error preparing statement: " << stat << endl;  
  // Rollback, exit(), throw -- whatever is appropriate 
} 
cmd3.Prepare(&conn, "update foo set x = ? where y = ?", 
             stat); 
if (stat.rc) { 
  cerr << "Error preparing statement: " << stat << endl; 
  // Rollback, exit(), throw -- whatever is appropriate 
} 
conn.Commit(stat) ;  
if (stat.rc) { 
  cerr << "Error in commit: " << stat << endl; 
  // Rollback, exit(), throw -- whatever is appropriate 
} 
 

例外が有効な場合は、ODBCエラーが発生するとTTErrorオブジェクトが、ODBC警告が発生するとTTWarningsがスローされることに注意してください。

次の例に、TTErrorおよびTTWarningとTTStatusの相関を示します。ここに示す2つのコード・フラグメントの動作は同一です。

例1.4 TTStatus、TTErrorおよびTTWarningの相関
// first code fragment: using TTStatus 
try { 
  // some TTClasses method calls 
} 
catch (TTStatus st) { 
  if (st.rc == SQL_SUCCESS_WITH_INFO) { 
    cerr << `'Warning encountered: `' << st << endl; 
  } 
  else { 
    cerr << `'Error encountered: `' << st << endl; 
  } 
} 
// second code fragment: using TTError & TTWarning 
try { 
  // some TTClasses method calls 
} 
catch (TTWarning warn) { 
   cerr << `'Warning encountered: `' << warn << endl; 
} 
catch (TTError err) { 
    cerr << `'Error encountered: `' << st << endl; 
} 

TTConnection

TTConnectionクラスは、TimesTen Databaseに対する「接続」という概念をカプセル化します。TTConnectionは、ODBC HDBCハンドルの付加価値C++ラッパーとみなすことができます。

パブリック・メンバー

なし

パブリック・メソッド

void Connect (const char* connStr, TTStatus&)

Connectメソッドは、TimesTenデータ・ストアへの新しい接続を開くために使用されます。connStrパラメータで指定された接続文字列を使用して接続が作成されます。次に例を示します。

例1.5
TTConnection conn; 
TTStatus stat; 
conn.Connect("DSN=mydsn", stat); 
// Now this connection can be used to interact with 
// TimesTen 
 

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

このメソッドをコールすると、警告が生成されることがあります。これは多くの場合無視しても安全です。::Connect()を使用する場合は次のロジックが推奨されます。

try { conn.Connect(stat); } catch (TTWarning warn) { // warnings from ::Connect() are usually informational cerr << `'Warning while connecting to TimesTen: `' << warn << endl; } catch (TTError err) { // handle the error; this could be a serious problem }
void Disconnect (TTStatus&)

Disconnectメソッドは、TimesTenデータ・ストアとの接続を閉じるために使用されます。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

void Commit (TTStatus&)

Commitメソッドは、TimesTen Databaseにトランザクションをコミットするために使用されます。最後のCommit()またはRollback()メソッドへのコールの後に、この接続で実行された他のすべての操作がコミットされます。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

void Rollback (TTStatus&)

Rollbackメソッドは、トランザクションを中止するために使用されます。最後のCommit()またはRollback()メソッドへのコールの後に、この接続を介して行われたデータベースの変更が元に戻されます。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

bool isConnected()

オブジェクトが(Connectメソッドによって)TimesTenに接続されている場合はtrue、そうでない場合はfalseを返します。

HDBC getHdbc()

この接続に関連付けられたODBCレベル「HDBC」を返します。

void SetIsoReadCommitted (TTStatus &)

接続のトランザクション分離レベルをTXN_READ_COMMITTEDに設定します。コミット読取り分離レベルは、単一トランザクションのパフォーマンスと複数接続の優れた同時実行性という最善の組合せを提供します。

void SetIsoSerializable (TTStatus &)

接続のトランザクション分離レベルをTXN_SERIALIZABLEに設定します。通常、シリアライズ可能分離レベルは個別のトランザクションでは優れたパフォーマンスを提供しますが、同時実行性はきわめて低下します。(ほぼ)すべての状況下で、シリアライズ可能分離レベルよりもコミット読取り分離レベル(前述のSetIsoReadCommitted()メソッドを参照)の方が適切です。

void CheckpointFuzzy (int timeout, int retries, TTStatus &)

TimesTen組込みプロシージャttCkptBlockingをパラメータ(timeout、retries)付きでコールして、データ・ストアに対してブロッキング・チェックポイント処理を実行します。

ttCkptBlockingの詳細は、TimesTenのリファレンス・ガイドを参照してください。

void CheckpointBlocking (int timeout, int retries, TTStatus &)

TimesTen組込みプロシージャttCkptBlockingをパラメータ(timeout、retries)付きでコールして、データ・ストアに対してブロッキング・チェックポイント処理を実行します。

このメソッドは、CheckpointFuzzyよりも新しく、適したバージョンです。

ttCkptBlockingの詳細は、TimesTenのリファレンス・ガイドを参照してください。

void CheckpointNonBlocking (TTStatus &)
注意: これは、適したチェックポイントのタイプです。

TimesTen組込みプロシージャttCkptをコールして、データ・ストアに対するファジー・チェックポイント処理を実行します。

ttCkptの詳細は、TimesTenのリファレンス・ガイドを参照してください。

void DurableCommit (TTStatus &)

TimesTen組込みプロシージャttDurableCommitをコールして、データ・ストアに対する永続コミット操作(つまり、インメモリー・ログ・バッファをディスクにフラッシュするコミット操作)を実行します。ttDurableCommitの詳細は、TimesTenのリファレンス・ガイドを参照してください。

void CompactDataStore (int blocks, TTStatus &)

データ・ストアの圧縮操作を実行します。

blocks > 0の場合は、このメソッドによってTimesTen組込みプロシージャttCompactTSがパラメータblocks付きでコールされます。blocks <= 0の場合は、このメソッドによってTimesTen組込みプロシージャttCompactがコールされます。断片化を回避するために、データ・ストアの圧縮を頻繁に行う必要があります。

注意: TimesTen 6.0では、自動データ・ストア圧縮が実行されるため、TTConnection::CompactDataStore()メソッドは使用されなくなっており、TTClassesの次のバージョンで削除されます。
void SetLockWait (int secs, TTStatus &)

TimesTen組込みプロシージャttLockWaitをパラメータ(secs)付きでコールして、接続のロック・タイムアウト間隔を設定します。通常、ほとんどのアプリケーションでは2、3秒のロック・タイムアウトで十分です。デフォルトのロック・タイムアウト間隔は10秒です。

ttLockWaitの詳細は、TimesTenのリファレンス・ガイドを参照してください。

void SetPrefetchCloseOn (TTStatus &)

TT_PREFETCH_CLOSE接続オプションを有効にします。これは、SELECT問合せのパフォーマンスの最適化が必要なTimesTenのクライアント/サーバー接続で有効です。このメソッドは、直接接続のTimesTenアプリケーション(つまり、非クライアント/サーバー・プログラム)に対しては利点がないことに注意してください。

TT_PREFETCH_CLOSEの詳細は、TimesTenの開発者ガイドのパフォーマンス・チューニングに関する章を参照してください。

void SetPrefetchCloseOff (TTStatus &)

TT_PREFETCH_CLOSE接続オプションを無効にします。

void SetPrefetchCount (int numrows, TTStatus &)

このメソッドを使用すると、TimesTen ODBCドライバがSELECT文に対して内部で一度にフェッチする行数をユーザー・アプリケーションによって調整できます。パラメータnumrowsの範囲は1から128です。

注意: このメソッドは、TTCmd::FetchNext()を複数回実行することと同等ではありません。そのかわりに、このパラメータを適切に使用すると、TTCmd::Fetch-Next()の各コールにかかる時間が短縮されます。

TT_PREFETCH_COUNTの詳細は、TimesTenの開発者ガイドを参照してください。

void SetAutoCommitOff (TTStatus &)

接続のAUTOCOMMITを無効に設定します。

TimesTenはAUTOCOMMITが無効の場合にのみ最適なパフォーマンスで実行されるため、このメソッドはTTConnection::Connect()によって自動的にコールされることに注意してください。

void SetAutoCommitOn (TTStatus &)

接続のAUTOCOMMITを有効に設定します。つまり、すべてのSQL文が独自のトランザクションで実行されます。

通常、TimesTenはAUTOCOMMITを無効にした方がはるかに高速で実行されることに注意してください。

AUTOCOMMITが無効の場合、SELECT文をコミットするには、TTCmd::Close()を明示的にコールする必要があります。

void GetTTContext (char * output, TTStatus &)

接続のコンテキスト値を返します。このコンテキスト値はTimesTenデータ・ストアへの接続ごとに一意となります。たとえば、接続のコンテキストは、TimesTenユーティリティttStatusを使用してPIDとTimesTen接続を相関させるために使用できます。

コンテキスト値は最初のパラメータoutputを介して返されます。このメソッドはoutputパラメータにchar[17](またはそれ以上)の配列を指定してコールする必要があります。

このメソッドにより、TimesTen組込みプロシージャttContextがコールされます。ttContextの詳細は、TimesTenのリファレンス・ガイドを参照してください。

使用方法

TimesTenを使用するすべてのアプリケーションは、1つ以上のTTConnectionオブジェクトを作成する必要があります。

同時に複数のスレッドからTimesTenを使用するマルチスレッド・アプリケーションは、TTConnectionオブジェクトを2つ以上作成する必要があります。通常、次のいずれかの方法が使用されます。

TTCmd

TTCmdオブジェクトは、アプリケーション・プログラムで複数回使用される単一のSQL文をカプセル化します。TTCmdは、ODBC HSTMTハンドルの付加価値C++ラッパーとみなすことができます。

パブリック・メンバー

なし

パブリック・メソッド

void Prepare (TTConnection*, const char* sqlP, const char* explanationP, TTStatus&)

TTCmdを使用する前に、SQL文(SELECT、INSERT、UPDATEまたはDELETE)を関連付ける必要があります。この関連付けはPrepareメソッドを使用して行われます。また、Prepareメソッドは、SQL文が効率的に実行されるために必要なすべての計画の生成および最適化も実行します。

Prepareメソッドは文を実行するのではなく、単に文をTTCmdオブジェクトに関連付け、文の実行に使用される計画を決定します。

通常、TimesTenでは、パフォーマンスのために文はパラメータ化されます。たとえば、次の2つのSQL文を発行する場合を想定します。

SELECT col1 FROM table1 WHERE C = 10

SELECT col1 FROM table1 WHERE C = 11

これよりも、パラメータ化された1つの文を準備し、それを複数回実行した方がはるかに効率的です。

SELECT col1 FROM table1 WHERE C = ?

「?」の値は、後述のsetParamメソッドを使用して実行時に指定されます。

ODBCに直接関連付ける場合のように、列またはパラメータを明示的にSQL文にバインドする必要はありません。TTCmdは、準備する際にすべての必要な列とパラメータを自動的に定義しバインドします。

Prepareは相対的に負荷の高い操作であることに注意してください。通常は、(TTConnection::Connectによって)TimesTenへの接続が確立される場合に、アプリケーションの開始時に、接続に関連付けられたすべてのTTCmdオブジェクトがアプリケーションによって準備されます。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

void Execute (TTStatus&)

Executeメソッドは、実行のために準備されたSQL文を起動するために使用されます。

必要なパラメータ値がsetParamメソッドによって定義された後、Execute()を使用して、Prepareメソッドによって事前に準備済のSQL文を起動します。

SQL文がSELECTの場合は、このメソッドによって問合せが実行されますが、結果セットから行が返されません。FetchNextメソッドを使用すると、結果セットから一度に1行ずつフェッチされます。該当するすべての行がフェッチされたら、Closeメソッドを起動して結果セットを閉じる必要があります。SELECT以外のSQL文の場合は、カーソルがオープンされないため、Closeメソッドをコールする必要はありません。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

int ExecuteImmediate (TTConnection*, const char * sqlP, TTStatus & stat)

ExecuteImmediateメソッドは、事前に準備済でないSQL文を起動するために使用されます。

たとえばDDL文(CREATE TABLE、DROP TABLEなど)や、使用頻度が低く結果セットを返さないDML文(DELETE FROM <tablename<など)のように、数回だけ実行されるSQL文については、Prepare/ExecuteのかわりにExecuteImmediateを使用すると便利です。

ExecuteImmediateは、結果セットを返すSQL文と互換性がありません。また、ExecuteImmediateによって実行された文は、後でgetRowCount(DML操作によって影響を受けた行の数を取得する)を使用して問い合せることができません。このため、ExecuteImmediateは自動的にgetRowCount()をコールし、その値がこのメソッドの整数の戻り値となります。

int FetchNext (TTStatus & stat)

Executeを使用して準備済のSQL SELECT文を実行した後、FetchNextメソッドを使用して、応答セットから一度に1行ずつフェッチします。

応答セットから1行をフェッチした後に、オーバーロードされた様々なバージョンのgetColumnメソッド(後述)を使用して、現在の行から値をフェッチします。

応答セットに行がなくなると、FetchNextは1を返します。行が返されると、FetchNextは0を返します。

Executeメソッドを使用してSELECTを実行した後、Closeメソッドで応答セットを閉じる必要があります。一度Closeメソッドをコールしたら、FetchNextメソッドを使用して応答セットからそれ以上行をフェッチすることはできません。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

int getRowCount()

このメソッドをExecuteの直後にコールして、直前に実行されたSQL操作の影響を受けた行の数を返すことができます。たとえば、10行を削除するDELETE文が実行された後には、getRowCountは10を返します。

void setMaxRows (const int nRows, TTStatus &stat)

文に対してこの関数をコールすると、それ以降SELECT文によってフェッチされる行の数が制限されます。結果セット内の行数が、設定された上限を超える場合、設定された最大行数を超えてフェッチすると、SELECT文はSQL_NO_DATA_FOUNDを返します。つまり、eof()メソッドがコールされると、TTCmdオブジェクトはTRUEを返します。デフォルトでは、すべての行が返されます。すべての行を返すように制限をリセットするには、nRowsを0に設定してsetMaxRows()をコールします。この制限はSELECT文に対してのみ意味があります。

int getMaxRows (TTStatus &stat)

この関数は、SELECTによってこのTTCmdから返される行数について現在設定されている上限を返します。戻り値0は、すべての行が返されることを示します。

void setParamNull (int i)
void setParam (int i, ...)

この項では、オーバーロードされた様々なsetParamメソッドについて説明します。

準備済のSQL文を実行する前に、setParamメソッドを使用してパラメータの値を設定します。SQL文は、使用前にPrepareメソッドで準備され、Executeメソッドで実行されます。SQL文にパラメータ・マーカー(リテラル定数が有効である位置で使用される?文字)が含まれている場合、そのSQL文を実行するには、それらのパラメータに値を割り当てる必要があります。文を実行する前に、setParamメソッドを使用して各パラメータの値を定義します。

setParamに最初に渡される引数は、設定されるパラメータの位置です。SQL文の最初(一番左)のパラメータはパラメータ1です。setParamに2番目に渡される引数はパラメータの値です。オーバーロードされた様々なバージョンのsetParamは、2番目の引数で様々なデータ型を受け入れます。

アプリケーションでsetParamNullメソッドを使用して、特定のパラメータの値をSQLのNULL擬似値に指定できます。

このバージョンのTTClassesライブラリは、強固な変換セットをサポートしません。準備済のSQLのパラメータごとに、オーバーロードされた適切なバージョンのsetParamをコールする必要があります。誤ったバージョンをコールする(たとえば、整数パラメータをchar*値に設定しようとする)と、プログラム障害が発生するおそれがあります。

setParamに渡された値は、TTCmdオブジェクトによって保守される内部バッファにコピーされます。これらのバッファは静的に割り当てられ、Prepareメソッドによってバインドされます。そのため、パラメータ値はsetParamのコール時にsetParamに渡される値であって、後続のExecuteメソッドのコール時の値ではありません。

次の表に、サポートされるSQLデータ型と、各パラメータ型での使用に適したsetParamのバージョンを示します。

表に示されていないSQLデータ型は、このバージョンのTTClassesではサポートされないことに注意してください。

表1: サポートされるSQLデータ型に対するTTCmd::setParamのバージョン
SQLデータ型
サポートされるsetParamのバージョン
SQL_TINYINT (1バイト整数)
setParam (int, SQLTINYINT)
SQL_SMALLINT(2バイト整数)
setParam(int, SQLSMALLINT)
SQL_INTEGER (4-バイト整数)
setParam (int, SQLINTEGER)
SQL_BIGINT (8バイト整数)
setParam (int, SQLBIGINT)
SQL_FLOAT
SQL_REAL
setParam (int, float)
SQL_DOUBLE
setParam (int, double)
SQL_DECIMAL
setParam (int, char*)
setParam (int, const char*)
SQL_NUMERIC
setParam (int, char*)
setParam (int, const char*)
SQL_CHAR
setParam (int, char*)
setParam (int, const char*)
SQL_VARCHAR
setParam (int, char*)
setParam (int, const char*)
SQL_WCHAR
setParam (int, SQLWCHAR*, int len)
SQL_WVARCHAR
setParam (int, SQLWCHAR*, int len)
SQL_BINARY
setParam (int, const void*, int len)
SQL_VARBINARY
setParam (int, const void*, int len)
SQL_DATETIME
setParam (int, TIMESTAMP_STRUCT*)
SQL_TIMESTAMP
setParam (int, TIMESTAMP_STRUCT*)
SQL_DATE
setParam (int, DATE_STRUCT*)
SQL_TIME
setParam (int, TIME_STRUCT*)

void getColumn (int i, ...)
bool getColumnNullable (int i, ...)
bool isColumnNull (int i)

この項では、オーバーロードされたgetColumnおよびgetColumnNullableメソッドのすべてのバージョンについて説明します。

getColumnおよびgetColumnNullableメソッドを使用して、応答セットの現在の行の列値をフェッチできます。GetColumnまたはget-ColumnNullableメソッド(あるいはその両方)を使用するには、まずFetchNextメソッドを使用して、SELECT文の応答セットから最初(または次)の行をフェッチする必要があります。SQL文はExecuteメソッドを使用して実行されます。

isColumnNullメソッドは、列値がNULLかどうか調べるもう1つの方法です。

getColumnメソッドは、特定の列に関連付けられた値を返します。列は序数で参照され、「1」はSELECT文で指定された最初の列を示します。すべての場合において、getColumnメソッドに渡される最初の引数は、値がフェッチされる列の序数です。getColumnメソッドに渡される2番目の引数は、指定された列の値を受け取る変数のポインタです。この引数の型は、返される列の型に依存します。

getColumnNullableメソッドはgetColumnメソッドに類似しています。ただし、getColumnNullableメソッドはgetColumnの動作に加え、列の値がSQLのNULL擬似値であるかどうかも返します。列の値がNULLである場合、2番目のパラメータの値は目につきやすい値(-9999など)に設定され、メソッドの戻り値はTRUEとなります。列の値がNULLでない場合、2番目のパラメータが指す変数で列の値が返され、getColumnNullableメソッドはFALSEを返します。

このバージョンのTTClassesライブラリは、強固な変換セットをサポートしません。準備済のSQLの出力列ごとに、オーバーロードされた適切なバージョンのgetColumnをコールする必要があります。誤ったバージョンをコールする(たとえば、整数の列をchar*値にフェッチしようとする)と、プログラム障害が発生するおそれがあります。

次の表に、サポートされるSQLデータ型と、各パラメータ型での使用に適したgetColumnのバージョンを示します。

表2: サポートされるSQLデータ型に対するTTCmd::getColumn[Nullable]のバージョン
SQLデータ型
サポートされるgetColumnのバージョン
SQL_BIT
getColumn (int i, int*)
getColumnNullable (int i, int*)
SQL_TINYINT (1バイト整数)
getColumn (int i, SQLTINYINT*)
getColumnNullable (int i, SQLTINYINT*)
SQL_SMALLINT (2バイト整数)
getColumn (int i, SQLSMALLINT*)
getColumnNullable (int i, SQLSMALLINT*)
SQL_INTEGER (4-バイト整数)
getColumn (int i, SQLINTEGER*)
getColumnNullable (int i, SQLINTEGER*)
SQL_BIGINT (8バイト整数)
getColumn (int i, SQLBIGINT*)
getColumnNullable (int i, SQLBIGINT*)
SQL_FLOAT
SQL_REAL
getColumn (int i, float*)
getColumnNullable (int i, float*)
SQL_DOUBLE
getColumn (int i double*)
getColumnNullable (int i, double*)
SQL_DECIMAL
getColumn (int i, char**)
getColumnNullable (int i, char**)
SQL_NUMERIC
getColumn (int i, char**)
getColumnNullable (int i, char**)
SQL_CHAR
getColumn (int i, char**)
getColumnNullable (int i, char**)
SQL_VARCHAR
getColumn (int i, char**)
getColumnNullable (int i, char**)
SQL_WCHAR
getColumn (int i, SQLWCHAR*)
getColumnNullable (int i, SQLWCHAR*)
SQL_WVARCHAR
getColumn (int i, SQLWCHAR*)
getColumnNullable (int i, SQLWCHAR*)
SQL_BINARY
void getColumn (int i, void** binPP, int* lenP)
void getColumnNullable (int i, void** binPP, int* lenP)
SQL_VARBINARY
void getColumn (int i, void** binPP, int* lenP)
void getColumnNullable (int i, void** binPP, int* lenP)
SQL_DATETIME
getColumn (int i, TIMESTAMP_STRUCT*)
getColumnNullable (int i, TIMESTAMP_STRUCT*)
SQL_TIMESTAMP
getColumn (int i, DATE_STRUCT*)
getColumnNullable (int i, DATE_STRUCT*)
SQL_DATE
getColumn (int i, DATE_STRUCT*)
getColumnNullable (int i, DATE_STRUCT*)
SQL_TIME
getColumn (int i, TIME_STRUCT*)
getColumnNullable (int i, TIME_STRUCT*)

このリリースのTTClassesライブラリでは、他のSQLデータ型はサポートされません。

int getColumnLength (int cno)

列# cnoの長さを返します。通常、VARBINARYまたはNVARCHAR型の列にアクセスする場合のみ有効です。返される値は、0から列の精度です(後述のgetColumnPrecisionメソッドを参照)。

void Close (TTStatus&)

Executeメソッドを使用してSQL SELECT文を実行すると、応答セットから行をフェッチするために使用できるカーソルがオープンされます。アプリケーションでの行のフェッチが完了したら、Closeメソッドを使用してカーソルをクローズする必要があります。

応答セットのクローズに失敗すると、行のロックが保持される時間が長くなりすぎるため、同時実行性の問題、メモリ・リークおよびその他のエラーが発生する可能性があります。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

void Drop (TTStatus&)

準備済のSQL文を今後使用しない場合は、Dropメソッドをコールして、その文とそれに関連付けられたリソースを解放できます。再度Prepareをコールすると、TTCmdオブジェクトを別の文に再利用できます。

複数のTTCmdオブジェクトを使用して複数のSQL文を実行した方が、はるかに効率的です。特定のSQL文を今後使用しないことが確実な場合にのみ、Dropメソッドを使用してください。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

void setQueryTimeout (const int nSecs, TTStatus&)

このメソッドでは、必要に応じて、問合せでタイムアウト値を設定して、アプリケーションによって長時間実行問合せを停止できます。

デフォルトの問合せタイムアウト値は存在しないことに注意してください。

使用方法

プログラムで複数回実行される各SQL文には、独自のTTCmdオブジェクトが必要です。それらのTTCmdオブジェクトは、プログラムの初期化時にPrepare()によってそれぞれ1回準備され、プログラムの実行時にExecute()で複数回実行されます。

ExecuteImmediate()メソッドは、1回だけ実行する必要のあるデータベース操作でのみ使用します。ExecuteImmediate()はどのタイプのSELECT文とも互換性がなく(かわりに、すべての問合せでPrepare() + Execute()を使用する必要があります)、INSERT/UPDATE/DELETE文とも互換性がないことに注意してください。後で、INSERT/UPDATE/DELETE文に対して、挿入/更新/削除された行数を調べるために、getRowcount()によって問合せが実行されます。これらの制限は、一部の状況(表の作成または削除など)を除き、ExecuteImmediate()の使用を避けるために課されています。

DDL問合せ

(準備済の)TTCmdオブジェクトの、バインドされた入力パラメータおよび出力列のプロパティについて問い合せる場合に有効なメソッドがいくつかあります。通常、これらのメソッドは、文が事前に準備されている場合にのみ(前述のPrepareメソッドを参照)、有効な結果が得られます。

int getNParameters ()

入力パラメータの数を返します。

int getNColumns ()

出力列の数を返します。

int getParamType (int pno)

パラメータ# pnoのデータ型を返します。返される値は、<sql.h>に見られる、パラメータのODBC型(SQL_INTEGER、SQL_REAL、SQL_BINARY、SQL_CHARなど)です。その他のTimesTen型(SQL_WCHAR、SQL_WVARCHAR)は、TimesTenヘッダー・ファイル<timesten.h>で見られます。

int getColumnType (int cno)
列# cnoのデータ型を返します。返される値は、<sql.h>に見られる、パラメータのODBC型(SQL_INTEGER、SQL_REAL、SQL_BINARY、SQL_CHARなど)です。その他のTimesTen型(SQL_WCHAR、SQL_WVARCHAR)は、TimesTenヘッダー・ファイル<timesten.h>で見られます。
const char * getColumnName (int cno)

列# cnoの名前を返します。

int getColumnPrecision (int cno)

列# cnoの精度を返します。通常、この値は、表のCHAR、VARCHAR、BINARY、VARBINARY、NCHARおよびNVARCHAR型の列から出力を生成する場合にのみ重要です。

バッチ操作

TimesTenは、挿入、更新および削除のバッチ操作のためにODBC関数SQLBindParamsをサポートし、TTClassesはSQLBindParamsへのインタフェースを提供します。

TTClassesでのバッチ操作は、非バッチ操作と同様に実行されます。最初に、SQL文がPrepareBatch()によってコンパイルされます。次に、その文の各パラメータが、BindParameter()によって値の配列にバインドされます。最後に、ExecuteBatch()によって文が実行されます。Prepare()によって文のコンパイルの実行とすべてのパラメータのバインドの自動実行が行われ、またExecute()によって文の実行が行われる、通常のTTClasses(非バッチ)操作との類似性に注意してください。

バッチ操作機能の使用例は、TTClassesサンプル・プログラムbulktest.cppを参照してください。

この項では、TTClassesユーザー向けに、バッチの挿入/更新/削除機能を公開するTTCmdメソッドについて説明します。

void PrepareBatch(TTConnection*, const char * sqlP, TTCmd::TTCMD_USER_BIND_LEVEL level, unsigned short batchSize, TTStatus&)

PrepareBatch()は、INSERT/UPDATE/DELETE文のバッチ操作に使用されるPrepare()の類似メソッドです。この関数のTTConnection*、const char*sqlPおよびTTStatus&パラメータは、Prepare()の場合と同様に使用されます。

現在、levelパラメータの有効な値は次の1つのみです(今後、値が追加されます)。

TTCmd::TTCMD_USER_BIND_PARAMS

batchSizeパラメータは、後続のExecuteBatch()のコールによって実行される挿入/更新/削除操作の最大数を指定します。

void BindParameter(int pno, unsigned short batchSize, <TYPE>*, [SQLLEN*], TTStatus&)

この項では、オーバーロードされた様々なBindParameterメソッドについて説明します。

BindParameterメソッドは、PrepareBatch()によってコンパイルされた文について、値の配列(各パラメータに1つ)をバインドするために使用されます。このコールのbatchSizeパラメータは、PrepareBatch()で指定されたbatchSizeの値と一致する必要があります。同様に、バインドする配列は少なくともこの大きさである必要があります。各パラメータにバインドする正しい型の判別は、ユーザーに一任されています。誤った型をバインドすると、TTLog::TTLOG_ERRロギング・レベルのTTClassesグローバル・ロギング機能に実行時エラーが書き込まれることに注意してください。

ExecuteBatch()を起動するたびに、ユーザー・アプリケーションで事前にこれらの配列に有効なパラメータ値を設定する必要があります。

4つのSQL型(SQL_[VAR]BINARYおよびSQL_W[VAR]CHAR)については、パラメータ値の長さを保持するために、追加のSQLLEN*パラメータ(SQLLENの配列)が必要です。この追加配列は少なくともbatchSizeの長さであり、ExecuteBatch()のコール前に、有効な長さの値が設定されている必要があります。

次の表に、サポートされるSQLデータ型と、各パラメータ型での使用に適したBindParameterのバージョンを示します。

表3: サポートされるSQLデータ型に対するTTCmd::BindParameterのバージョン

SQLデータ型
サポートされるBindParameterのバージョン
SQL_TINYINT
(1バイト整数)
BindParameter (... SQLTINYINT*...)
SQL_SMALLINT
(2バイト整数)
BindParameter (...SQLSMALLINT*...)
SQL_INTEGER
(4バイト整数)
BindParameter (...SQLINTEGER*...)
SQL_BIGINT
(8バイト整数)
BindParameter (...SQLBIGINT*...)
SQL_FLOAT
SQL_REAL
BindParameter (...float*...)
SQL_DOUBLE
BindParameter (...double*...)
SQL_DECIMAL
BindParameter (...char**...)
SQL_NUMERIC
BindParameter (...char**...)
SQL_CHAR
BindParameter (...char**...)
SQL_VARCHAR
BindParameter (...char**...)
SQL_WCHAR
BindParameter (...SQLWCHAR**, SQLLEN*...)
SQL_WVARCHAR
BindParameter (...SQLWCHAR**, SQLLEN*...)
SQL_BINARY
BindParameter (...const void**, SQLLEN*...)
SQL_VARBINARY
BindParameter (...const void**, SQLLEN*...)
SQL_DATETIME
BindParameter (... TIMESTAMP_STRUCT*...)
SQL_TIMESTAMP
BindParameter (... TIMESTAMP_STRUCT*...)
SQL_DATE
BindParameter (...DATE_STRUCT*...)
SQL_TIME
BindParameter (...TIME_STRUCT*...)

setParamLength(int pno, unsigned short rowno, int len)
setParamNull(int pno, unsigned short rowno)

これら2つのメソッドは、ExecuteBatch()をコールする前に、バインドされたパラメータ値の1つの長さまたはNULLであることを設定します。setParamLengthの最初のパラメータpnoは文内のどのパラメータを設定するかを指定し、2番目のパラメータrownoは長さを設定する行を指定します。3番目のパラメータlenは、設定する長さを指定します。

SQL_[VAR]BINARYおよびSQL_W[VAR]CHAR以外の型については、ExecuteBatch()のコール前に値の長さ/NULLであることを明示的に設定するために使用できるメソッドはこの2つだけです。それら4つの型については、それらの型に対するBindParameter()コールの4番目のパラメータであったSQLLEN*配列の操作によって、長さとNULLであることを明示的に設定することもできます。

void ExecuteBatch(unsigned short numRows, TTStatus&)

PrepareBatch()によってSQL文を準備し、そのSQL文の各パラメータ(「?」)に対してBindParameter()をコールした後、ExecuteBatch()を使用してその文をnumRows回実行します。numRowsの値は、PrepareBatch()およびBindParameter()のコールで指定したbatchSizeを超えてはなりません。ただし、アプリケーション・ロジックでの必要に応じて、numRowsをbatchSizeより小さくすることはできます。

アプリケーションでは、ExecuteBatch()をコールする前に、BindParameter()でバインドされたパラメータの配列に有効な値を設定する必要があります。必要に応じて、setParamNull(int pno, int rowno)(前述を参照)によってNULL値を指定できます。

TTConnectionPool

TTConnectionPoolクラスは、マルチスレッド・アプリケーションによって、接続のプールの管理に使用されます。

通常、マルチスレッド・アプリケーションは次のいずれかの基本的な方法を使用して作成できます。

注意: 全体のパフォーマンスを最高にするために、データベース・サーバーのCPUごとに1つまたは2つの同時ダイレクト・メモリー・データベース接続を使用することをお薦めします。同時ダイレクト・メモリー・データベース接続の数(つまり、接続プールのサイズ)は、常にデータベース・サーバーのCPU数の2倍を超えるようにしてください。ただし、クライアント/サーバー・モードでは、CPUごとにさらに多くの接続が効率的にサポートされます。

アプリケーションは、TTConnectionPoolクラスを使用するために、クラスの単一のインスタンスを作成します。その後、多数のTTConnectionオブジェクトを作成しますが、それらのConnectメソッド(実際にそれらをTimesTenに接続するメソッド)はコールしません。アプリケーションは次に、TTConnectionPool::AddConnectionToPoolメソッドをコールして接続オブジェクトをプールに追加します。その後、TTConnectionPool::ConnectAllをコールして、すべての接続をTimesTenに接続します。TimesTenを使用するスレッドは、getConnectionとfreeConnectionメソッドを使用し、アイドル状態の接続を取得して返します。

パブリック・メンバー

なし

パブリック・メソッド

int AddConnectionToPool (TTConnection*)

このメソッドは、TTConnectionオブジェクト、またはTTConnectionから導出されたクラスのオブジェクトを接続プールに追加するために使用されます。

void ConnectAll (const char* connStr, TTStatus&)

AddConnectionToPoolによって多数のTTConnectionオブジェクトが接続プールに追加された後、ConnectAllメソッドを使用して、すべてのTTConnectionオブジェクトを同時にTimesTenに接続できます。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

TTConnection* getConnection (int timeout_millis=0)

スレッドでTimesTenを使用する必要がある場合、そのスレッドはgetConnectionメソッドを使用して接続プールからアイドル状態の接続をチェックアウトします。アイドル状態のTTConnectionオブジェクトへのポインタが返されます。スレッドはその後、トランザクションを実行し、Commit()またはRollback()のいずれかでそれを終了してから、freeConnectionメソッドを使用して接続をプールに返します。

プール内にアイドル状態の接続がない場合は、freeConnectionのコールによって接続がプールに返されるまで、getConnectionをコールするスレッドがブロックされます。オプションのタイムアウトをミリ秒単位で指定できます。タイムアウトが指定されると、getConnectionは空き接続が出るまで、timeoutミリ秒を上限として待機し、その時間内に接続が使用可能にならなければコール元にNULLを返します。

void freeConnection (TTConnection*)

このメソッドは、別のスレッドへの再割当てができるよう、接続をプールに返すために使用されます。アプリケーションでは、トランザクション中の接続を解放しないでください。freeConnectionをコールする直前に、TTConnection::CommitまたはTTConnection::Rollbackをコールする必要があります。

void DisconnectAll (TTStatus&)

接続プール内のすべての接続がTimesTenから切断されます。

アプリケーションでは、プロセス障害の分析とリカバリに関連するオーバーヘッドを回避するために、終了の前にDisconnectAllをコールする必要があります。

例外が有効な場合は、エラーが発生するとTTStatusオブジェクトが例外としてスローされます。例外が無効な場合は、メソッドから返される際に、発生したエラーに関する情報が、最後のパラメータとしてメソッドに渡されたTTStatus&オブジェクトに格納されます。

void getStats(int *nGets, int *nFrees, int *nWaits, int *nTimeouts, int *maxInUse, int *nForcedCommits)

このメソッドでは、ユーザー・アプリケーションによってTTConnectionPoolにステータス情報を問い合せることができます。返されるデータは次のとおりです。

TTGlobal(TTClassesロギング機能を含む)

TTGlobalクラスは、プログラム開発およびアプリケーションのロギングを支援するためのロギング機能をTTClasses内に備えています。

パブリック・メンバー

なし

パブリック・メソッド

static void setLogStream (ostream & str)

このメソッドは、TTClassesのロギング情報の送信先を指定します。デフォルトでは、ロギングが有効な場合、TTClassesは標準エラーに記録します。このメソッドを使用すると、ユーザー・アプリケーションはファイル(または他の任意のostream &)に記録できます。たとえば、テキスト・ファイルapp_log.txtに記録する場合は、次のように使用します。

例1.6
ofstream log_file ("app_log.txt") ; 
TTGlobal::setLogStream (log_file) ;  
static void setLogLevel (TTLog::TTLOG_LEVEL lvl)

このメソッドは、TTClassesロギングの冗長レベルを指定します。許容されるロギング・レベルは次の6つです。

static void disableLogging()

このメソッドはすべてのロギングを無効にします。次の2つの文は同一であることに注意してください。

 TTGlobal::disableLogging() ;   
 TTGlobal::setLogLevel (TTLog::TTLOG_NIL) ;   

TTGlobalに関するその他のコメント

TTGlobalのロギング機能は、TTClassesプログラム内で発生するあらゆる種類の問題のデバッグに非常に役立つことがあります。ただし、最も冗長なロギング・レベル(TTLog::TTLOG_INFOおよびTTLog::TTLOG_DEBUG)は実際に非常に冗長であり、膨大な出力が生成される可能性があることに注意してください。そのため、開発時または不具合の診断の試行時にかぎり、それらのロギング・レベルを使用することをお薦めします。

マルチスレッド・プログラムからロギングする場合は、ディスクへの書込み時に、異なるプログラム・スレッドのログ出力が混合されるという問題が発生するおそれがあります。この問題を軽減するには、ios_base::unitbuf iostreamマニピュレータでostreamバッファリングを無効にします。

TTClassesロギングをロギング・レベルTTLog::TTLOG_ERRでファイルapp_log.txtに送信し、このファイルへのロギングがバッファリングされない(つまり、異なるスレッドの出力が相互に混合されない)ようにする方法を次の例に示します。

例1.7
ofstream log_file ("app_log.txt") ; 
log_file << std::ios_base::unitbuf ;  
TTGlobal::setLogStream (log_file) ;  
TTGlobal::setLogLevel (TTLog::TTLOG_ERR) ;