当前位置: 开源爱好者 » 编程教程 » VC++教程 » 正文

VC++ ADO 控制Access 数据库的基本功能

  • 时间:2016-10-15
  • 简述:ADO

VC++ 使用ADO 控制Access 数据库,用_ConnectionPtr 对象打开数据库连接,_RecordsetPtr 对象获得记录集,通过RecordsetPtr 的GetCollect 函数获得信息,Update 函数更改数据库信息。程序代码的编写:
(1)创建名为students 的Access 数据库,包含一个表Table1,其中有字段id、name、entertm、leavetm、comment 等字段(本例只用前两个字段)。然后通过控制面板注册数据源为students。
(2)通过AppWizard 生成基于对话框的应用程序AdoCtrlAccess。
(3)给对话框增加两个编辑框,用来显示学号和姓名,设置学好编辑框为只读,再通过ClassWizard生成对应的CString 类型的变量m_strID 和m_strString。
(4)在stdafx.h 文件中用#import 引入ADO 库文件,其代码如下:

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
rename("BOF","FirstOfFile")
#include "ICRSINT.H"

(5)给对话框类声明数据库连接和记录集的成员变量:

_ConnectionPtr m_pCon; //连接对象
_RecordsetPtr m_pRs; //记录集对象

(6)在对话框的OnInitDialog 函数中打开数据库,获得记录集,并显示第一条记录,其代码如下:

BOOL CAdoCtrlAccessDlg::OnInitDialog()
{
CDialog::OnInitDialog();
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); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//初始化环境
::CoInitialize(NULL);
//创建并打开数据库连接对象
_variant_t vFieldValue;
CString strFieldValue;
m_pCon.CreateInstance(__uuidof(Connection));
m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=students.mdb","","",NULL);
//创建并打开记录集对象
m_pRs.CreateInstance(__uuidof(Recordset));
m_pRs->Open("select* from table1",m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
if(VARIANT_FALSE == m_pRs->EndOfFile)
{
//获得第一条记录并显示
vFieldValue = m_pRs->GetCollect("id");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nID = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("name");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strName = strFieldValue;
vFieldValue.Clear();
}
UpdateData(FALSE);
return TRUE; 
}

(7)给对话框增加3 个按钮,分别用来获得上一条记录、下一条记录和修改记录,其响应代码分别如下:

//前一条记录
void CAdoCtrlAccessDlg::OnPrv()
{
_variant_t vFieldValue;
CString strFieldValue;
//记录集指针前移一条
m_pRs->MovePrevious();
if(VARIANT_FALSE == m_pRs->FirstOfFile)
{
//获得当前的数据并显示
vFieldValue = m_pRs->GetCollect("id");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nID = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("name");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strName = strFieldValue;
vFieldValue.Clear();
UpdateData(FALSE);
}
else
{
//定位到第一条
m_pRs->MoveNext();
AfxMessageBox("已经到第一条了");
}
}
//后一条记录
void CAdoCtrlAccessDlg::OnNext()
{
_variant_t vFieldValue;
CString strFieldValue;
//记录集指针后移一条
m_pRs->MoveNext();
if(VARIANT_FALSE == m_pRs->EndOfFile)
{
//获得当前的数据并显示
vFieldValue = m_pRs->GetCollect("id");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_nID = atoi(strFieldValue.GetBuffer(0));;
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("name");
strFieldValue = (char*)_bstr_t(vFieldValue);
m_strName = strFieldValue;
vFieldValue.Clear();
UpdateData(FALSE);
}
else
{
//定位到最后一条
m_pRs->MovePrevious();
AfxMessageBox("已经到最后一条了");
}
}
//修改记录
void CAdoCtrlAccessDlg::OnModify()
{
UpdateData(TRUE);
if(VARIANT_FALSE == m_pRs->EndOfFile)
{
//修改数据库记录
_variant_t vFieldName,vFieldValue;
CString strValue;
vFieldName.SetString("id");
strValue.Format("%d",m_nID);
vFieldValue.SetString(strValue);
m_pRs->Update(vFieldName,vFieldValue);
vFieldName.Clear();
vFieldValue.Clear();
vFieldName.SetString("name");
vFieldValue.SetString(m_strName);
m_pRs->Update(vFieldName,vFieldValue);
vFieldName.Clear();
vFieldValue.Clear();
}
}

(8)响应对话框的WM_DESTROY 消息,关闭数据库等,其代码如下:

void CAdoCtrlAccessDlg::OnDestroy()
{
//关闭记录和连接
m_pRs->Close();
m_pCon->Close();
//释放环境
::CoUninitialize();
CDialog::OnDestroy();
}
相关内容:

CopyRight 2018© 开源爱好者 All Rights Reserved 豫ICP备16030607号 隐私声明 网站地图