MFC - classes de banco de dados

UMA databaseé uma coleção de informações organizada de forma que possa ser facilmente acessada, gerenciada e atualizada. As classes de banco de dados MFC com base em ODBC são projetadas para fornecer acesso a qualquer banco de dados para o qual um driver ODBC está disponível. Como as classes usam ODBC, seu aplicativo pode acessar dados em muitos formatos de dados diferentes e diferentes configurações locais / remotas.

Você não precisa escrever código de caso especial para lidar com diferentes sistemas de gerenciamento de banco de dados (DBMSs). Contanto que seus usuários tenham um driver ODBC apropriado para os dados que desejam acessar, eles podem usar seu programa para manipular dados em tabelas armazenadas lá. Uma fonte de dados é uma instância específica de dados hospedada por algum sistema de gerenciamento de banco de dados (DBMS). Os exemplos incluem Microsoft SQL Server, Microsoft Access, etc.

CDatabase

MFC fornece uma classe CDatabaseque representa uma conexão a uma fonte de dados, por meio da qual você pode operar na fonte de dados. Você pode ter um ou mais objetos CDatabase ativos por vez em seu aplicativo.

Sr. Não. Nome e Descrição
1

BeginTrans

Inicia uma "transação" - uma série de chamadas reversíveis para as funções de membro AddNew, Edit, Delete e Update da classe CRecordset- na fonte de dados conectada. A fonte de dados deve suportar transações paraBeginTrans para ter qualquer efeito.

2

BindParameters

Permite vincular parâmetros antes de chamar ExecuteSQL.

3

Cancel

Cancela uma operação assíncrona ou um processo de um segundo encadeamento.

4

CanTransact

Retorna diferente de zero se a fonte de dados oferece suporte a transações.

5

CanUpdate

Retorna diferente de zero se o CDatabase objeto é atualizável (não somente leitura).

6

Close

Fecha a conexão da fonte de dados.

7

CommitTrans

Conclui uma transação iniciada por BeginTrans. Comandos na transação que alteram a fonte de dados são executados.

8

ExecuteSQL

Executa uma instrução SQL. Nenhum registro de dados é retornado.

9

GetBookmarkPersistence

Identifica as operações por meio das quais os indicadores persistem em objetos do conjunto de registros.

10

GetConnect

Retorna a string de conexão ODBC usada para conectar o objeto CDatabase a uma fonte de dados.

11

GetCursorCommitBehavior

Identifica o efeito de confirmar uma transação em um objeto de conjunto de registros aberto.

12

GetCursorRollbackBehavior

Identifica o efeito de reverter uma transação em um objeto de conjunto de registros aberto.

13

GetDatabaseName

Retorna o nome do banco de dados atualmente em uso.

14

IsOpen

Retorna diferente de zero se o CDatabase objeto está atualmente conectado a uma fonte de dados.

15

OnSetOptions

Chamado pela estrutura para definir opções de conexão padrão. A implementação padrão define o valor de tempo limite da consulta. Você pode estabelecer essas opções com antecedência ligando paraSetQueryTimeout.

16

Open

Estabelece uma conexão com uma fonte de dados (por meio de um driver ODBC).

17

OpenEx

Estabelece uma conexão com uma fonte de dados (por meio de um driver ODBC).

18

Rollback

Reverte as alterações feitas durante a transação atual. A fonte de dados retorna ao seu estado anterior, conforme definido na chamada BeginTrans, inalterado.

19

SetLoginTimeout

Define o número de segundos após o qual uma tentativa de conexão de fonte de dados atingirá o tempo limite.

20

SetQueryTimeout

Define o número de segundos após o qual as operações de consulta do banco de dados expirarão. Afeta todas as chamadas subsequentes Abrir, Adicionar Novo, Editar e Excluir do conjunto de registros.

Vejamos um exemplo simples, criando um novo aplicativo baseado em diálogo do MFC.

Step 1 - Altere a legenda da linha TODO para Retrieve Data from Database e arraste um botão e um controle de lista conforme mostrado no instantâneo a seguir.

Step 2 - Adicionar manipulador de eventos de clique para botão e variável de controle m_ListControl para Controle de lista.

Step 3 - Temos um banco de dados simples que contém uma tabela de Funcionários com alguns registros como mostrado no instantâneo a seguir.

Step 4 - Precisamos incluir o seguinte arquivo de cabeçalhos para que possamos usar a classe CDatabase.

#include "odbcinst.h"
#include "afxdb.h"

Inserir Consulta

A instrução SQL INSERT INTO é usada para adicionar novas linhas de dados a uma tabela no banco de dados.

Step 1 - Para adicionar novos registros, usaremos a função ExecuteSQL () da classe CDatabase conforme mostrado no código a seguir.

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 - Quando o código acima for compilado e executado, você verá que um novo registro é adicionado ao seu banco de dados.

Recuperar registro

Para recuperar a tabela acima no aplicativo MFC, implementamos as operações relacionadas ao banco de dados no manipulador de eventos do botão, conforme mostrado nas etapas a seguir.

Step 1- Para usar CDatabase, construa um objeto CDatabase e chame sua função Open (). Isso abrirá a conexão.

Step 2 - Construa objetos CRecordset para operar na fonte de dados conectada, passe ao construtor do conjunto de registros um ponteiro para seu objeto CDatabase.

Step 3 - Depois de usar a conexão, chame a função Fechar e destrua o objeto 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 - Aqui está o arquivo de cabeçalho.

// 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 - Quando o código acima for compilado e executado, você verá a seguinte saída.

Step 6- Pressione o botão Ler para executar as operações do banco de dados. Ele irá recuperar a tabela Funcionários.

Atualizar registro

O SQL UPDATE Query é usado para modificar os registros existentes em uma tabela. Você pode usar a cláusula WHERE com a consulta UPDATE para atualizar as linhas selecionadas, caso contrário, todas as linhas seriam afetadas.

Step 1 - Vejamos um exemplo simples atualizando a Idade onde ID é igual a 5.

SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";
database.ExecuteSQL(SqlString);

Step 2 - Aqui está o código completo do evento de clique de botão.

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 - Quando o código acima for compilado e executado, você verá a seguinte saída.

Step 4- Pressione o botão Ler para executar as operações do banco de dados. Ele irá recuperar a seguinte tabela Funcionários.

Step 5 - Agora você pode ver que a idade foi atualizada de 69 para 59.

Apagar registro

A consulta SQL DELETE é usada para excluir os registros existentes de uma tabela. Você pode usar a cláusula WHERE com a consulta DELETE para excluir as linhas selecionadas, caso contrário, todos os registros serão excluídos.

Step 1 - Vejamos um exemplo simples excluindo o registro onde ID é igual a 3.

SqlString = L"DELETE FROM Employees WHERE ID = 3;";

database.ExecuteSQL(SqlString);

Step 2 - Aqui está o código completo do evento de clique de botão.

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 - Quando o código acima for compilado e executado, você verá a seguinte saída.

Step 4- Pressione o botão Ler para executar as operações do banco de dados. Ele irá recuperar a tabela Funcionários.