CDatabase
クラス
データ ソースへの接続を表します。これを通じてデータ ソース上で操作を行うことができます。
構文
class CDatabase : public CObject
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CDatabase::CDatabase |
CDatabase オブジェクトを構築します。 OpenEx またはOpen を呼び出して、オブジェクトを初期化する必要があります。 |
パブリック メソッド
名前 | 説明 |
---|---|
CDatabase::BeginTrans |
接続されたデータ ソースで、クラス CRecordset のAddNew 、Edit 、Delete 、およびUpdate メンバー関数への一連の元に戻せる呼び出しである "トランザクション" を開始します。 データ ソースは、 BeginTrans が影響を受けるためにトランザクションをサポートする必要があります。 |
CDatabase::BindParameters |
CDatabase::ExecuteSQL を呼び出す前にパラメーターをバインドできます。 |
CDatabase::Cancel |
非同期操作または 2 番目のスレッドからのプロセスを取り消します。 |
CDatabase::CanTransact |
データ ソースがトランザクションをサポートしている場合は、0 以外の値を返します。 |
CDatabase::CanUpdate |
CDatabase オブジェクトが更新可能な場合は 0 以外の値を返します (読み取り専用ではありません)。 |
CDatabase::Close |
データ ソース接続を閉じます。 |
CDatabase::CommitTrans |
BeginTrans によって開始されたトランザクションを完了します。 データ ソースを変更するトランザクション内のコマンドが実行されます。 |
CDatabase::ExecuteSQL |
SQL ステートメントを実行します。 データ レコードは返されません。 |
CDatabase::GetBookmarkPersistence |
ブックマークがレコードセット オブジェクトに保持される操作を識別します。 |
CDatabase::GetConnect |
CDatabase オブジェクトをデータ ソースに接続するために使用する ODBC 接続文字列を返します。 |
CDatabase::GetCursorCommitBehavior |
開いているレコードセット オブジェクトに対するトランザクションのコミットの影響を識別します。 |
CDatabase::GetCursorRollbackBehavior |
開いているレコードセット オブジェクトに対するトランザクションのロールバックの影響を識別します。 |
CDatabase::GetDatabaseName |
現在使用中のデータベースの名前を返します。 |
CDatabase::IsOpen |
CDatabase オブジェクトが現在データ ソースに接続されている場合は、0 以外の値を返します。 |
CDatabase::OnSetOptions |
標準の接続オプションを設定するためにフレームワークによって呼び出されます。 既定の実装では、クエリタイムアウト値が設定されます。 SetQueryTimeout を呼び出すことで、これらのオプションを事前に確立できます。 |
CDatabase::Open |
(ODBC ドライバーを介して) データ ソースへの接続を確立します。 |
CDatabase::OpenEx |
(ODBC ドライバーを介して) データ ソースへの接続を確立します。 |
CDatabase::Rollback |
現在のトランザクション中に行われた変更を取り消します。 データ ソースは、 BeginTrans 呼び出しで定義されているように、変更されていない以前の状態に戻ります。 |
CDatabase::SetLoginTimeout |
データ ソース接続の試行がタイムアウトするまでの秒数を設定します。 |
CDatabase::SetQueryTimeout |
データベース クエリ操作がタイムアウトする秒数を設定します。後続のすべてのレコードセット Open 、 AddNew 、 Edit 、および Delete 呼び出しに影響します。 |
パブリック データ メンバー
名前 | 説明 |
---|---|
CDatabase::m_hdbc |
データ ソースへのデータベース接続 (ODBC) 接続ハンドルを開きます。 「 HDBC」と入力します。 |
解説
データ ソースは、一部のデータベース管理システム (DBMS) によってホストされるデータの特定のインスタンスです。 たとえば、Microsoft SQL Server、Microsoft Access、Borland dBASE、xBASE などがあります。 アプリケーションで一度に 1 つ以上の CDatabase
オブジェクトをアクティブにすることができます。
Note
Open Database Connectivity (ODBC) クラスではなく Data Access Objects (DAO) クラスを使用する場合は、代わりにクラス CDaoDatabase
を使用します。 詳細については、「 Overview: データベース プログラミング」を参照してください。
CDatabase
を使用するには、CDatabase
オブジェクトを構築し、そのOpenEx
メンバー関数を呼び出します。 これにより、接続が開きます。 次に、接続されたデータ ソースで操作 CRecordset
オブジェクトを構築するときに、レコードセット コンストラクターに CDatabase
オブジェクトへのポインターを渡します。 接続の使用が完了したら、 Close
メンバー関数を呼び出し、 CDatabase
オブジェクトを破棄します。 Close
は、以前に閉じていないレコードセットを閉じます。
CDatabase
の詳細については、「Data Source (ODBC)」および「Overview: Database Programming」を参照してください。
継承階層
CDatabase
要件
ヘッダー: afxdb.h
CDatabase::BeginTrans
接続されたデータ ソースとのトランザクションを開始するには、このメンバー関数を呼び出します。
BOOL BeginTrans();
戻り値
呼び出しが成功し、変更が手動でのみコミットされた場合は 0 以外。それ以外の場合は 0。
解説
トランザクションは、CRecordset
オブジェクトのAddNew
、Edit
、Delete
、およびUpdate
メンバー関数への 1 つ以上の呼び出しで構成されます。 トランザクションを開始する前に、 CDatabase
オブジェクトは、その OpenEx
または Open
メンバー関数を呼び出すことによって、既にデータ ソースに接続されている必要があります。 トランザクションを終了するには、 CommitTrans
を呼び出してデータ ソースに対するすべての変更を受け入れる (および実行する) か、 Rollback
を呼び出してトランザクション全体を中止します。 トランザクションに関係するレコードセットを開き、可能な限り実際の更新操作に近いレコードセットを開いた後、 BeginTrans
を呼び出します。
注意事項
ODBC ドライバーによっては、 BeginTrans
を呼び出す前にレコードセットを開くと、 Rollback
を呼び出すときに問題が発生することがあります。 使用している特定のドライバーを確認する必要があります。 たとえば、Microsoft ODBC デスクトップ ドライバー パック 3.0 に含まれている Microsoft Access ドライバーを使用する場合は、カーソルが開いているデータベースでトランザクションを開始してはならないという Jet データベース エンジンの要件を考慮する必要があります。 MFC データベース クラスでは、開いているカーソルは開いている CRecordset
オブジェクトを意味します。 詳細については、「 テクニカル ノート 68を参照してください。
BeginTrans
は、要求されたコンカレンシーとデータ ソースの機能に応じて、サーバー上のデータ レコードをロックすることもできます。 データのロックの詳細については、「 Recordset: Locking Records (ODBC)」を参照してください。
ユーザー定義トランザクションについては、 Transaction (ODBC)に関する記事で説明されています。
BeginTrans
は、トランザクションのシーケンスをロールバック (反転) できる状態を確立します。 ロールバックの新しい状態を確立するには、現在のトランザクションをコミットしてから、 BeginTrans
を再度呼び出します。
注意事項
CommitTrans
と Rollback
を呼び出さずに再度 BeginTrans
を呼び出すとエラーが発生します。
CanTransact
メンバー関数を呼び出して、ドライバーが特定のデータベースのトランザクションをサポートしているかどうかを判断します。 また、 GetCursorCommitBehavior
と GetCursorRollbackBehavior
を呼び出して、カーソルの保持のサポートを決定する必要があります。
トランザクションの詳細については、 Transaction (ODBC) に関する記事を参照してください。
例
「 Transaction: レコードセットでのトランザクションの実行 (ODBC)」を参照してください。
CDatabase::BindParameters
CDatabase::ExecuteSQL
を呼び出す前にパラメーターをバインドする必要がある場合は、BindParameters
をオーバーライドします。
virtual void BindParameters(HSTMT hstmt);
パラメーター
hstmt
パラメーターをバインドする ODBC ステートメント ハンドル。
解説
この方法は、ストアド プロシージャの結果セットが不要な場合に便利です。
オーバーライドで、 SQLBindParameters
および関連する ODBC 関数を呼び出して、パラメーターをバインドします。 MFC は、 ExecuteSQL
への呼び出しの前にオーバーライドを呼び出します。 SQLPrepare
を呼び出す必要はありません。ExecuteSQL
はSQLExecDirect
を呼び出し、1 回だけ使用されるhstmt
を破棄します。
CDatabase::Cancel
このメンバー関数を呼び出して、データ ソースが進行中の非同期操作または 2 番目のスレッドからのプロセスを取り消すように要求します。
void Cancel();
解説
MFC ODBC クラスは非同期処理を使用しなくなったことに注意してください。非同期操作を実行するには、ODBC API 関数 SQLSetConnectOption
を直接呼び出す必要があります。 詳細については、「非同期実行」を参照してください。
CDatabase::CanTransact
このメンバー関数を呼び出して、データベースがトランザクションを許可するかどうかを判断します。
BOOL CanTransact() const;
戻り値
この CDatabase
オブジェクトを使用するレコードセットがトランザクションを許可する場合は 0 以外、それ以外の場合は 0。
解説
トランザクションの詳細については、 Transaction (ODBC) に関する記事を参照してください。
CDatabase::CanUpdate
このメンバー関数を呼び出して、 CDatabase
オブジェクトが更新を許可するかどうかを判断します。
BOOL CanUpdate() const;
戻り値
CDatabase
オブジェクトで更新が許可されている場合は 0 以外の場合は 0。それ以外の場合は、CDatabase
オブジェクトを開いたときにbReadOnly
にTRUE
を渡したか、データ ソース自体が読み取り専用であることを示します。 SQL_DATASOURCE_READ_ONLY
の ODBC API 関数の呼び出しがy
を返SQLGetInfo
場合、データ ソースは読み取り専用です。
解説
すべてのドライバーが更新プログラムをサポートしているわけではありません。
CDatabase::CDatabase
CDatabase
オブジェクトを構築します。
CDatabase();
解説
オブジェクトを構築したら、その OpenEx
またはメンバー関数 Open
呼び出して、指定したデータ ソースへの接続を確立する必要があります。
ドキュメント クラスに CDatabase
オブジェクトを埋め込むのが便利な場合があります。
例
この例では、CDocument
派生クラスでCDatabase
を使用する方法を示します。
// This fragment is taken from the declaration for CMyDatabaseDoc
// CMyDatabaseDoc is derived from CDocument.
public:
// Declare a CDatabase embedded in the document
CDatabase m_dbCust;
// Initialize when needed
CDatabase *CMyDatabaseDoc::GetDatabase()
{
// Connect the object to a data source
if (!m_dbCust.IsOpen() && !m_dbCust.OpenEx(NULL))
return NULL;
return &m_dbCust;
}
CDatabase::Close
データ ソースから切断する場合は、このメンバー関数を呼び出します。
virtual void Close();
解説
このメンバー関数を呼び出す前に、 CDatabase
オブジェクトに関連付けられているレコードセットを閉じる必要があります。 Close
はCDatabase
オブジェクトを破棄しないため、同じデータ ソースまたは別のデータ ソースへの新しい接続を開くことで、オブジェクトを再利用できます。
データベースを使用するレコードセットのすべての保留中の AddNew
または Edit
ステートメントが取り消され、保留中のすべてのトランザクションがロールバックされます。 CDatabase
オブジェクトに依存するすべてのレコードセットは、未定義の状態のままです。
例
// Close the current connection
m_dbCust.Close();
// Perhaps connect the object to a
// different data source
m_dbCust.OpenEx(_T("DSN=MFC_ODBCTest;UID=JOES"));
CDatabase::CommitTrans
トランザクションの完了時にこのメンバー関数を呼び出します。
BOOL CommitTrans();
戻り値
更新プログラムが正常にコミットされた場合は 0 以外。それ以外の場合は 0。 CommitTrans
失敗した場合、データ ソースの状態は未定義になります。 データの状態を判断するには、データを確認する必要があります。
解説
トランザクションは、BeginTrans
メンバー関数の呼び出しで始まるCRecordset
オブジェクトのAddNew
、Edit
、Delete
、およびUpdate
メンバー関数の一連の呼び出しで構成されます。 CommitTrans
はトランザクションをコミットします。 既定では、更新はすぐにコミットされます。 BeginTrans
を呼び出すと、 CommitTrans
が呼び出されるまで更新のコミットメントが遅延します。
CommitTrans
を呼び出してトランザクションを終了するまで、Rollback
メンバー関数を呼び出してトランザクションを中止し、データ ソースを元の状態のままにすることができます。 新しいトランザクションを開始するには、もう一度 BeginTrans
呼び出します。
トランザクションの詳細については、 Transaction (ODBC) に関する記事を参照してください。
例
「 Transaction: レコードセットでのトランザクションの実行 (ODBC)」を参照してください。
CDatabase::ExecuteSQL
SQL コマンドを直接実行する必要がある場合は、このメンバー関数を呼び出します。
void ExecuteSQL(LPCTSTR lpszSQL);
パラメーター
lpszSQL
実行する有効な SQL コマンドを含む null で終わる文字列へのポインター。 CString
を渡すことができます。
解説
null で終わる文字列としてコマンドを作成します。 ExecuteSQL
はデータ レコードを返しません。 レコードを操作する場合は、代わりにレコードセット オブジェクトを使用します。
データ ソースのコマンドのほとんどは、レコードセット オブジェクトを通じて発行されます。レコードセット オブジェクトは、データの選択、新しいレコードの挿入、レコードの削除、レコードの編集を行うコマンドをサポートします。 ただし、すべての ODBC 機能がデータベース クラスで直接サポートされているわけではないため、 ExecuteSQL
を使用して直接 SQL 呼び出しを行う必要がある場合があります。
例
try
{
m_dbCust.ExecuteSQL(
_T("UPDATE Taxes ")
_T("SET Rate = '36' ")
_T("WHERE Name = 'Federal'"));
}
catch (CDBException *pe)
{
// The error code is in pe->m_nRetCode
pe->ReportError();
pe->Delete();
}
CDatabase::GetBookmarkPersistence
特定の操作の後で、レコードセット オブジェクトでのブックマークの永続性を判別するには、このメンバー関数を呼び出します。
DWORD GetBookmarkPersistence() const;
戻り値
レコードセット オブジェクトでブックマークが保持されている操作を識別するビットマスク。 詳細については、「解説」を参照してください。
解説
たとえば、CRecordset::GetBookmark
を呼び出してから CRecordset::Requery
を呼び出した場合、GetBookmark
から取得されたブックマークは有効ではなくなっている場合があります。 GetBookmarkPersistence
を呼び出してから CRecordset::SetBookmark
を呼び出す必要があります。
GetBookmarkPersistence
の戻り値として組み合わせることができるビットマスク値の一覧を次の表に示します。
ビットマスク値 | ブックマークの永続性 |
---|---|
SQL_BP_CLOSE |
ブックマークは、 Requery 操作の後に有効です。 |
SQL_BP_DELETE |
行のブックマークは、その行に対する Delete 操作の後に有効です。 |
SQL_BP_DROP |
ブックマークは、 Close 操作の後に有効です。 |
SQL_BP_SCROLL |
ブックマークは、 Move 操作の後に有効です。 これは、CRecordset::CanBookmark によって返されるのと同様に、レコードセットでブックマークがサポートされているかどうかだけを示します。 |
SQL_BP_TRANSACTION |
トランザクションがコミットまたはロールバックされた後、ブックマークは有効です。 |
SQL_BP_UPDATE |
行のブックマークは、その行に対する Update 操作の後に有効です。 |
SQL_BP_OTHER_HSTMT |
1 つのレコードセット オブジェクトに関連付けられたブックマークは、別のレコードセットで有効です。 |
この戻り値の詳細については、Windows SDK の ODBC API 関数 SQLGetInfo
を参照してください。 ブックマークの詳細については、「 Recordset: Bookmarks and Absolute Positions (ODBC)」を参照してください。
CDatabase::GetConnect
このメンバー関数を呼び出すことで、OpenEx
オブジェクトをデータ ソースに接続した Open
または CDatabase
の呼び出し時に使用された接続文字列を取得します。
const CString GetConnect() const;
戻り値
OpenEx
またはOpen
が呼び出された場合は接続文字列を含むconst
CString
。それ以外の場合は空の文字列。
解説
接続文字列の作成方法については、CDatabase::Open
を参照してください。
CDatabase::GetCursorCommitBehavior
このメンバー関数を呼び出して、 CommitTrans
操作が開いているレコードセット オブジェクトのカーソルにどのように影響するかを判断します。
int GetCursorCommitBehavior() const;
戻り値
開いているレコードセット オブジェクトに対するトランザクションの影響を示す値。 詳細については、「解説」を参照してください。
解説
次の表に、 GetCursorCommitBehavior
で使用可能な戻り値と、開いているレコードセットに対する対応する効果を示します。
戻り値 | CRecordset オブジェクトへの影響 |
---|---|
SQL_CB_CLOSE |
トランザクションのコミットの直後に CRecordset::Requery を呼び出します。 |
SQL_CB_DELETE |
トランザクションのコミットの直後に CRecordset::Close を呼び出します。 |
SQL_CB_PRESERVE |
通常、 CRecordset 操作を続行します。 |
この戻り値の詳細については、Windows SDK の ODBC API 関数 SQLGetInfo
を参照してください。 トランザクションの詳細については、 Transaction (ODBC) に関する記事を参照してください。
CDatabase::GetCursorRollbackBehavior
このメンバー関数を呼び出して、 Rollback
操作が開いているレコードセット オブジェクトのカーソルにどのように影響するかを判断します。
int GetCursorRollbackBehavior() const;
戻り値
開いているレコードセット オブジェクトに対するトランザクションの影響を示す値。 詳細については、「解説」を参照してください。
解説
次の表に、 GetCursorRollbackBehavior
で使用可能な戻り値と、開いているレコードセットに対する対応する効果を示します。
戻り値 | CRecordset オブジェクトへの影響 |
---|---|
SQL_CB_CLOSE |
トランザクションのロールバックの直後に CRecordset::Requery を呼び出します。 |
SQL_CB_DELETE |
トランザクションのロールバックの直後に CRecordset::Close を呼び出します。 |
SQL_CB_PRESERVE |
通常、 CRecordset 操作を続行します。 |
この戻り値の詳細については、Windows SDK の ODBC API 関数 SQLGetInfo
を参照してください。 トランザクションの詳細については、 Transaction (ODBC) に関する記事を参照してください。
CDatabase::GetDatabaseName
このメンバー関数を呼び出して、現在接続されているデータベースの名前を取得します (データ ソースが "database" という名前付きオブジェクトを定義している場合)。
CString GetDatabaseName() const;
戻り値
成功した場合はデータベース名を含む CString
。それ以外の場合は空の CString
。
解説
これは、 OpenEx
または Open
呼び出しで指定されたデータ ソース名 (DSN) と同じではありません。 返 GetDatabaseName
は ODBC によって異なります。 一般に、データベースはテーブルのコレクションです。 このエンティティに名前がある場合、 GetDatabaseName
はそれを返します。
たとえば、見出しにこの名前を表示できます。 ODBC から名前を取得中にエラーが発生した場合、 GetDatabaseName
は空の CString
を返します。
CDatabase::IsOpen
このメンバー関数を呼び出して、 CDatabase
オブジェクトが現在データ ソースに接続されているかどうかを確認します。
BOOL IsOpen() const;
戻り値
CDatabase
オブジェクトが現在接続されている場合は 0 以外、それ以外の場合は 0。
CDatabase::m_hdbc
ODBC データ ソース接続へのパブリック ハンドル ("接続ハンドル") が含まれています。
解説
通常、このメンバー変数に直接アクセスする必要はありません。 代わりに、 OpenEx
または Open
を呼び出すときに、フレームワークによってハンドルが割り当てられます。 CDatabase
オブジェクトでdelete
演算子を呼び出すと、フレームワークによってハンドルの割り当てが解除されます。 Close
メンバー関数はハンドルの割り当てを解除しないことに注意してください。
ただし、状況によっては、ハンドルを直接使用することが必要になる場合があります。 たとえば、クラス CDatabase
ではなく ODBC API 関数を直接呼び出す必要がある場合は、パラメーターとして渡す接続ハンドルが必要になる場合があります。 以下のコード例を参照してください。
例
// Using m_hdbc for a direct ODBC API call.
// m_dbCust is the CDatabase object; m_hdbc is
// its HDBC member variable
nRetCode = ::SQLGetInfo(m_dbCust.m_hdbc, SQL_ODBC_SQL_CONFORMANCE,
&nValue, sizeof(nValue), &cbValue);
CDatabase::OnSetOptions
フレームワークは、 ExecuteSQL
メンバー関数を使用して SQL ステートメントを直接実行するときに、このメンバー関数を呼び出します。
virtual void OnSetOptions(HSTMT hstmt);
パラメーター
hstmt
どのオプションが設定されているかを ODBC ステートメント で処理します。
解説
CRecordset::OnSetOptions
このメンバー関数も呼び出します。
OnSetOptions
は、ログイン タイムアウト値を設定します。 SetQueryTimeout
およびメンバー関数の以前の呼び出しがあった場合、OnSetOptions
は現在の値を反映し、それ以外の場合は既定値を設定します。
Note
MFC 4.2 より前では、 OnSetOptions
処理モードを snychronous または非同期に設定しました。 MFC 4.2 以降では、すべての操作が同期されます。 非同期操作を実行するには、ODBC API 関数 SQLSetPos
を直接呼び出す必要があります。
タイムアウト値を変更するために OnSetOptions
をオーバーライドする必要はありません。 代わりに、クエリタイムアウト値をカスタマイズするには、レコードセットを作成する前に SetQueryTimeout
を呼び出します。 OnSetOptions
は新しい値を使用します。 設定された値は、すべてのレコードセットまたは直接 SQL 呼び出しに対する後続の操作に適用されます。
追加のオプションを設定する場合は、 OnSetOptions
をオーバーライドします。 オーバーライドでは、ODBC API 関数SQLSetStmtOption
を呼び出す前または後に、基底クラスOnSetOptions
を呼び出す必要があります。 フレームワークの既定の OnSetOptions
の実装に示されているメソッドに従います。
CDatabase::Open
このメンバー関数を呼び出して、新しく構築された CDatabase
オブジェクトを初期化します。
virtual BOOL Open(
LPCTSTR lpszDSN,
BOOL bExclusive = FALSE,
BOOL bReadOnly = FALSE,
LPCTSTR lpszConnect = _T("ODBC;"),
BOOL bUseCursorLib = TRUE);
パラメーター
lpszDSN
データ ソース名を指定します。ODBC Administrator プログラムを使用して ODBC に登録された名前です。 DSN 値が lpszConnect
("DSN=<data-source>" の形式で指定されている場合は lpszDSN
で再度指定することはできません。 この場合は、 lpszDSN
を NULL
する必要があります。 それ以外の場合は、ユーザーがデータ ソースを選択できる [データ ソース] ダイアログ ボックスをユーザーに表示する場合は、 NULL
を渡すことができます。 詳細については、「解説」を参照してください。
bExclusive
このバージョンのクラス ライブラリではサポートされていません。 現在、このパラメーターが TRUE
されている場合、アサーションは失敗します。 データ ソースは常に共有として開かれます (排他的ではありません)。
bReadOnly
TRUE
接続を読み取り専用にする場合、およびデータ ソースの更新を禁止する場合は〘。 依存するすべてのレコードセットは、この属性を継承します。 既定値は FALSE
です。
lpszConnect
接続文字列を指定します。 接続文字列は、データ ソース名、データ ソースで有効なユーザー ID、ユーザー認証文字列 (データ ソースに必要な場合はパスワード)、その他の情報を含む情報を連結します。 接続文字列全体の先頭には、文字列"ODBC;"
(大文字または小文字) を付ける必要があります。 "ODBC;"
文字列は、ODBC データ ソースへの接続であることを示すために使用されます。これは、将来のバージョンのクラス ライブラリで ODBC 以外のデータ ソースがサポートされる可能性がある場合に、上位互換性を確保するために使用されます。
bUseCursorLib
TRUE
ODBC カーソル ライブラリ DLL を読み込む場合は〘。 カーソル ライブラリは、基になる ODBC ドライバーの一部の機能をマスクし、ダイナセットの使用を効果的に防止します (ドライバーでサポートされている場合)。 カーソル ライブラリが読み込まれる場合にサポートされるカーソルは、静的スナップショットと順方向専用カーソルだけです。 既定値は TRUE
です。 CRecordset
から派生せずにレコードセット オブジェクトを直接作成する場合は、カーソル ライブラリを読み込むべきではありません。
戻り値
接続が正常に確立された場合は 0 以外。それ以外の場合は、ユーザーが選択した場合は 0 キャンセル 詳細な接続情報を求めるダイアログ ボックスが表示されます。 それ以外の場合は、フレームワークによって例外がスローされます。
解説
データベース オブジェクトを使用してレコードセット オブジェクトを作成する前に、データベース オブジェクトを初期化する必要があります。
Note
OpenEx
メンバー関数を呼び出すことは、データ ソースに接続してデータベース オブジェクトを初期化する方法として推奨されます。
Open
呼び出しのパラメーターに、接続を確立するための十分な情報が含まれていない場合、ODBC ドライバーはダイアログ ボックスを開き、ユーザーから必要な情報を取得します。 Open
を呼び出すと、接続文字列 (lpszConnect
) はCDatabase
オブジェクトにプライベートに格納され、GetConnect
メンバー関数を呼び出すことによって使用できます。
必要に応じて、Open
を呼び出してユーザーから情報 (パスワードなど) を取得する前に、独自のダイアログ ボックスを開き、その情報をOpen
に渡す接続文字列に追加できます。 または、次にアプリケーションがCDatabase
オブジェクトでOpen
を呼び出す際に再利用できるように、渡した接続文字列を保存することもできます。
また、接続文字列を使用して、複数レベルのログイン承認 (それぞれ異なるCDatabase
オブジェクトに対して) や、他のデータ ソース固有の情報を伝達することもできます。 接続文字列の詳細については、Windows SDK の第 5 章を参照してください。
たとえば、DBMS ホストが使用できない場合は、接続試行がタイムアウトになる可能性があります。 接続の試行が失敗した場合、 Open
は CDBException
をスローします。
例
// m_dbCust is a CDatabase object embedded in a CDocument class
if (bDefault)
{
// Connect the object to a data source (no password)
// the ODBC connection dialog box will always remain hidden
m_dbCust.Open(_T("MFC_ODBCTest"), FALSE, FALSE, _T("ODBC;UID=JOES"));
}
else
{
// ...Or, query the user for all connection information
m_dbCust.Open(NULL);
}
CDatabase::OpenEx
このメンバー関数を呼び出して、新しく構築された CDatabase
オブジェクトを初期化します。
virtual BOOL OpenEx(
LPCTSTR lpszConnectString,
DWORD dwOptions = 0);
パラメーター
lpszConnectString
ODBC 接続文字列を指定します。 これには、データ ソース名だけでなく、ユーザー ID やパスワードなどのその他の省略可能な情報も含まれます。 たとえば、"DSN=SQLServer_Source;UID=SA;PWD=abc123"
は可能な接続文字列です。 lpszConnectString
のNULL
を渡すと、[データ ソース] ダイアログ ボックスでユーザーにデータ ソースの選択を求めるメッセージが表示されることに注意してください。
dwOptions
次の値の組み合わせを指定するビットマスク。 既定値は 0 です。つまり、データベースは書き込みアクセスで共有として開かれます。ODBC カーソル ライブラリ DLL は読み込まれず、ODBC 接続ダイアログ ボックスは接続に十分な情報がない場合にのみ表示されます。
CDatabase::openExclusive
このバージョンのクラス ライブラリではサポートされていません。 データ ソースは常に共有として開かれます (排他的ではありません)。 現時点では、このオプションを指定するとアサーションは失敗します。CDatabase::openReadOnly
データ ソースを読み取り専用で開きます。CDatabase::useCursorLib
ODBC カーソル ライブラリ DLL を読み込みます。 カーソル ライブラリは、基になる ODBC ドライバーの一部の機能をマスクし、ダイナセットの使用を効果的に防止します (ドライバーでサポートされている場合)。 カーソル ライブラリが読み込まれる場合にサポートされるカーソルは、静的スナップショットと順方向専用カーソルだけです。CRecordset
から派生せずにレコードセット オブジェクトを直接作成する場合は、カーソル ライブラリを読み込むべきではありません。CDatabase::noOdbcDialog
十分な接続情報が指定されているかどうかに関係なく、ODBC 接続ダイアログ ボックスを表示しないでください。CDatabase::forceOdbcDialog
[ODBC 接続] ダイアログ ボックスを常に表示します。
戻り値
接続が正常に確立された場合は 0 以外。それ以外の場合は、ユーザーが選択した場合は 0 キャンセル 詳細な接続情報を求めるダイアログ ボックスが表示されます。 それ以外の場合は、フレームワークによって例外がスローされます。
解説
データベース オブジェクトを使用してレコードセット オブジェクトを作成する前に、データベース オブジェクトを初期化する必要があります。
OpenEx
呼び出しのlpszConnectString
パラメーターに接続を確立するのに十分な情報が含まれていない場合、ODBC ドライバーは、dwOptions
パラメーターでCDatabase::noOdbcDialog
またはCDatabase::forceOdbcDialog
を設定していない場合、ユーザーから必要な情報を取得するためのダイアログ ボックスを開きます。 OpenEx
を呼び出すと、接続文字列 (lpszConnectString
) はCDatabase
オブジェクトにプライベートに格納され、GetConnect
メンバー関数を呼び出すことによって使用できます。
必要に応じて、OpenEx
を呼び出してユーザーから情報 (パスワードなど) を取得する前に、独自のダイアログ ボックスを開き、その情報をOpenEx
に渡す接続文字列に追加できます。 または、次にアプリケーションがCDatabase
オブジェクトでOpenEx
を呼び出す際に再利用できるように、渡した接続文字列を保存することもできます。
また、接続文字列を使用して、複数レベルのログイン承認 (それぞれ異なるCDatabase
オブジェクトに対して) や、他のデータ ソース固有の情報を伝達することもできます。 接続文字列の詳細については、「ODBC プログラマー リファレンスの第 6 章を参照してください。
たとえば、DBMS ホストが使用できない場合は、接続試行がタイムアウトになる可能性があります。 接続の試行が失敗した場合、 OpenEx
は CDBException
をスローします。
例
// m_dbCust is a CDatabase object embedded in a CDocument class.
// Connect the object to a read-only data source where
// the ODBC connection dialog box will always remain hidden
m_dbCust.OpenEx(_T("DSN=MFC_ODBCTest;UID=JOES"),
CDatabase::openReadOnly | CDatabase::noOdbcDialog);
CDatabase::Rollback
トランザクション中に行われた変更を元に戻すには、このメンバー関数を呼び出します。
BOOL Rollback();
戻り値
トランザクションが正常に取り消された場合は 0 以外。それ以外の場合は 0。 Rollback
呼び出しが失敗した場合、データ ソースとトランザクションの状態は未定義になります。 Rollback
0 が返される場合は、データ ソースを調べて状態を確認する必要があります。
解説
最後のBeginTrans
以降に実行されたすべてのCRecordset
AddNew
、Edit
、Delete
、およびUpdate
呼び出しは、その呼び出し時に存在していた状態にロールバックされます。
Rollback
の呼び出し後、トランザクションは終了し、別のトランザクションのBeginTrans
を再度呼び出す必要があります。 BeginTrans
を呼び出す前に現在のレコードが、Rollback
後に再びカレント レコードになります。
ロールバック後、ロールバック前の最新のレコードは最新の状態のままになります。 ロールバック後のレコードセットとデータ ソースの状態の詳細については、 Transaction (ODBC)に関する記事を参照してください。
例
「 Transaction: レコードセットでのトランザクションの実行 (ODBC)」を参照してください。
CDatabase::SetLoginTimeout
OpenEx
またはOpen
を呼び出す前に、このメンバー関数を呼び出して、試行されたデータ ソース接続がタイムアウトするまでに許可される既定の秒数をオーバーライドします。
void SetLoginTimeout(DWORD dwSeconds);
パラメーター
dwSeconds
接続試行がタイムアウトするまでに許可する秒数。
解説
たとえば、DBMS が使用できない場合は、接続試行がタイムアウトになる可能性があります。 初期化されていないCDatabase
オブジェクトを作成した後、OpenEx
またはOpen
を呼び出す前に、SetLoginTimeout
を呼び出します。
ログイン タイムアウトの既定値は 15 秒です。 すべてのデータ ソースでログイン タイムアウト値を指定できるわけではありません。 データ ソースがタイムアウトをサポートしていない場合は、トレース出力を取得しますが、例外は取得しません。 値 0 は "無限" を意味します。
CDatabase::SetQueryTimeout
接続されたデータ ソースに対する後続の操作がタイムアウトするまでの既定の秒数をオーバーライドするには、このメンバー関数を呼び出します。
void SetQueryTimeout(DWORD dwSeconds);
パラメーター
dwSeconds
クエリの試行がタイムアウトするまでに許可する秒数。
解説
ネットワーク アクセスの問題、過剰なクエリ処理時間などが原因で、操作がタイムアウトする可能性があります。 クエリタイムアウト値を変更する場合は、レコードセットを開く前、またはレコードセットのAddNew
、Update
、またはDelete
メンバー関数を呼び出す前に、SetQueryTimeout
を呼び出します。 この設定は、このCDatabase
オブジェクトに関連付けられているレコードセットに対する後続のすべてのOpen
、AddNew
、Update
、およびDelete
呼び出しに影響します。 開いた後にレコードセットのクエリ タイムアウト値を変更しても、レコードセットの値は変更されません。 たとえば、後続の Move
操作では、新しい値は使用されません。
クエリ タイムアウトの既定値は 15 秒です。 すべてのデータ ソースでクエリ タイムアウト値を設定できるわけではありません。 クエリのタイムアウト値を 0 に設定した場合、タイムアウトは発生しません。データ ソースとの通信が応答しなくなる可能性があります。 この動作は、開発中に役立つ場合があります。 データ ソースがタイムアウトをサポートしていない場合は、トレース出力を取得しますが、例外は取得しません。