在对话框里不使用ADO控件,如何和记录集联系呢?
对话框里有个 foreign class有什么用呢?

解决方案 »

  1.   

    要看你想访问什么了,我现在做的一个东西时动态访问各类数据库或数据文件目前基本上采用ODBC+DAO看你要访问的数据源有关系
      

  2.   

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

  3.   

    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: 在此处添加消息处理程序代码
    }