Share via


CDatabase クラス

データ ソースへの接続を表します。これを通じてデータ ソース上で操作を行うことができます。

構文

class CDatabase : public CObject

メンバー

パブリック コンストラクター

名前 説明
CDatabase::CDatabase CDatabase オブジェクトを構築します。 オブジェクトを初期化するには、次を呼び出OpenExします。Open

パブリック メソッド

名前 説明
CDatabase::BeginTrans 接続されたデータ ソースの "トランザクション" (クラスCRecordsetの 、EditDeleteおよびメンバー関数に対する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、、 AddNewEditおよび呼び出しに 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する記事を参照してください。

継承階層

CObject

CDatabase

必要条件

ヘッダー:afxdb.h

CDatabase::BeginTrans

接続されたデータ ソースとのトランザクションを開始するには、このメンバー関数を呼び出します。

BOOL BeginTrans();

戻り値

呼び出しが成功し、変更が手動でのみコミットされた場合は 0 以外。それ以外の場合は 0。

解説

トランザクションは、オブジェクトの 、Edit、およびメンバー関数への AddNew1 つ以上の呼び出しUpdateCRecordset構成Deleteされます。 トランザクションを開始する前にCDatabase、オブジェクトがそのオブジェクトまたはOpenメンバー関数を呼び出すことによって、データ ソースに既にOpenEx接続されている必要があります。 トランザクションを終了するには、 CommitTrans データ ソースに対するすべての変更を受け入れる (実行する) か、トランザクション全体を中止する呼び出しを呼び出 Rollback します。 トランザクションに関係するレコードセットを開いた後、および可能な限り実際の更新操作に近い状態で呼び出 BeginTrans します。

注意事項

ODBC ドライバーによっては、呼び出し前にレコードセットを開くと、呼び出BeginTransRollbackし時に問題が発生することがあります。 使用している特定のドライバーをチェックする必要があります。 たとえば、Microsoft ODBC デスクトップ ドライバー パック 3.0 に含まれている Microsoft Access ドライバーを使用する場合は、カーソルが開いているデータベースでトランザクションを開始してはならないという Jet データベース エンジンの要件を考慮する必要があります。 MFC データベース クラスでは、開いているカーソルは開 CRecordset いているオブジェクトを意味します。 詳細については、テクニカル ノート 68 を参照してください

BeginTrans は、要求されたコンカレンシーとデータ ソースの機能に応じて、サーバー上のデータ レコードをロックすることもできます。 データのロックの詳細については、「Recordset: Locking Records (ODBC)」を参照してください

ユーザー定義トランザクションについては、トランザクション (ODBC) に関する記事を参照してください。

BeginTrans は、トランザクションのシーケンスをロールバック (反転) できる状態を確立します。 ロールバックの新しい状態を確立するには、現在のトランザクションをコミットしてから、もう一度呼び出 BeginTrans します。

注意事項

CommitTransRollback を呼び出さずに再度 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 回だけ使用される 、を呼び出SQLPrepareExecuteSQLSQLExecDirectして破棄します。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いたときに渡したかTRUEbReadOnly、データ ソース自体が読み取り専用であることを示します。 ODBC API 関数SQLGetInfoSQL_DATASOURCE_READ_ONLYを呼び出して戻yり値を返す場合、データ ソースは読み取り専用です。

解説

すべてのドライバーが更新プログラムをサポートしているわけではありません。

CDatabase::CDatabase

CDatabase オブジェクトを構築します。

CDatabase();

解説

オブジェクトを構築した後、その OpenEx オブジェクトまたは Open メンバー関数を呼び出して、指定したデータ ソースへの接続を確立する必要があります。

ドキュメント クラスにオブジェクトを埋め込むのが CDatabase 便利な場合があります。

この例では、-derived クラスでの使用 CDatabaseCDocument示します。

// 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で始まったオブジェクトの 、EditDeleteおよび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;

戻り値

constCString呼び出された場合は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 から名前を取得中にエラーが発生した場合は、 GetDatabaseNameCStringの値を返します。

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再度指定することはできません。 この場合、次のようになります lpszDSNNULL。 それ以外の場合は、ユーザーがデータ ソースを選択できる [データ ソース] ダイアログ ボックスをユーザーに表示する場合に渡 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 ホストが使用できない場合は、接続試行がタイムアウトになる可能性があります。 接続の試行が失敗した場合は、 OpenCDBException.

// 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"可能な接続文字列です。 渡NULLlpszConnectStringすと、[データ ソース] ダイアログ ボックスでデータ ソースの選択を求めるメッセージが表示されることに注意してください。

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 ホストが使用できない場合は、接続試行がタイムアウトになる可能性があります。 接続の試行が失敗した場合は、 OpenExCDBException.

// 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は、データ ソースをチェックして、その状態を判断する必要があります。

解説

DeleteEdit最後CRecordsetAddNewBeginTransの呼び出し以降に実行されたすべての呼び出し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す前に呼び出します。OpenOpenEx

ログイン タイムアウトの既定値は 15 秒です。 すべてのデータ ソースでログイン タイムアウト値を指定できるわけではありません。 データ ソースがタイムアウトをサポートしていない場合は、トレース出力を取得しますが、例外は取得しません。 値 0 は "無限" を意味します。

CDatabase::SetQueryTimeout

接続されたデータ ソースに対する後続の操作がタイムアウトするまでの既定の秒数をオーバーライドするには、このメンバー関数を呼び出します。

void SetQueryTimeout(DWORD dwSeconds);

パラメーター

dwSeconds
クエリの試行がタイムアウトするまでに許可する秒数。

解説

ネットワーク アクセスの問題、過剰なクエリ処理時間などが原因で、操作がタイムアウトする可能性があります。 クエリ タイムアウト値を変更する場合は、レコードセットを開く前、またはDeleteレコードセットのAddNewメンバーUpdate関数を呼び出す前に呼び出SetQueryTimeoutします。 この設定は、AddNewこのCDatabaseオブジェクトに関連付けられているすべてのレコードセットに対する後続Openのすべての呼び出し 、、Updateおよび呼び出しDeleteに影響します。 開いた後にレコードセットのクエリ タイムアウト値を変更しても、レコードセットの値は変更されません。 たとえば、後続 Move の操作では新しい値は使用されません。

クエリ タイムアウトの既定値は 15 秒です。 すべてのデータ ソースでクエリ タイムアウト値を設定できるわけではありません。 クエリのタイムアウト値を 0 に設定した場合、タイムアウトは発生しません。データ ソースとの通信が応答しなくなる可能性があります。 この動作は、開発中に役立つ場合があります。 データ ソースがタイムアウトをサポートしていない場合は、トレース出力を取得しますが、例外は取得しません。

関連項目

CObject クラス
階層図
CRecordset クラス