MFC-データベースクラス
- データベース*は、簡単にアクセス、管理、および更新できるように編成された情報のコレクションです。 ODBCに基づくMFCデータベースクラスは、ODBCドライバーが利用可能なデータベースへのアクセスを提供するように設計されています。 クラスはODBCを使用するため、アプリケーションは多くの異なるデータ形式および異なるローカル/リモート構成のデータにアクセスできます。
異なるデータベース管理システム(DBMS)を処理するために特別なケースのコードを記述する必要はありません。 ユーザーがアクセスしたいデータに適したODBCドライバーを持っている限り、ユーザーはプログラムを使用してそこに保存されているテーブルのデータを操作できます。 データソースは、データベース管理システム(DBMS)によってホストされるデータの特定のインスタンスです。 例には、Microsoft SQL Server、Microsoft Accessなどが含まれます。
CDatabase
MFCは、データソースへの接続を表すクラス CDatabase を提供します。これを使用して、データソースを操作できます。 アプリケーションで一度に1つ以上のCDatabaseオブジェクトをアクティブにすることができます。
____CDatabaseクラスのメソッドのリストです。
Sr.No.
|
Name & Description
|
1
|
BeginTrans
接続されたデータソースで、クラス CRecordset のAddNew、Edit、Delete、およびUpdateメンバー関数の一連の可逆呼び出しである「トランザクション」を開始します。 データソースは、 BeginTrans が効果を発揮するためのトランザクションをサポートする必要があります。
|
2
|
BindParameters
- ExecuteSQL* を呼び出す前にパラメーターをバインドできます。
|
3
|
Cancel
非同期操作または2番目のスレッドからのプロセスをキャンセルします。
|
4
|
CanTransact
データソースがトランザクションをサポートする場合、ゼロ以外を返します。
|
5
|
CanUpdate
- CDatabase* オブジェクトが更新可能な場合(読み取り専用ではない場合)、ゼロ以外を返します。
|
6
|
Close
データソース接続を閉じます。
|
7
|
CommitTrans
BeginTransによって開始されたトランザクションを完了します。 データソースを変更するトランザクション内のコマンドが実行されます。
|
8
|
ExecuteSQL
SQLステートメントを実行します。 データレコードは返されません。
|
9
|
GetBookmarkPersistence
レコードセットオブジェクトでブックマークが保持される操作を識別します。
|
10
|
GetConnect
CDatabaseオブジェクトをデータソースに接続するために使用されるODBC接続文字列を返します。
|
11
|
GetCursorCommitBehavior
開いているレコードセットオブジェクトでトランザクションをコミットする効果を識別します。
|
12
|
GetCursorRollbackBehavior
開いているレコードセットオブジェクトでトランザクションをロールバックする効果を識別します。
|
13
|
GetDatabaseName
現在使用中のデータベースの名前を返します。
|
14
|
IsOpen
- CDatabase* オブジェクトが現在データソースに接続されている場合、ゼロ以外を返します。
|
15
|
OnSetOptions
フレームワークによって呼び出され、標準の接続オプションを設定します。 デフォルトの実装では、クエリのタイムアウト値が設定されます。 SetQueryTimeout を呼び出すことにより、これらのオプションを事前に確立できます。
|
16
|
Open
(ODBCドライバーを介して)データソースへの接続を確立します。
|
17
|
OpenEx
(ODBCドライバーを介して)データソースへの接続を確立します。
|
18
|
Rollback
現在のトランザクション中に行われた変更を取り消します。 データソースは、BeginTrans呼び出しで定義された変更されていない前の状態に戻ります。
|
19
|
SetLoginTimeout
データソース接続の試行がタイムアウトになるまでの秒数を設定します。
|
20
|
SetQueryTimeout
データベースクエリ操作がタイムアウトするまでの秒数を設定します。 後続のすべてのレコードセットのOpen、AddNew、Edit、およびDelete呼び出しに影響します。
|
新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。
- ステップ1 *-TODO行のキャプションを*データベースからデータを取得*に変更し、次のスナップショットに示すように1つのボタンと1つのリストコントロールをドラッグします。
DBからデータを取得
- ステップ2 *-ボタンのクリックイベントハンドラーとリストコントロールの変数m_ListControlを追加します。
- ステップ3 *-次のスナップショットに示すように、いくつかのレコードを持つ1つのEmployeesテーブルを含む単純なデータベースがあります。
従業員表
- ステップ4 *-CDatabaseクラスを使用できるように、次のヘッダーファイルを含める必要があります。
クエリを挿入
SQL INSERT INTOステートメントは、データベースのテーブルに新しいデータ行を追加するために使用されます。
- ステップ1 *-新しいレコードを追加するには、次のコードに示すように、CDatabaseクラスのExecuteSQL()関数を使用します。
- ステップ2 *-上記のコードをコンパイルして実行すると、データベースに新しいレコードが追加されていることがわかります。
キューを挿入
レコードを取得
MFCアプリケーションで上記のテーブルを取得するには、次の手順に示すように、ボタンイベントハンドラーでデータベース関連の操作を実装します。
- ステップ1 *-CDatabaseを使用するには、CDatabaseオブジェクトを作成し、そのOpen()関数を呼び出します。 これにより、接続が開きます。
- ステップ2 *-接続されたデータソースで操作するためのCRecordsetオブジェクトを構築し、レコードセットコンストラクターにCDatabaseオブジェクトへのポインターを渡します。
- ステップ3 *-接続の使用後、Close関数を呼び出してCDatabaseオブジェクトを破棄します。
- ステップ5 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。
レコードの取得
- ステップ6 *-読み取りボタンを押して、データベース操作を実行します。 Employeesテーブルを取得します。
レコードの取得
レコードを更新
SQL UPDATEクエリは、テーブル内の既存のレコードを変更するために使用されます。 UPDATEクエリでWHERE句を使用して、選択した行を更新できます。更新しないと、すべての行が影響を受けます。
- ステップ1 *-IDが5であるAgeを更新して、簡単な例を見てみましょう。
- ステップ2 *-ボタンクリックイベントの完全なコードです。
void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
//TODO: Add your control notification handler code here
CDatabase database;
CString SqlString;
CString strID, strName, strAge;
CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
CString sDsn;
CString sFile =
L"C:\\Users\\Muhammad.Waqas\\Downloads\\Compressed\\ReadDB_demo\\Test.mdb";
//You must change above path if it's different
int iRec = 0;
//Build ODBC connection string
sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
TRY {
//Open the database
database.Open(NULL,false,false,sDsn);
//Allocate the recordset
CRecordset recset(&database);
SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";
database.ExecuteSQL(SqlString);
SqlString = "SELECT ID, Name, Age FROM Employees";
//Build the SQL statement
SqlString = "SELECT ID, Name, Age FROM Employees";
//Execute the query
recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);
//Reset List control if there is any data
ResetListControl();
//populate Grids
ListView_SetExtendedListViewStyle(m_listCtrl,LVS_EX_GRIDLINES);
//Column width and heading
m_listCtrl.InsertColumn(0,L"Emp ID",LVCFMT_LEFT,-1,0);
m_listCtrl.InsertColumn(1,L"Name",LVCFMT_LEFT,-1,1);
m_listCtrl.InsertColumn(2, L"Age", LVCFMT_LEFT, -1, 1);
m_listCtrl.SetColumnWidth(0, 120);
m_listCtrl.SetColumnWidth(1, 200);
m_listCtrl.SetColumnWidth(2, 200);
//Loop through each record
while (!recset.IsEOF()) {
//Copy each column into a variable
recset.GetFieldValue(L"ID",strID);
recset.GetFieldValue(L"Name",strName);
recset.GetFieldValue(L"Age", strAge);
//Insert values into the list control
iRec = m_listCtrl.InsertItem(0,strID,0);
m_listCtrl.SetItemText(0,1,strName);
m_listCtrl.SetItemText(0, 2, strAge);
//goto next record
recset.MoveNext();
}
//Close the database
database.Close();
}CATCH(CDBException, e) {
//If a database exception occured, show error msg
AfxMessageBox(L"Database error: " + e→m_strError);
}
END_CATCH;
}
- ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。
レコードの取得
- ステップ4 *-読み取りボタンを押して、データベース操作を実行します。 次のEmployeesテーブルを取得します。
レコードの更新
- ステップ5 *-年齢が69から59に更新されていることがわかります。
レコードを削除
SQL DELETEクエリは、テーブルから既存のレコードを削除するために使用されます。 DELETEクエリでWHERE句を使用して、選択した行を削除できます。そうしないと、すべてのレコードが削除されます。
- ステップ1 *-IDが3であるレコードを削除して、簡単な例を見てみましょう。
- ステップ2 *-ボタンクリックイベントの完全なコードです。
void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
//TODO: Add your control notification handler code here
CDatabase database;
CString SqlString;
CString strID, strName, strAge;
CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
CString sDsn;
CString sFile =
L"C:\\Users\\Muhammad.Waqas\\Downloads\\Compressed\\ReadDB_demo\\Test.mdb";
//You must change above path if it's different
int iRec = 0;
//Build ODBC connection string
sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
TRY {
//Open the database
database.Open(NULL,false,false,sDsn);
//Allocate the recordset
CRecordset recset(&database);
SqlString = L"DELETE FROM Employees WHERE ID = 3;";
database.ExecuteSQL(SqlString);
SqlString = "SELECT ID, Name, Age FROM Employees";
//Build the SQL statement
SqlString = "SELECT ID, Name, Age FROM Employees";
//Execute the query
recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);
//Reset List control if there is any data
ResetListControl();
//populate Grids
ListView_SetExtendedListViewStyle(m_listCtrl,LVS_EX_GRIDLINES);
//Column width and heading
m_listCtrl.InsertColumn(0,L"Emp ID",LVCFMT_LEFT,-1,0);
m_listCtrl.InsertColumn(1,L"Name",LVCFMT_LEFT,-1,1);
m_listCtrl.InsertColumn(2, L"Age", LVCFMT_LEFT, -1, 1);
m_listCtrl.SetColumnWidth(0, 120);
m_listCtrl.SetColumnWidth(1, 200);
m_listCtrl.SetColumnWidth(2, 200);
//Loop through each record
while (!recset.IsEOF()) {
//Copy each column into a variable
recset.GetFieldValue(L"ID",strID);
recset.GetFieldValue(L"Name",strName);
recset.GetFieldValue(L"Age", strAge);
//Insert values into the list control
iRec = m_listCtrl.InsertItem(0,strID,0);
m_listCtrl.SetItemText(0,1,strName);
m_listCtrl.SetItemText(0, 2, strAge);
//goto next record
recset.MoveNext();
}
//Close the database
database.Close();
}CATCH(CDBException, e) {
//If a database exception occured, show error msg
AfxMessageBox(L"Database error: " + e→m_strError);
}
END_CATCH;
}
- ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。
レコードの取得
- ステップ4 *-読み取りボタンを押して、データベース操作を実行します。 Employeesテーブルを取得します。
レコードの更新