MFC-데이터베이스 클래스
ㅏ database쉽게 액세스, 관리 및 업데이트 할 수 있도록 구성된 정보 모음입니다. ODBC 기반 MFC 데이터베이스 클래스는 ODBC 드라이버를 사용할 수있는 모든 데이터베이스에 대한 액세스를 제공하도록 설계되었습니다. 클래스는 ODBC를 사용하기 때문에 응용 프로그램은 다양한 데이터 형식과 다양한 로컬 / 원격 구성의 데이터에 액세스 할 수 있습니다.
다른 데이터베이스 관리 시스템 (DBMS)을 처리하기 위해 특별한 경우 코드를 작성할 필요가 없습니다. 사용자가 액세스하려는 데이터에 대한 적절한 ODBC 드라이버를 가지고있는 한, 프로그램을 사용하여 저장된 테이블의 데이터를 조작 할 수 있습니다. 데이터 소스는 일부 데이터베이스 관리 시스템 (DBMS)에서 호스팅하는 특정 데이터 인스턴스입니다. 예를 들어 Microsoft SQL Server, Microsoft Access 등이 있습니다.
CDatabase
MFC는 클래스를 제공합니다 CDatabase데이터 소스에 대한 작업을 수행 할 수있는 데이터 소스에 대한 연결을 나타냅니다. 애플리케이션에서 한 번에 하나 이상의 CDatabase 개체를 활성화 할 수 있습니다.
Sr. 아니. | 이름 및 설명 |
---|---|
1 | BeginTrans "트랜잭션"시작 — 클래스의 AddNew, Edit, Delete 및 Update 멤버 함수에 대한 일련의 가역적 호출 CRecordset— 연결된 데이터 소스. 데이터 소스는 다음에 대한 트랜잭션을 지원해야합니다.BeginTrans 효과가 있습니다. |
2 | BindParameters 호출하기 전에 매개 변수를 바인딩 할 수 있습니다. ExecuteSQL. |
삼 | Cancel 두 번째 스레드에서 비동기 작업 또는 프로세스를 취소합니다. |
4 | CanTransact 데이터 소스가 트랜잭션을 지원하는 경우 0이 아닌 값을 반환합니다. |
5 | CanUpdate 0이 아닌 경우 CDatabase 개체를 업데이트 할 수 있습니다 (읽기 전용 아님). |
6 | Close 데이터 소스 연결을 닫습니다. |
7 | CommitTrans BeginTrans가 시작한 트랜잭션을 완료합니다. 데이터 소스를 변경하는 트랜잭션의 명령이 수행됩니다. |
8 | ExecuteSQL SQL 문을 실행합니다. 데이터 레코드가 반환되지 않습니다. |
9 | GetBookmarkPersistence 책갈피가 레코드 세트 개체에 유지되는 작업을 식별합니다. |
10 | GetConnect CDatabase 개체를 데이터 소스에 연결하는 데 사용되는 ODBC 연결 문자열을 반환합니다. |
11 | GetCursorCommitBehavior 열린 레코드 세트 개체에 대한 트랜잭션 커밋의 효과를 식별합니다. |
12 | GetCursorRollbackBehavior 열린 레코드 집합 개체에 대한 트랜잭션 롤백의 효과를 식별합니다. |
13 | GetDatabaseName 현재 사용중인 데이터베이스의 이름을 반환합니다. |
14 | IsOpen 0이 아닌 경우 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 다음 스냅 샷과 같이 버튼 하나와 목록 컨트롤 하나를 드래그합니다.
Step 2 − 버튼 클릭 이벤트 핸들러를 추가하고 목록 제어를위한 제어 변수 m_ListControl을 추가합니다.
Step 3 − 다음 스냅 샷과 같이 일부 레코드가있는 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 개체를 생성하고 레코드 집합 생성자에 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 쿼리는 테이블의 기존 레코드를 수정하는 데 사용됩니다. UPDATE 쿼리와 함께 WHERE 절을 사용하여 선택한 행을 업데이트 할 수 있습니다. 그렇지 않으면 모든 행이 영향을받습니다.
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 쿼리는 테이블에서 기존 레코드를 삭제하는 데 사용됩니다. DELETE 쿼리와 함께 WHERE 절을 사용하여 선택한 행을 삭제할 수 있습니다. 그렇지 않으면 모든 레코드가 삭제됩니다.
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 테이블을 검색합니다.