Na linguagem C++ utilizando MFC, você pode manipular dados de qualquer banco de dados que possua um driver suportado pelo ODBC, um sistema de grande porte geralmente utiliza mais de um banco de dados, esta opção torna seu produto mais competitivo no mercado pois pode suportar varias especificações técnicas de hardware e software, assim obtendo vantagem no preço final de sua implementação.
CRecordSet
Representa um conjunto de registros selecionados a partir de uma fonte de dados. Esta classe permite que você manipule por completo um set de dados, obtendo além dos dados contidos na tabela, também seus metadados e contadores uteis para manipular o resultado de uma query em tempo de execução.
Conectando ao Oracle, IBM DB2 e Microsoft SQL Server a partir da mesma Aplicação:
Para efetuar as conexões com os diferentes bancos de dados você precisa primeiro configurar os drivers ODBC necessários no sistema operacional, depois você pode criar um design com 3 componentes RadioButton, um componente Button e um componente CListControl, você encontra um walkthrough de como configurar os drivers ODBC na categoria SQL e C++ deste site, use a figura abaixo para referencia do design:
Retornando dados do Oracle:
Retornando dados do IBM DB2:
Retornando dados do Microsoft SQL Server:
Exemplo:
Neste exemplo criamos uma aplicação MFC Dialog Based e utilizamos uma única conexão para retornar um set de dados comum para cada banco de dados utilizados no programa. Use os trechos do código abaixo para completar seu código gerado automaticamente.
C++
Arquivo .h
// Classe gerada automaticamente
// AcessocppDlg.h : header file
//
#pragma once
// Inclui classe de banco de dados MFC
#include "afxdb.h"
#include "afxcmn.h"
class CAcessocppDlg : public CDialogEx
{
public:
CAcessocppDlg(CWnd* pParent = NULL); // standard constructor
enum { IDD = IDD_ACESSOCPP_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
protected:
HICON m_hIcon;
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
// Cria métodos e objetos da classe
CDatabase db;
CString bancodedados;
void conectarDB(CString dns, CString usuario, CString senha);
afx_msg void OnBnHotItemChangeRadio1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnBnHotItemChangeRadio2(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnBnHotItemChangeRadio3(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnBnClickedButton1();
CListCtrl m_tabela;
};
Arquivo .cpp
// Código gerado automaticamente
// AcessocppDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Acessocpp.h"
#include "AcessocppDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
CAcessocppDlg::CAcessocppDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CAcessocppDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CAcessocppDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST2, m_tabela);
}
BEGIN_MESSAGE_MAP(CAcessocppDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(BCN_HOTITEMCHANGE, IDC_RADIO1, &CAcessocppDlg::OnBnHotItemChangeRadio1)
ON_NOTIFY(BCN_HOTITEMCHANGE, IDC_RADIO2, &CAcessocppDlg::OnBnHotItemChangeRadio2)
ON_NOTIFY(BCN_HOTITEMCHANGE, IDC_RADIO3, &CAcessocppDlg::OnBnHotItemChangeRadio3)
ON_BN_CLICKED(IDC_BUTTON1, &CAcessocppDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
BOOL CAcessocppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// Desenvolvimento Aberto
// Inicializa dialogo
// Define variavel padrão para o banco de dados
bancodedados = "oracle";
// Cria o modelo de exibição de dados
m_tabela.SetView(LV_VIEW_DETAILS);
m_tabela.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES);
return TRUE;
}
void CAcessocppDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
void CAcessocppDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
HCURSOR CAcessocppDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
// **************************
// * Desenvolvimento Aberto *
// **************************
// Nosso código começa aqui
// Seleciona banco de dados Oracle
void CAcessocppDlg::OnBnHotItemChangeRadio1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMBCHOTITEM pHotItem = reinterpret_cast<LPNMBCHOTITEM>(pNMHDR);
bancodedados = "oracle";
*pResult = 0;
}
// Seleciona banco de dados IBM DB2
void CAcessocppDlg::OnBnHotItemChangeRadio2(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMBCHOTITEM pHotItem = reinterpret_cast<LPNMBCHOTITEM>(pNMHDR);
bancodedados = "db2";
*pResult = 0;
}
// Seleciona banco de dados MSSQL
void CAcessocppDlg::OnBnHotItemChangeRadio3(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMBCHOTITEM pHotItem = reinterpret_cast<LPNMBCHOTITEM>(pNMHDR);
bancodedados = "mssql";
*pResult = 0;
}
// Evento de clique do botão
void CAcessocppDlg::OnBnClickedButton1()
{
// campo de dado da tabela
CString m_campo;
// Abre conexão
if (bancodedados == "oracle")
{
conectarDB(L"OracleXE", L"daberto", L"p@55w0rd");
}
if (bancodedados == "db2")
{
conectarDB(L"IBMDB2", L"db2admin", L"p@55w0rd");
}
if (bancodedados == "mssql")
{
conectarDB(L"MSSQLSERVER", L"devaberto", L"p@55w0rd");
}
// Cria um set de dados
CRecordset dados(&db);
// Executa instrução SQL
if (bancodedados == "db2")
{
dados.Open(CRecordset::forwardOnly, L"Select * From DA.\"Blog\"");
}
else
{
dados.Open(CRecordset::forwardOnly, L"Select * From Blog");
}
// Cria item
LVITEM lvItem;
// cria estrutura para inserir o item
typedef struct _LVITEM
{
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
LPTSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
} LVITEM, FAR *LPLVITEM;
// Define variaveis de itens
int InsertItem(const LVITEM* pItem);
int nItem;
// Converte CString para LPTSTR atraves de um TCHAR
TCHAR sz[1024];
// Verifica colunas
short nFields = dados.GetODBCFieldCount();
int colunas = m_tabela.GetHeaderCtrl()->GetItemCount();
// Verifica colunas
if (colunas == 0)
{
// Lê metadata da tabela
CODBCFieldInfo field;
for (UINT i = 0; i < nFields; i ++)
{
dados.GetODBCFieldInfo(i, field);
m_tabela.InsertColumn(i, field.m_strName, LVCFMT_LEFT, 100);
}
}
// Deleta itens do controle de lista
m_tabela.DeleteAllItems();
// Recupera dados da tabela
while (!dados.IsEOF())
{
for (short index = 0; index < nFields; index++)
{
dados.GetFieldValue(index, m_campo);
// Retorna linha do banco de dados
if (index == 0)
{
// Insere linha
lvItem.mask = LVIF_TEXT;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = lstrcpy(sz, m_campo);
nItem = m_tabela.InsertItem(&lvItem);
}
// Retorna colunas da linha
m_tabela.SetItemText(nItem, index, lstrcpy(sz, m_campo));
}
// Move o cursor para a proxima linha
dados.MoveNext();
}
// Fecha o set de dados e a conexão
dados.Close();
db.Close();
}
void CAcessocppDlg::conectarDB(CString dns, CString usuario, CString senha)
{
// Cria string de conexão ODBC
CString conexao;
// Cria string de conexão
conexao = L"DSN=" + dns + L";UID=" + usuario + L";PWD=" + senha;
// Abre conexão
db.OpenEx(conexao, 0);
}





