在对话框里如何访问数据库的记录集呢?谢谢各位帮忙! 在对话框里不使用ADO控件,如何和记录集联系呢?对话框里有个 foreign class有什么用呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要看你想访问什么了,我现在做的一个东西时动态访问各类数据库或数据文件目前基本上采用ODBC+DAO看你要访问的数据源有关系 // adoDlg.cpp : 实现文件//#include "stdafx.h"#include "ado.h"#include "adoDlg.h"#include ".\adodlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog{public: CAboutDlg();// 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected: DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()// CadoDlg 对话框CadoDlg::CadoDlg(CWnd* pParent /*=NULL*/) : CDialog(CadoDlg::IDD, pParent) , m_nID(0) , m_strName(_T("")) , m_nAGE(0) , m_strAddress(_T("")){ m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CadoDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_nID); DDX_Text(pDX, IDC_EDIT2, m_strName); DDX_Text(pDX, IDC_EDIT3, m_nAGE); DDX_Text(pDX, IDC_EDIT4, m_strAddress);} BEGIN_MESSAGE_MAP(CadoDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3) ON_WM_DESTROY()END_MESSAGE_MAP()// CadoDlg 消息处理程序BOOL CadoDlg::OnInitDialog(){ CDialog::OnInitDialog(); // 将\“关于...\”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 ////////////////////////////////////////////////////以下为连接数据库HRESULT hr;_variant_t vFieldValue;CString strFieldValue; try { hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象 if(SUCCEEDED(hr)) { hr = m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=zgj;UID=sa;PWD=sa","","",adModeUnknown); //hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///连接数据库 ///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; } }} catch(_com_error e)///捕捉异常 { CString errormessage; errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage()); AfxMessageBox(errormessage);///显示错误信息 } m_pRs.CreateInstance(__uuidof(Recordset)); m_pRs->Open("select* from student",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); if(VARIANT_FALSE==m_pRs->EndOfFile) { vFieldValue = m_pRs->GetCollect("学号"); strFieldValue = (char*)_bstr_t(vFieldValue); m_nID = atoi(strFieldValue.GetBuffer(0));; vFieldValue.Clear(); vFieldValue = m_pRs->GetCollect("年龄"); strFieldValue = (char*)_bstr_t(vFieldValue); m_nAGE = atoi(strFieldValue.GetBuffer(0));; vFieldValue.Clear(); vFieldValue = m_pRs->GetCollect("姓名"); strFieldValue = (char*)_bstr_t(vFieldValue); m_strName = strFieldValue; vFieldValue.Clear(); vFieldValue = m_pRs->GetCollect("地址"); strFieldValue = (char*)_bstr_t(vFieldValue); m_strAddress = strFieldValue; vFieldValue.Clear(); } UpdateData(false); return TRUE; // 除非设置了控件的焦点,否则返回 TRUE}void CadoDlg::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); }}// 如果向对话框添加最小化按钮,则需要下面的代码// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,// 这将由框架自动完成。void CadoDlg::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 { CDialog::OnPaint(); }}//当用户拖动最小化窗口时系统调用此函数取得光标显示。HCURSOR CadoDlg::OnQueryDragIcon(){ return static_cast<HCURSOR>(m_hIcon);}void CadoDlg::OnBnClickedButton1(){ _variant_t vFieldValue; CString strFieldValue; //记录集指针前移一条 m_pRs->MovePrevious(); if(VARIANT_FALSE == m_pRs->FirstOfFile) { //获得当前条的数据并显示 vFieldValue = m_pRs->GetCollect("学号"); strFieldValue = (char*)_bstr_t(vFieldValue); m_nID = atoi(strFieldValue.GetBuffer(0));; vFieldValue.Clear(); vFieldValue = m_pRs->GetCollect("年龄"); strFieldValue = (char*)_bstr_t(vFieldValue); m_nAGE = atoi(strFieldValue.GetBuffer(0));; vFieldValue.Clear(); vFieldValue = m_pRs->GetCollect("姓名"); strFieldValue = (char*)_bstr_t(vFieldValue); m_strName = strFieldValue; vFieldValue.Clear(); vFieldValue = m_pRs->GetCollect("地址"); strFieldValue = (char*)_bstr_t(vFieldValue); m_strAddress = strFieldValue; vFieldValue.Clear(); UpdateData(FALSE); } else { //定位到第一条 m_pRs->MoveNext(); AfxMessageBox("已经到第一条了"); }}void CadoDlg::OnBnClickedButton2(){_variant_t vFieldValue; CString strFieldValue; //记录集指针后移一条 m_pRs->MoveNext(); if(VARIANT_FALSE == m_pRs->EndOfFile) { //获得当前条的数据并显示 vFieldValue = m_pRs->GetCollect("学号"); strFieldValue = (char*)_bstr_t(vFieldValue); m_nID = atoi(strFieldValue.GetBuffer(0));; vFieldValue.Clear(); vFieldValue = m_pRs->GetCollect("年龄"); strFieldValue = (char*)_bstr_t(vFieldValue); m_nAGE = atoi(strFieldValue.GetBuffer(0));; vFieldValue.Clear(); vFieldValue = m_pRs->GetCollect("姓名"); strFieldValue = (char*)_bstr_t(vFieldValue); m_strName = strFieldValue; vFieldValue.Clear(); vFieldValue = m_pRs->GetCollect("地址"); strFieldValue = (char*)_bstr_t(vFieldValue); m_strAddress = strFieldValue; vFieldValue.Clear(); UpdateData(FALSE); } else { //定位到最后一条 m_pRs->MovePrevious(); AfxMessageBox("已经到最后一条了"); }}void CadoDlg::OnBnClickedButton3(){UpdateData(TRUE); if(VARIANT_FALSE == m_pRs->EndOfFile) { //修改数据库记录 _variant_t vFieldName,vFieldValue; CString strValue; vFieldName.SetString("学号"); strValue.Format("%d",m_nID); vFieldValue.SetString(strValue); m_pRs->Update(vFieldName,vFieldValue); vFieldName.Clear(); vFieldValue.Clear(); vFieldName.SetString("姓名"); vFieldValue.SetString(m_strName); m_pRs->Update(vFieldName,vFieldValue); vFieldName.Clear(); vFieldValue.Clear(); vFieldName.SetString("年龄"); strValue.Format("%d",m_nAGE); vFieldValue.SetString(strValue); m_pRs->Update(vFieldName,vFieldValue); vFieldName.Clear(); vFieldValue.Clear(); vFieldName.SetString("地址"); vFieldValue.SetString(m_strAddress); m_pRs->Update(vFieldName,vFieldValue); vFieldName.Clear(); vFieldValue.Clear(); } // TODO: 在此添加控件通知处理程序代码}void CadoDlg::OnDestroy(){ CDialog::OnDestroy();//关闭记录和连接 m_pRs->Close(); m_pConnection->Close(); //释放环境 ::CoUninitialize(); CDialog::OnDestroy(); // TODO: 在此处添加消息处理程序代码} thiscall的清栈方式是callee,是不是类成员函数不能支持变长参数? 数组应用,程序运行速度很慢,求解! 如何对xml中的数据进行保密 qq游戏的斗地里的提示主功能的实现 图案画刷的问题 GetInterfacePtr是什么? 求获得CPU利用率和网络利用率的函数 help监视键盘 对90%的人都很简单的问题--vc中怎样在执行一条语句后等待一定秒数什么都不做?? 国内有没有codeguru的镜像? 关于CDC::CreateCompatibleDC(CDC* pDC) 的问题 大家经常使用的wnaspi32.dll的版权是怎么样的?
//#include "stdafx.h"
#include "ado.h"
#include "adoDlg.h"
#include ".\adodlg.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog
{
public:
CAboutDlg();// 对话框数据
enum { IDD = IDD_ABOUTBOX }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现
protected:
DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CadoDlg 对话框CadoDlg::CadoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CadoDlg::IDD, pParent)
, m_nID(0)
, m_strName(_T(""))
, m_nAGE(0)
, m_strAddress(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CadoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_nID);
DDX_Text(pDX, IDC_EDIT2, m_strName);
DDX_Text(pDX, IDC_EDIT3, m_nAGE);
DDX_Text(pDX, IDC_EDIT4, m_strAddress);
}
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
ON_WM_DESTROY()
END_MESSAGE_MAP()
// CadoDlg 消息处理程序BOOL CadoDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // 将\“关于...\”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码
////////////////////////////////////////////////////以下为连接数据库
HRESULT hr;
_variant_t vFieldValue;
CString strFieldValue;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=zgj;UID=sa;PWD=sa","","",adModeUnknown);
//hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///连接数据库
///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; }
}}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
m_pRs.CreateInstance(__uuidof(Recordset));
m_pRs->Open("select* from student",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
if(VARIANT_FALSE==m_pRs->EndOfFile)
{
vFieldValue = m_pRs->GetCollect("学号");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nID = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("年龄");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nAGE = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("姓名");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strName = strFieldValue;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("地址");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strAddress = strFieldValue;
vFieldValue.Clear();
}
UpdateData(false);
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}void CadoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。void CadoDlg::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
{
CDialog::OnPaint();
}
}//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CadoDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}void CadoDlg::OnBnClickedButton1()
{
_variant_t vFieldValue;
CString strFieldValue;
//记录集指针前移一条
m_pRs->MovePrevious();
if(VARIANT_FALSE == m_pRs->FirstOfFile)
{
//获得当前条的数据并显示
vFieldValue = m_pRs->GetCollect("学号");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nID = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("年龄");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nAGE = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("姓名");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strName = strFieldValue;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("地址");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strAddress = strFieldValue;
vFieldValue.Clear();
UpdateData(FALSE);
}
else
{
//定位到第一条
m_pRs->MoveNext();
AfxMessageBox("已经到第一条了");
}
}void CadoDlg::OnBnClickedButton2()
{_variant_t vFieldValue;
CString strFieldValue;
//记录集指针后移一条
m_pRs->MoveNext();
if(VARIANT_FALSE == m_pRs->EndOfFile)
{
//获得当前条的数据并显示
vFieldValue = m_pRs->GetCollect("学号");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nID = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("年龄");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nAGE = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("姓名");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strName = strFieldValue;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("地址");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strAddress = strFieldValue;
vFieldValue.Clear();
UpdateData(FALSE);
}
else
{
//定位到最后一条
m_pRs->MovePrevious();
AfxMessageBox("已经到最后一条了");
}
}void CadoDlg::OnBnClickedButton3()
{UpdateData(TRUE);
if(VARIANT_FALSE == m_pRs->EndOfFile)
{
//修改数据库记录
_variant_t vFieldName,vFieldValue;
CString strValue; vFieldName.SetString("学号");
strValue.Format("%d",m_nID);
vFieldValue.SetString(strValue);
m_pRs->Update(vFieldName,vFieldValue);
vFieldName.Clear();
vFieldValue.Clear(); vFieldName.SetString("姓名");
vFieldValue.SetString(m_strName);
m_pRs->Update(vFieldName,vFieldValue);
vFieldName.Clear();
vFieldValue.Clear();
vFieldName.SetString("年龄");
strValue.Format("%d",m_nAGE);
vFieldValue.SetString(strValue);
m_pRs->Update(vFieldName,vFieldValue);
vFieldName.Clear();
vFieldValue.Clear(); vFieldName.SetString("地址");
vFieldValue.SetString(m_strAddress);
m_pRs->Update(vFieldName,vFieldValue);
vFieldName.Clear();
vFieldValue.Clear();
}
// TODO: 在此添加控件通知处理程序代码
}void CadoDlg::OnDestroy()
{
CDialog::OnDestroy();
//关闭记录和连接
m_pRs->Close();
m_pConnection->Close();
//释放环境
::CoUninitialize(); CDialog::OnDestroy();
// TODO: 在此处添加消息处理程序代码
}