MFC-データベースクラス
A databaseは、簡単にアクセス、管理、および更新できるように編成された情報のコレクションです。ODBCに基づくMFCデータベースクラスは、ODBCドライバーが使用可能なすべてのデータベースへのアクセスを提供するように設計されています。クラスはODBCを使用するため、アプリケーションはさまざまなデータ形式およびさまざまなローカル/リモート構成のデータにアクセスできます。
さまざまなデータベース管理システム(DBMS)を処理するために、特別な場合のコードを記述する必要はありません。ユーザーがアクセスしたいデータに適切なODBCドライバーを持っている限り、ユーザーはプログラムを使用して、そこに格納されているテーブルのデータを操作できます。データソースは、データベース管理システム(DBMS)によってホストされるデータの特定のインスタンスです。例としては、Microsoft SQL Server、MicrosoftAccessなどがあります。
CDatabase
MFCはクラスを提供します CDatabaseこれは、データソースへの接続を表し、データソースを操作できます。アプリケーションでは、一度に1つ以上のCDatabaseオブジェクトをアクティブにすることができます。
シニア番号 | 名前と説明 |
---|---|
1 | BeginTrans 「トランザクション」を開始します—クラスのAddNew、Edit、Delete、およびUpdateメンバー関数への一連の可逆呼び出し。 CRecordset—接続されたデータソース上。データソースは、次のトランザクションをサポートする必要があります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ダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。
Step 1 −TODO行のキャプションをに変更します Retrieve Data from Database 次のスナップショットに示すように、1つのボタンと1つのリストコントロールをドラッグします。
Step 2 −ボタンのクリックイベントハンドラーとリストコントロールの制御変数m_ListControlを追加します。
Step 3 −次のスナップショットに示すように、いくつかのレコードを持つ1つのEmployeesテーブルを含む単純なデータベースがあります。
Step 4 − CDatabaseクラスを使用できるように、次のヘッダーファイルをインクルードする必要があります。
#include "odbcinst.h"
#include "afxdb.h"
クエリの挿入
SQL INSERT INTOステートメントは、データベース内のテーブルにデータの新しい行を追加するために使用されます。
Step 1 −新しいレコードを追加するには、次のコードに示すように、CDatabaseクラスのExecuteSQL()関数を使用します。
CDatabase database;
CString SqlString;
CString strID, strName, strAge;
CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
CString sDsn;
CString sFile = L"D:\\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);
SqlString = "INSERT INTO Employees (ID,Name,age) VALUES (5,'Sanjay',69)";
database.ExecuteSQL(SqlString);
// 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;
Step 2 −上記のコードをコンパイルして実行すると、データベースに新しいレコードが追加されていることがわかります。
レコードの取得
MFCアプリケーションで上記のテーブルを取得するには、次の手順に示すように、ボタンイベントハンドラーにデータベース関連の操作を実装します。
Step 1− CDatabaseを使用するには、CDatabaseオブジェクトを作成し、そのOpen()関数を呼び出します。これにより、接続が開きます。
Step 2 −接続されたデータソースを操作するためのCRecordsetオブジェクトを構築し、recordsetコンストラクターにCDatabaseオブジェクトへのポインターを渡します。
Step 3 −接続を使用した後、Close関数を呼び出して、CDatabaseオブジェクトを破棄します。
void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
// TODO: Add your control notification handler code here
CDatabase database;
CString SqlString;
CString strID, strName, strAge;
CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)";
CString sFile = L"D:\\Test.mdb";
// You must change above path if it's different
int iRec = 0;
// Build ODBC connection string
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
TRY {
// Open the database
database.Open(NULL,false,false,sDsn);
// Allocate the recordset
CRecordset recset( &database );
// 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_ListControl,LVS_EX_GRIDLINES);
// Column width and heading
m_ListControl.InsertColumn(0,"Emp ID",LVCFMT_LEFT,-1,0);
m_ListControl.InsertColumn(1,"Name",LVCFMT_LEFT,-1,1);
m_ListControl.InsertColumn(2, "Age", LVCFMT_LEFT, -1, 1);
m_ListControl.SetColumnWidth(0, 120);
m_ListControl.SetColumnWidth(1, 200);
m_ListControl.SetColumnWidth(2, 200);
// Loop through each record
while( !recset.IsEOF() ) {
// Copy each column into a variable
recset.GetFieldValue("ID",strID);
recset.GetFieldValue("Name",strName);
recset.GetFieldValue("Age", strAge);
// Insert values into the list control
iRec = m_ListControl.InsertItem(0,strID,0);
m_ListControl.SetItemText(0,1,strName);
m_ListControl.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("Database error: "+e→m_strError);
}
END_CATCH;
}
// Reset List control
void CMFCDatabaseDemoDlg::ResetListControl() {
m_ListControl.DeleteAllItems();
int iNbrOfColumns;
CHeaderCtrl* pHeader = (CHeaderCtrl*)m_ListControl.GetDlgItem(0);
if (pHeader) {
iNbrOfColumns = pHeader→GetItemCount();
}
for (int i = iNbrOfColumns; i >= 0; i--) {
m_ListControl.DeleteColumn(i);
}
}
Step 4 −これがヘッダーファイルです。
// MFCDatabaseDemoDlg.h : header file
//
#pragma once
#include "afxcmn.h"
// CMFCDatabaseDemoDlg dialog
class CMFCDatabaseDemoDlg : public CDialogEx {
// Construction
public:
CMFCDatabaseDemoDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MFCDATABASEDEMO_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
void ResetListControl();
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_ListControl;
afx_msg void OnBnClickedButtonRead();
};
Step 5 −上記のコードをコンパイルして実行すると、次の出力が表示されます。
Step 6− [読み取り]ボタンを押して、データベース操作を実行します。Employeesテーブルを取得します。
更新記録
SQL UPDATEクエリは、テーブル内の既存のレコードを変更するために使用されます。WHERE句をUPDATEクエリとともに使用して、選択した行を更新できます。そうしないと、すべての行が影響を受けます。
Step 1 −IDが5に等しいAgeを更新して簡単な例を見てみましょう。
SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";
database.ExecuteSQL(SqlString);
Step 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;
}
Step 3 −上記のコードをコンパイルして実行すると、次の出力が表示されます。
Step 4− [読み取り]ボタンを押して、データベース操作を実行します。次のEmployeesテーブルを取得します。
Step 5 −年齢が69から59に更新されていることがわかります。
レコードを削除する
SQL DELETEクエリは、テーブルから既存のレコードを削除するために使用されます。WHERE句をDELETEクエリとともに使用して、選択した行を削除できます。そうしないと、すべてのレコードが削除されます。
Step 1 −IDが3に等しいレコードを削除して簡単な例を見てみましょう。
SqlString = L"DELETE FROM Employees WHERE ID = 3;";
database.ExecuteSQL(SqlString);
Step 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;
}
Step 3 −上記のコードをコンパイルして実行すると、次の出力が表示されます。
Step 4− [読み取り]ボタンを押して、データベース操作を実行します。Employeesテーブルを取得します。