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(); }