Na linguagem de programação C++ você pode usar o objeto CRecordSet através de um driver ODBC para retornar campos de um set de dados no qual poderá ser manipulado de modo que você possa escolher qualquer um dos campos da tabela contida em seu Dataset.
Visual Studio
Para utilizar uma linha de dados por coluna em C++ nos bancos de dados Oracle, DB2 e MSSQL, siga os seguintes passos:
1 – Crie a tabela de exemplo e insira as linhas de dados com o script para o seu banco de dados que você encontra logo abaixo. No Visual Studio crie um design como na figura abaixo, utilizando 7 Static Text, 6 Edit Control, 1 GroupBox e um Button. Mude o ID do primeiro Static Text para IDC_Rotulo e associe as respectivas variáveis aos campos da tela. Use o código abaixo para completar seu código gerado automaticamente.
Exemplo:
Este programa foi escrito para retornar uma linha de dados em uma tabela e exibir os campos em caixas de textos.
SQL
Oracle
create table Funcionarios
(
ID_Funcionario NUMBER(5),
Nome VARCHAR2(30),
Sobrenome VARCHAR2(70),
Cargo VARCHAR2(30),
Salario NUMBER(9,2)
);
Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);
DB2
create table Funcionarios
(
ID_Funcionario INTEGER,
Nome VARCHAR(30),
Sobrenome VARCHAR(70),
Cargo VARCHAR(30),
Salario NUMERIC(9,2)
);
Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);
Mssql
create table Funcionarios
(
ID_Funcionario Int,
Nome VARCHAR(30),
Sobrenome VARCHAR(70),
Cargo VARCHAR(30),
Salario Decimal(9,2)
);
Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);
C++
Arquivo .h
// CamposcppDlg.h : header file
//
#pragma once
// Inclui classe de banco de dados MFC
#include "afxdb.h"
#include "afxwin.h"
// CCamposcppDlg dialog
class CCamposcppDlg : public CDialogEx
{
public:
CCamposcppDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
enum { IDD = IDD_CAMPOSCPP_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
// Cria métodos e objetos da classe
CDatabase db;
void conectarDB(CString banco);
afx_msg void OnBnClickedButton1();
CEdit m_pesquisa;
CEdit m_codigo;
CEdit m_pnome;
CEdit m_snome;
CEdit m_cargo;
CEdit m_salario;
};
Arquivo .cpp
// CamposcppDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Camposcpp.h"
#include "CamposcppDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CCamposcppDlg dialog
CCamposcppDlg::CCamposcppDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CCamposcppDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCamposcppDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT6, m_pesquisa);
DDX_Control(pDX, IDC_EDIT1, m_codigo);
DDX_Control(pDX, IDC_EDIT2, m_pnome);
DDX_Control(pDX, IDC_EDIT3, m_snome);
DDX_Control(pDX, IDC_EDIT4, m_cargo);
DDX_Control(pDX, IDC_EDIT5, m_salario);
}
BEGIN_MESSAGE_MAP(CCamposcppDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CCamposcppDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CCamposcppDlg message handlers
BOOL CCamposcppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CCamposcppDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CCamposcppDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CCamposcppDlg::conectarDB(CString banco)
{
// Cria string de conexão
CString dns, usuario, senha;
// Define banco de dados
if (banco == "oracle")
{
dns = L"OracleXE";
usuario = L"daberto";
senha = L"p@55w0rd";
}
if (banco == "db2")
{
dns = L"IBMDB2";
usuario = L"db2admin";
senha = L"p@55w0rd";
}
if (banco == "mssql")
{
dns = L"MSSQLSERVER";
usuario = L"devaberto";
senha = L"p@55w0rd";
}
// 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);
}
void CCamposcppDlg::OnBnClickedButton1()
{
// Define variaveis
CString codigo;
CString m_campo;
CString m_db;
// Referincia objeto statico
CWnd * p_rotulo;
// Esta variavel define o banco de dados
// oracle = Oracle Database
// db2 = IBM DB2
// mssql = MSSQL Server
m_db = L"oracle";
// Associa objeto statico
p_rotulo = GetDlgItem(IDC_Rotulo);
p_rotulo->SetWindowTextW(L"Database - Fields - " + m_db);
// Conecta ao banco de dados
conectarDB(m_db);
// Cria um set de dados
CRecordset dados(&db);
// Cria pesquisa
m_pesquisa.GetWindowTextW(codigo);
dados.Open(CRecordset::forwardOnly,
L"Select * From FUNCIONARIOS Where ID_FUNCIONARIO = " + codigo);
// Retorna dados por nome de campo e os exibe
// Oracle e o DB2 transformam os nomes de campos para maiusculo,
// basta efetuar um select na tabela de cada banco e você verá
// O MSSQL não faz esta mudança sendo assim você precisa mudar os campos
// do banco de dados MSSQL para que fique compativel com o ORACLE e DB2 ou
// encontrará um erro ao tentar utilizar a tabela que criamos anteriormente.
dados.GetFieldValue(L"ID_FUNCIONARIO", m_campo);
m_codigo.SetWindowTextW(m_campo);
dados.GetFieldValue(L"NOME", m_campo);
m_pnome.SetWindowTextW(m_campo);
dados.GetFieldValue(L"SOBRENOME", m_campo);
m_snome.SetWindowTextW(m_campo);
dados.GetFieldValue(L"CARGO", m_campo);
m_cargo.SetWindowTextW(m_campo);
dados.GetFieldValue(L"SALARIO", m_campo);
m_salario.SetWindowTextW(m_campo);
// Fecha o set de dados e a conexão
dados.Close();
db.Close();
}



