TTStatusクラスは、TTClassesコレクション内の他のクラスで、エラーおよび警告をレポートするために使用されます。TTStatusは、ODBC関数SQLErrorの付加価値C++ラッパーとみなすことができます。
TTStatusには、次のサブクラスがあります。
TTErrorはTTStatusのサブクラスであり、ODBCエラー(リターン・コード: SQL_ERROR、SQL_INVALID_HANDLE)をカプセル化するために使用されます。
TTWarningはTTStatusのサブクラスであり、ODBC警告(リターン・コード: SQL_SUCCESS_WITH_INFO)をカプセル化するために使用されます。
通常、ODBC警告はODBCエラーほど深刻ではないため、異なるロジックで処理します。通常、ODBC警告はアプリケーションのログに記録するだけで十分ですが、ODBCエラーはプログラムで処理する必要があります。
friend ostream& operator<<(ostream&, TTStatus&)
このメソッドを使用すると、エラーをストリームに出力できます。
TTStatus stat;
// ...
cerr << "Error fetching data: " << stat << endl;
TTStatusオブジェクトは、TTEXCEPTプリプロセッサ変数を定義してライブラリがビルドされたかどうかに応じて、2つの異なる方法のいずれかで使用されます。TTEXCEPTを定義することはデフォルトであり、推奨されるTTClassesの使用方法です。
TTEXCEPTプリプロセッサ変数を定義してライブラリがビルドされた場合は、エラーが発生するたびに、TTStatusオブジェクトが例外としてスローされます。これによって、C++アプリケーションでC++の{try/catch}
による障害の検出とリカバリが可能となり、ソース・コードが非常に読みやすくなります。
次の例に、TTEXCEPTが定義されている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オブジェクトが(参照ごとに)返されます。コール元は、次の例に示すように、メソッドをコールするたびにエラーの有無を明示的にチェックする必要があります。
次の例に、TTEXCEPTが定義されていない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つのコード・フラグメントの動作は同じです。
// 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;
}