次の方法で共有


CDatabase クラス

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

構文

class CDatabase : public CObject

メンバー

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

名前 説明
CDatabase::CDatabase CDatabase オブジェクトを構築します。 OpenExまたはOpenを呼び出して、オブジェクトを初期化する必要があります。

パブリック メソッド

名前 説明
CDatabase::BeginTrans 接続されたデータ ソースで、クラス CRecordsetAddNewEditDelete、および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 データベース クエリ操作がタイムアウトする秒数を設定します。後続のすべてのレコードセット OpenAddNewEdit、および 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」を参照してください。

継承階層

CObject

CDatabase

要件

ヘッダー: afxdb.h

CDatabase::BeginTrans

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

BOOL BeginTrans();

戻り値

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

解説

トランザクションは、CRecordset オブジェクトのAddNewEditDelete、および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 を再度呼び出します。

注意事項

CommitTransRollback を呼び出さずに再度 BeginTrans を呼び出すとエラーが発生します。

CanTransact メンバー関数を呼び出して、ドライバーが特定のデータベースのトランザクションをサポートしているかどうかを判断します。 また、 GetCursorCommitBehaviorGetCursorRollbackBehavior を呼び出して、カーソルの保持のサポートを決定する必要があります。

トランザクションの詳細については、 Transaction (ODBC) に関する記事を参照してください。

Transaction: レコードセットでのトランザクションの実行 (ODBC)」を参照してください。

CDatabase::BindParameters

CDatabase::ExecuteSQLを呼び出す前にパラメーターをバインドする必要がある場合は、BindParametersをオーバーライドします。

virtual void BindParameters(HSTMT hstmt);

パラメーター

hstmt
パラメーターをバインドする ODBC ステートメント ハンドル。

解説

この方法は、ストアド プロシージャの結果セットが不要な場合に便利です。

オーバーライドで、 SQLBindParameters および関連する ODBC 関数を呼び出して、パラメーターをバインドします。 MFC は、 ExecuteSQLへの呼び出しの前にオーバーライドを呼び出します。 SQLPrepareを呼び出す必要はありません。ExecuteSQLSQLExecDirectを呼び出し、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 オブジェクトを開いたときにbReadOnlyTRUEを渡したか、データ ソース自体が読み取り専用であることを示します。 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 オブジェクトに関連付けられているレコードセットを閉じる必要があります。 CloseCDatabase オブジェクトを破棄しないため、同じデータ ソースまたは別のデータ ソースへの新しい接続を開くことで、オブジェクトを再利用できます。

データベースを使用するレコードセットのすべての保留中の 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 オブジェクトのAddNewEditDelete、および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が呼び出された場合は接続文字列を含むconstCString。それ以外の場合は空の文字列。

解説

接続文字列の作成方法については、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で再度指定することはできません。 この場合は、 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に渡す接続文字列に追加できます。 または、次にアプリケーションがCDatabase オブジェクトでOpenを呼び出す際に再利用できるように、渡した接続文字列を保存することもできます。

また、接続文字列を使用して、複数レベルのログイン承認 (それぞれ異なる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"は可能な接続文字列です。 lpszConnectStringNULLを渡すと、[データ ソース] ダイアログ ボックスでユーザーにデータ ソースの選択を求めるメッセージが表示されることに注意してください。

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 ホストが使用できない場合は、接続試行がタイムアウトになる可能性があります。 接続の試行が失敗した場合、 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呼び出しが失敗した場合、データ ソースとトランザクションの状態は未定義になります。 Rollback 0 が返される場合は、データ ソースを調べて状態を確認する必要があります。

解説

最後のBeginTrans以降に実行されたすべてのCRecordset AddNewEditDelete、および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
クエリの試行がタイムアウトするまでに許可する秒数。

解説

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

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

関連項目

CObject クラス
階層図
CRecordset クラス