295上位机VC MFC使用ADO实现记录集查询功能
ADO实现记录集查询功能
功能展示
ADO数据库程序中,数据的查询功能是必不可少的功能,我们当前例程利用ADO实现数据的查询功能,效果如图,程序进行会初始化打开根目录数据库文件,读取表NEW的ID与姓名填充到组合框。我们只在点击<按组合框中学号查询><按组合框中姓名查询>就可以按指定的ID或姓名查询数据,并将查询的结果显示在编辑框中;
要点提示
查询有直接与间接查询,间接查询要对记录集进行遍历,直到找到符合条件的记录,然后将该记录的数据读取出来 。 直接查询法则是对查询语句进一步添加条件,直接找到符合条件的记录;
可以直接使用语句SELECT * FROM TableName WHERE condition 查询
实现功能
1.新建基于对话框的应用程序
2.在App类的InitInstance()函数中添加代码AfxOleInit();//初始化COM,创建ADO连接等操作
3.在stdafx.h中加入ADO支持库
#import “c:\program files\common files\system\ado\msado15.dll” no_namespace rename (“EOF”, “adoEOF”) 及#include "icrsint.h"//IADORecordBinding 头文件
4.主对话框中添加变量public:
_ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset;并初始化
HRESULT hr;
try
{
hr =m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
if(SUCCEEDED(hr))
{
hr=m_pConnection->Open("rovider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);
//连接数据库
//上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为rovider=Microsoft.Jet.OLEDB.3.51;
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);
}
//<>
CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO1);
pComboBox->ResetContent();
CComboBox* pComboBox2 = (CComboBox*)GetDlgItem(IDC_COMBO2);
pComboBox2->ResetContent();
try
{
_variant_t RecordsAffected;
m_pRecordset =m_pConnection->Execute("SELECT * FROM new",&RecordsAffected,adCmdText);
if(m_pRecordset->BOF)//else
{
AfxMessageBox("表内数据为空");
return FALSE;
}
m_pRecordset->MoveFirst();
CString str;
while(!m_pRecordset->adoEOF)
{
_variant_t vCount = m_pRecordset->GetCollect("ID");
str.Format("%d",vCount.lVal);
pComboBox->AddString(str);//填充ID组合框
vCount = m_pRecordset->GetCollect("Name");
str = (LPCSTR)_bstr_t(vCount);
pComboBox2->AddString(str);//填充姓名组合框
m_pRecordset->MoveNext();
}
m_pRecordset->MoveFirst();
pComboBox->SetCurSel(0);
pComboBox2->SetCurSel(0);
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
5.按照例程界面,添加两组合框IDC_COMBO1,IDC_COMBO2,添加三编辑框IDC_EDIT1,IDC_EDIT2,IDC_EDIT3,添加按钮<按组合框中学号查询><按组合框中姓名查询>关联点击函数
void CGkbc8Dlg::OnSearchid()
{
CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO1);
CString sName;
pComboBox->GetWindowText(sName);
try
{
_variant_t RecordsAffected;
m_pRecordset =m_pConnection->Execute("SELECT * FROM new",&RecordsAffected,adCmdText);
if(m_pRecordset->BOF)//判断记录集是否有记录
{
AfxMessageBox("表内数据为空");
return;
}
m_pRecordset->MoveFirst();
//检索记录
long id=atol(sName);
_variant_t vCount;
while(!m_pRecordset->adoEOF)
{
vCount = m_pRecordset->GetCollect("ID");
if(vCount.lVal==id)//找到匹配ID
{
SetDlgItemInt(IDC_EDIT1,vCount.lVal);
vCount = m_pRecordset->GetCollect("Name");
SetDlgItemText(IDC_EDIT2,(LPCSTR)_bstr_t(vCount));
vCount = m_pRecordset->GetCollect("Age");
SetDlgItemInt(IDC_EDIT3,vCount.lVal);
return;
}
m_pRecordset->MoveNext();
}
m_pRecordset->MoveFirst();
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
AfxMessageBox("未找到匹配数据");
}
void CGkbc8Dlg::OnSearchname()
{
CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO2);
CString str,sName;
pComboBox->GetWindowText(sName);
str.Format("SELECT * FROM new WHERE Name='%s' ",sName);//直接格式化SQL语句
try
{
_variant_t RecordsAffected;
m_pRecordset =m_pConnection->Execute((_bstr_t)str,&RecordsAffected,adCmdText);
if(m_pRecordset->BOF)//else
{
AfxMessageBox("表内数据为空");
return;
}
_variant_t vCount;
vCount = m_pRecordset->GetCollect("ID");
SetDlgItemInt(IDC_EDIT1,vCount.lVal);
vCount = m_pRecordset->GetCollect("Name");
SetDlgItemText(IDC_EDIT2,(LPCSTR)_bstr_t(vCount));
vCount = m_pRecordset->GetCollect("Age");
SetDlgItemInt(IDC_EDIT3,vCount.lVal);
}
catch(_com_error*e)
{
AfxMessageBox(e->ErrorMessage());
}
}
我们来演示功能实现过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|