CDatabase
クラス
データ ソースへの接続を表します。これを通じてデータ ソース上で操作を行うことができます。
構文
class CDatabase : public CObject
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CDatabase::CDatabase |
CDatabase オブジェクトを構築します。 オブジェクトを初期化するには、次を呼び出OpenEx します。Open |
パブリック メソッド
名前 | 説明 |
---|---|
CDatabase::BeginTrans |
接続されたデータ ソースの "トランザクション" (クラスCRecordset の 、Edit 、Delete およびメンバー関数に対するAddNew 一連の元に戻せる呼び出しUpdate ) を開始します。 データ ソースは、何らかの影響を与 BeginTrans えるためにトランザクションをサポートする必要があります。 |
CDatabase::BindParameters |
呼び出す CDatabase::ExecuteSQL 前にパラメーターをバインドできます。 |
CDatabase::Cancel |
非同期操作または 2 番目のスレッドからのプロセスを取り消します。 |
CDatabase::CanTransact |
データ ソースがトランザクションをサポートしている場合は、0 以外の値を返します。 |
CDatabase::CanUpdate |
オブジェクトが更新可能な場合は 0 以外の値を CDatabase 返します (読み取り専用ではありません)。 |
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 dBA Standard Edition、xBA Standard Edition などがあります。 アプリケーションで一度に 1 つ以上の CDatabase
オブジェクトをアクティブにすることができます。
Note
Open Database Connectivity (ODBC) クラスではなく Data Access Objects (DAO) クラスを使用する場合は、代わりにクラス CDaoDatabase
を使用してください。 詳細については、「概要: データベース プログラミング」を参照してください。
CDatabase
使用するには、オブジェクトをCDatabase
構築し、そのメンバー関数をOpenEx
呼び出します。 これにより、接続が開きます。 接続されたデータ ソースで操作するオブジェクトを構築 CRecordset
するときに、レコードセット コンストラクターにオブジェクトへのポインターを CDatabase
渡します。 接続の使用が完了したら、メンバー関数を Close
呼び出してオブジェクトを CDatabase
破棄します。 Close
は、以前に閉じていないレコードセットを閉じます。
詳細については、データ ソース (ODBC) と概要: データベース プログラミングに関CDatabase
する記事を参照してください。
継承階層
CDatabase
必要条件
ヘッダー:afxdb.h
CDatabase::BeginTrans
接続されたデータ ソースとのトランザクションを開始するには、このメンバー関数を呼び出します。
BOOL BeginTrans();
戻り値
呼び出しが成功し、変更が手動でのみコミットされた場合は 0 以外。それ以外の場合は 0。
解説
トランザクションは、オブジェクトの 、Edit
、およびメンバー関数への AddNew
1 つ以上の呼び出しUpdate
でCRecordset
構成Delete
されます。 トランザクションを開始する前にCDatabase
、オブジェクトがそのオブジェクトまたはOpen
メンバー関数を呼び出すことによって、データ ソースに既にOpenEx
接続されている必要があります。 トランザクションを終了するには、 CommitTrans
データ ソースに対するすべての変更を受け入れる (実行する) か、トランザクション全体を中止する呼び出しを呼び出 Rollback
します。 トランザクションに関係するレコードセットを開いた後、および可能な限り実際の更新操作に近い状態で呼び出 BeginTrans
します。
注意事項
ODBC ドライバーによっては、呼び出し前にレコードセットを開くと、呼び出BeginTrans
Rollback
し時に問題が発生することがあります。 使用している特定のドライバーをチェックする必要があります。 たとえば、Microsoft ODBC デスクトップ ドライバー パック 3.0 に含まれている Microsoft Access ドライバーを使用する場合は、カーソルが開いているデータベースでトランザクションを開始してはならないという Jet データベース エンジンの要件を考慮する必要があります。 MFC データベース クラスでは、開いているカーソルは開 CRecordset
いているオブジェクトを意味します。 詳細については、テクニカル ノート 68 を参照してください。
BeginTrans
は、要求されたコンカレンシーとデータ ソースの機能に応じて、サーバー上のデータ レコードをロックすることもできます。 データのロックの詳細については、「Recordset: Locking Records (ODBC)」を参照してください。
ユーザー定義トランザクションについては、トランザクション (ODBC) に関する記事を参照してください。
BeginTrans
は、トランザクションのシーケンスをロールバック (反転) できる状態を確立します。 ロールバックの新しい状態を確立するには、現在のトランザクションをコミットしてから、もう一度呼び出 BeginTrans
します。
注意事項
CommitTrans
と Rollback
を呼び出さずに再度 BeginTrans
を呼び出すとエラーが発生します。
メンバー関数を CanTransact
呼び出して、ドライバーが特定のデータベースのトランザクションをサポートしているかどうかを判断します。 また、カーソルの保持のサポートを呼び出 GetCursorCommitBehavior
して GetCursorRollbackBehavior
決定する必要もあります。
トランザクションの詳細については、トランザクション (ODBC) に関する記事を参照してください。
例
「Transaction: Performing a Transaction in a Recordset (ODBC)」を参照してください。
CDatabase::BindParameters
呼び出すCDatabase::ExecuteSQL
前にパラメーターをバインドする必要があるときにオーバーライドしますBindParameters
。
virtual void BindParameters(HSTMT hstmt);
パラメーター
hstmt
パラメーターをバインドする ODBC ステートメント ハンドル。
解説
この方法は、ストアド プロシージャの結果セットが不要な場合に便利です。
オーバーライドで、パラメーターをバインドする ODBC 関数と関連する ODBC 関数を呼び出 SQLBindParameters
します。 MFC は、呼び出しの前にオーバーライドを呼び出します ExecuteSQL
。 呼び出しを行う必要はありません。1 回だけ使用される 、を呼び出SQLPrepare
ExecuteSQL
SQLExecDirect
して破棄します。hstmt
CDatabase::Cancel
このメンバー関数を呼び出して、データ ソースが進行中の非同期操作または 2 番目のスレッドからのプロセスを取り消すように要求します。
void Cancel();
解説
MFC ODBC クラスは非同期処理を使用しなくなったことに注意してください。非同期操作を実行するには、ODBC API 関数 SQLSetConnectOption
を直接呼び出す必要があります。 詳細については、「非同期実行」を参照してください。
CDatabase::CanTransact
このメンバー関数を呼び出して、データベースがトランザクションを許可するかどうかを判断します。
BOOL CanTransact() const;
戻り値
この CDatabase
オブジェクトを使用するレコードセットがトランザクションを許可する場合は 0 以外、それ以外の場合は 0。
解説
トランザクションの詳細については、トランザクション (ODBC) に関する記事を参照してください。
CDatabase::CanUpdate
このメンバー関数を呼び出して、オブジェクトが更新を CDatabase
許可するかどうかを判断します。
BOOL CanUpdate() const;
戻り値
オブジェクトで更新がCDatabase
許可されている場合は 0 以外、それ以外の場合は 0。オブジェクトを開CDatabase
いたときに渡したかTRUE
bReadOnly
、データ ソース自体が読み取り専用であることを示します。 ODBC API 関数SQLGetInfo
SQL_DATASOURCE_READ_ONLY
を呼び出して戻y
り値を返す場合、データ ソースは読み取り専用です。
解説
すべてのドライバーが更新プログラムをサポートしているわけではありません。
CDatabase::CDatabase
CDatabase
オブジェクトを構築します。
CDatabase();
解説
オブジェクトを構築した後、その OpenEx
オブジェクトまたは Open
メンバー関数を呼び出して、指定したデータ ソースへの接続を確立する必要があります。
ドキュメント クラスにオブジェクトを埋め込むのが CDatabase
便利な場合があります。
例
この例では、-derived クラスでの使用 CDatabase
を CDocument
示します。
// 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
、データ ソースの状態は未定義になります。 データの状態を判断するには、データをチェックする必要があります。
解説
トランザクションは、メンバー関数の呼び出しAddNew
で始まったオブジェクトの 、Edit
、Delete
およびUpdate
メンバー関数へのBeginTrans
一連のCRecordset
呼び出しで構成されます。 CommitTrans
はトランザクションをコミットします。 既定では、更新はすぐにコミットされます。呼び出すと BeginTrans
、更新プログラムのコミットメントが呼び出されるまで CommitTrans
遅延されます。
トランザクションを終了するために呼び出 CommitTrans
すまで、メンバー関数を Rollback
呼び出してトランザクションを中止し、データ ソースを元の状態のままにすることができます。 新しいトランザクションを開始するには、もう一度呼び出 BeginTrans
します。
トランザクションの詳細については、トランザクション (ODBC) に関する記事を参照してください。
例
「Transaction: Performing a Transaction in a Recordset (ODBC)」を参照してください。
CDatabase::ExecuteSQL
SQL コマンドを直接実行する必要がある場合は、このメンバー関数を呼び出します。
void ExecuteSQL(LPCTSTR lpszSQL);
パラメーター
lpszSQL
実行する有効な SQL コマンドを含む null で終わる文字列へのポインター。 を渡 CString
すことができます。
解説
null で終わる文字列としてコマンドを作成します。 ExecuteSQL
はデータ レコードを返しません。 レコードを操作する場合は、代わりにレコードセット オブジェクトを使用します。
データ ソースのコマンドのほとんどは、レコードセット オブジェクトを通じて発行されます。レコードセット オブジェクトは、データの選択、新しいレコードの挿入、レコードの削除、レコードの編集を行うコマンドをサポートします。 ただし、すべての ODBC 機能がデータベース クラスで直接サポートされているわけではありません。そのため、場合によっては ExecuteSQL
、.
例
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;
戻り値
const
CString
呼び出された場合はOpen
接続文字列を含む。OpenEx
それ以外の場合は空の文字列。
解説
接続文字列の作成方法の説明を参照してください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
を参照してください。 トランザクションの詳細については、トランザクション (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
を参照してください。 トランザクションの詳細については、トランザクション (ODBC) に関する記事を参照してください。
CDatabase::GetDatabaseName
このメンバー関数を呼び出して、現在接続されているデータベースの名前を取得します (データ ソースが "database" という名前付きオブジェクトを定義している場合)。
CString GetDatabaseName() const;
戻り値
CString
成功した場合はデータベース名を含む。それ以外の場合は空CString
です。
解説
これは、呼Open
び出しでOpenEx
指定されたデータ ソース名 (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
フレームワークは、メンバー関数を使用して SQL ステートメントを直接実行するときに、このメンバー関数を ExecuteSQL
呼び出します。
virtual void OnSetOptions(HSTMT hstmt);
パラメーター
hstmt
どのオプションが設定されているかを ODBC ステートメント で処理します。
解説
CRecordset::OnSetOptions
このメンバー関数も呼び出します。
OnSetOptions
は、ログイン タイムアウト値を設定します。 以前に and メンバー関数の SetQueryTimeout
呼び出しがあった場合は、 OnSetOptions
現在の値が反映されます。それ以外の場合は既定値が設定されます。
Note
MFC 4.2 より前のバージョンでは、 OnSetOptions
処理モードを snychronous または非同期に設定しました。 MFC 4.2 以降では、すべての操作が同期されます。 非同期操作を実行するには、ODBC API 関数 SQLSetPos
を直接呼び出す必要があります。
タイムアウト値を変更するためにオーバーライド OnSetOptions
する必要はありません。 代わりに、クエリタイムアウト値をカスタマイズするには、レコードセットOnSetOptions
を作成する前に呼び出SetQueryTimeout
します。新しい値を使用します。 設定された値は、すべてのレコードセットまたは直接 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 管理istrator プログラムを介して ODBC に登録された名前) を指定します。 DSN 値が ("DSN=<data-source>" という形式でlpszConnect
) 指定されている場合は、この値を で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
した接続文字列にその情報を追加します。 または、次にアプリケーションがオブジェクトを呼び出Open
す際に再利用できるように、渡す接続文字列をCDatabase
保存することもできます。
接続文字列を使用して、複数レベルのログイン承認 (異なる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"
可能な接続文字列です。 渡NULL
lpszConnectString
すと、[データ ソース] ダイアログ ボックスでデータ ソースの選択を求めるメッセージが表示されることに注意してください。
dwOptions
次の値の組み合わせを指定するビットマスク。 既定値は 0 です。つまり、データベースは書き込みアクセスで共有として開かれます。ODBC カーソル ライブラリ DLL は読み込まれず、ODBC 接続ダイアログ ボックスは接続に十分な情報がない場合にのみ表示されます。
CDatabase::openExclusive
このバージョンのクラス ライブラリではサポートされていません。 データ ソースは常に共有として開かれます (排他的ではありません)。 現時点では、このオプションを指定するとアサーションは失敗します。CDatabase::openReadOnly
データ ソースを読み取り専用で開きます。CDatabase::useCursorLib
ODBC カーソル ライブラリ DLL を読み込みます。 カーソル ライブラリは、基になる ODBC ドライバーの一部の機能をマスクし、ダイナセットの使用を効果的に防止します (ドライバーでサポートされている場合)。 カーソル ライブラリが読み込まれる場合にサポートされるカーソルは、静的スナップショットカーソルと順方向専用カーソルだけです。 レコードセット オブジェクトから派生せずに直接CRecordset
レコードセット オブジェクトを作成する場合は、カーソル ライブラリを読み込むべきではありません。CDatabase::noOdbcDialog
十分な接続情報が指定されているかどうかに関係なく、ODBC 接続ダイアログ ボックスを表示しないでください。CDatabase::forceOdbcDialog
[ODBC 接続] ダイアログ ボックスを常に表示します。
戻り値
接続が正常に確立された場合は 0 以外。それ以外の場合は、ユーザーが選択した場合は 0 キャンセル 詳細な接続情報を求めるダイアログ ボックスが表示されます。 それ以外の場合は、フレームワークによって例外がスローされます。
解説
データベース オブジェクトを使用してレコードセット オブジェクトを作成する前に、データベース オブジェクトを初期化する必要があります。
呼び出しの lpszConnectString
パラメーターに OpenEx
接続を確立するための十分な情報が含まれていない場合、ODBC ドライバーはダイアログ ボックスを開き、パラメーターを設定 CDatabase::noOdbcDialog
していない場合、または CDatabase::forceOdbcDialog
パラメーターで dwOptions
必要な情報をユーザーから取得します。 呼び出OpenEx
すと、接続文字列はlpszConnectString
オブジェクトにプライベートにCDatabase
格納され、メンバー関数をGetConnect
呼び出すことによって使用できます。
必要に応じて、パスワードなどのユーザーから情報を取得するために呼び出すOpenEx
前に独自のダイアログ ボックスを開き、渡OpenEx
した接続文字列にその情報を追加できます。 または、次にアプリケーションがオブジェクトを呼び出OpenEx
す際に再利用できるように、渡す接続文字列をCDatabase
保存することもできます。
接続文字列を使用して、複数レベルのログイン承認 (異なる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
失敗した場合、データ ソースとトランザクションの状態は未定義になります。 0 が返された場合Rollback
は、データ ソースをチェックして、その状態を判断する必要があります。
解説
Delete
Edit
最後CRecordset
AddNew
BeginTrans
の呼び出し以降に実行されたすべての呼び出しUpdate
は、その呼び出し時に存在していた状態にロールバックされます。
呼び出し Rollback
の後、トランザクションは終了し、別のトランザクションに対して再度呼び出す BeginTrans
必要があります。 呼び出 BeginTrans
す前に現在のレコードが、次の後 Rollback
に再びカレント レコードになります。
ロールバック後、ロールバック前に現在のレコードが再メイン現在のレコードになります。 ロールバック後のレコードセットとデータ ソースの状態の詳細については、トランザクション (ODBC) に関する記事を参照してください。
例
「Transaction: Performing a Transaction in a Recordset (ODBC)」を参照してください。
CDatabase::SetLoginTimeout
このメンバー関数を呼び出す前に、またはOpen
呼び出OpenEx
す前に、試行されたデータ ソース接続がタイムアウトするまでに許可される既定の秒数をオーバーライドします。
void SetLoginTimeout(DWORD dwSeconds);
パラメーター
dwSeconds
接続試行がタイムアウトするまでに許可する秒数。
解説
たとえば、DBMS が使用できない場合は、接続試行がタイムアウトになる可能性があります。 初期化CDatabase
されていないオブジェクトを構築した後、呼び出SetLoginTimeout
す前に呼び出します。Open
OpenEx
ログイン タイムアウトの既定値は 15 秒です。 すべてのデータ ソースでログイン タイムアウト値を指定できるわけではありません。 データ ソースがタイムアウトをサポートしていない場合は、トレース出力を取得しますが、例外は取得しません。 値 0 は "無限" を意味します。
CDatabase::SetQueryTimeout
接続されたデータ ソースに対する後続の操作がタイムアウトするまでの既定の秒数をオーバーライドするには、このメンバー関数を呼び出します。
void SetQueryTimeout(DWORD dwSeconds);
パラメーター
dwSeconds
クエリの試行がタイムアウトするまでに許可する秒数。
解説
ネットワーク アクセスの問題、過剰なクエリ処理時間などが原因で、操作がタイムアウトする可能性があります。 クエリ タイムアウト値を変更する場合は、レコードセットを開く前、またはDelete
レコードセットのAddNew
メンバーUpdate
関数を呼び出す前に呼び出SetQueryTimeout
します。 この設定は、AddNew
このCDatabase
オブジェクトに関連付けられているすべてのレコードセットに対する後続Open
のすべての呼び出し 、、Update
および呼び出しDelete
に影響します。 開いた後にレコードセットのクエリ タイムアウト値を変更しても、レコードセットの値は変更されません。 たとえば、後続 Move
の操作では新しい値は使用されません。
クエリ タイムアウトの既定値は 15 秒です。 すべてのデータ ソースでクエリ タイムアウト値を設定できるわけではありません。 クエリのタイムアウト値を 0 に設定した場合、タイムアウトは発生しません。データ ソースとの通信が応答しなくなる可能性があります。 この動作は、開発中に役立つ場合があります。 データ ソースがタイムアウトをサポートしていない場合は、トレース出力を取得しますが、例外は取得しません。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示