MFC - Classes de base de données
UNE databaseest une collection d'informations qui est organisée de manière à être facilement accessible, gérée et mise à jour. Les classes de base de données MFC basées sur ODBC sont conçues pour fournir l'accès à toute base de données pour laquelle un pilote ODBC est disponible. Étant donné que les classes utilisent ODBC, votre application peut accéder aux données dans de nombreux formats de données et différentes configurations locales / distantes.
Vous n'avez pas à écrire de code de cas particulier pour gérer différents systèmes de gestion de base de données (SGBD). Tant que vos utilisateurs disposent d'un pilote ODBC approprié pour les données auxquelles ils souhaitent accéder, ils peuvent utiliser votre programme pour manipuler les données des tables qui y sont stockées. Une source de données est une instance spécifique de données hébergée par un système de gestion de base de données (SGBD). Les exemples incluent Microsoft SQL Server, Microsoft Access, etc.
CDatabase
MFC fournit une classe CDatabasequi représente une connexion à une source de données, à travers laquelle vous pouvez opérer sur la source de données. Vous pouvez avoir un ou plusieurs objets CDatabase actifs à la fois dans votre application.
Sr.No. | Nom et description |
---|---|
1 | BeginTrans Démarre une "transaction" - une série d'appels réversibles aux fonctions membres AddNew, Edit, Delete et Update de la classe CRecordset- sur la source de données connectée. La source de données doit prendre en charge les transactions pourBeginTrans pour avoir un effet. |
2 | BindParameters Vous permet de lier des paramètres avant d'appeler ExecuteSQL. |
3 | Cancel Annule une opération asynchrone ou un processus à partir d'un deuxième thread. |
4 | CanTransact Renvoie une valeur différente de zéro si la source de données prend en charge les transactions. |
5 | CanUpdate Renvoie une valeur différente de zéro si le CDatabase l'objet peut être mis à jour (pas en lecture seule). |
6 | Close Ferme la connexion à la source de données. |
sept | CommitTrans Termine une transaction commencée par BeginTrans. Les commandes de la transaction qui modifient la source de données sont exécutées. |
8 | ExecuteSQL Exécute une instruction SQL. Aucun enregistrement de données n'est renvoyé. |
9 | GetBookmarkPersistence Identifie les opérations par lesquelles les signets persistent sur les objets du jeu d'enregistrements. |
dix | GetConnect Renvoie la chaîne de connexion ODBC utilisée pour connecter l'objet CDatabase à une source de données. |
11 | GetCursorCommitBehavior Identifie l'effet de la validation d'une transaction sur un objet de jeu d'enregistrements ouvert. |
12 | GetCursorRollbackBehavior Identifie l'effet de l'annulation d'une transaction sur un objet de jeu d'enregistrements ouvert. |
13 | GetDatabaseName Renvoie le nom de la base de données actuellement utilisée. |
14 | IsOpen Renvoie une valeur différente de zéro si le CDatabase l'objet est actuellement connecté à une source de données. |
15 | OnSetOptions Appelé par le framework pour définir les options de connexion standard. L'implémentation par défaut définit la valeur du délai d'expiration de la requête. Vous pouvez définir ces options à l'avance en appelantSetQueryTimeout. |
16 | Open Établit une connexion à une source de données (via un pilote ODBC). |
17 | OpenEx Établit une connexion à une source de données (via un pilote ODBC). |
18 | Rollback Annule les modifications apportées au cours de la transaction en cours. La source de données revient à son état précédent, tel que défini lors de l'appel BeginTrans, sans modification. |
19 | SetLoginTimeout Définit le nombre de secondes après lequel une tentative de connexion à une source de données expirera. |
20 | SetQueryTimeout Définit le nombre de secondes après lequel les opérations de requête de base de données expireront. Affecte tous les appels suivants du jeu d'enregistrements Open, AddNew, Edit et Delete. |
Examinons un exemple simple en créant une nouvelle application basée sur une boîte de dialogue MFC.
Step 1 - Remplacez la légende de la ligne TODO par Retrieve Data from Database et faites glisser un bouton et un contrôle de liste comme indiqué dans l'instantané suivant.
Step 2 - Ajouter un gestionnaire d'événements de clic pour le bouton et la variable de contrôle m_ListControl pour le contrôle de liste.
Step 3 - Nous avons une base de données simple qui contient une table Employés avec quelques enregistrements comme indiqué dans l'instantané suivant.
Step 4 - Nous devons inclure le fichier d'en-têtes suivant afin de pouvoir utiliser la classe CDatabase.
#include "odbcinst.h"
#include "afxdb.h"
Insérer une requête
L'instruction SQL INSERT INTO est utilisée pour ajouter de nouvelles lignes de données à une table de la base de données.
Step 1 - Pour ajouter de nouveaux enregistrements, nous utiliserons la fonction ExecuteSQL () de la classe CDatabase comme indiqué dans le code suivant.
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 - Lorsque le code ci-dessus est compilé et exécuté, vous verrez qu'un nouvel enregistrement est ajouté dans votre base de données.
Récupérer l'enregistrement
Pour récupérer la table ci-dessus dans l'application MFC, nous implémentons les opérations liées à la base de données dans le gestionnaire d'événements de bouton, comme indiqué dans les étapes suivantes.
Step 1- Pour utiliser CDatabase, construisez un objet CDatabase et appelez sa fonction Open (). Cela ouvrira la connexion.
Step 2 - Construisez des objets CRecordset pour fonctionner sur la source de données connectée, passez le constructeur du jeu d'enregistrements un pointeur vers votre objet CDatabase.
Step 3 - Après avoir utilisé la connexion, appelez la fonction Fermer et détruisez l'objet 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 - Voici le fichier d'en-tête.
// 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 - Lorsque le code ci-dessus est compilé et exécuté, vous verrez la sortie suivante.
Step 6- Appuyez sur le bouton Lire pour exécuter les opérations de base de données. Il récupérera la table Employés.
Mettre à jour l'enregistrement
La requête SQL UPDATE est utilisée pour modifier les enregistrements existants dans une table. Vous pouvez utiliser la clause WHERE avec la requête UPDATE pour mettre à jour les lignes sélectionnées, sinon toutes les lignes seraient affectées.
Step 1 - Prenons un exemple simple en mettant à jour l'âge où l'ID est égal à 5.
SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";
database.ExecuteSQL(SqlString);
Step 2 - Voici le code complet de l'événement de clic de bouton.
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 - Lorsque le code ci-dessus est compilé et exécuté, vous verrez la sortie suivante.
Step 4- Appuyez sur le bouton Lire pour exécuter les opérations de base de données. Il récupérera la table Employés suivante.
Step 5 - Vous pouvez maintenant voir que l'âge est mis à jour de 69 à 59 ans.
Supprimer l'enregistrement
La requête SQL DELETE est utilisée pour supprimer les enregistrements existants d'une table. Vous pouvez utiliser la clause WHERE avec la requête DELETE pour supprimer les lignes sélectionnées, sinon tous les enregistrements seraient supprimés.
Step 1 - Prenons un exemple simple en supprimant l'enregistrement où ID est égal à 3.
SqlString = L"DELETE FROM Employees WHERE ID = 3;";
database.ExecuteSQL(SqlString);
Step 2 - Voici le code complet de l'événement de clic de bouton.
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 - Lorsque le code ci-dessus est compilé et exécuté, vous verrez la sortie suivante.
Step 4- Appuyez sur le bouton Lire pour exécuter les opérations de base de données. Il récupérera la table Employés.