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.