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

VC++使用SQL Selete设置时段检索条件的查询示例

VC++在检索数据库时经常会涉及到设置时间段条件,本例介绍SQL 语句中如何设置时段检索条件。通过控制面板注册Access 数据源students,编译并运行本例程序,如图所示。先设置入学时间段,然后单击【检索】按钮,检索在该时间段入学的同学,在列表框中显示出来。

实现方法:检索使用的是SELECT 语句,如本例:
strSql.Format("select * from table1 where entertm >= CDate(’%s’) and entertm <= CDate(’%s’)",strBegin,strEnd)
其中table1 为表名,entertm 为表中入学时间的字段名,strBegin 和strEnd 则为检索时间的上下限。
程序代码如下:
(1)使用上例的数据源。
(2)通过AppWizard 生成基于对话框的应用程序SearchByTm。
(3)给对话框增加两个CDateTimeCtrl 控件,用来选择检索的起始时间和终止时间,并通过ClassWizard 生成对应的CTime 类型的变量m_tmStart 和m_tmEnd。
(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 CSearchByTmDlg::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);
return TRUE; 
}

(7)给对话框增加CListBox 控件,用来显示检索的结果,通过ClassWizard 生成对应的CListBox类型的变量m_StudentsLst。

(8)给对话框增加检索按钮,其响应函数定义如下:

void CSearchByTmDlg::OnSearch()
{
//情况列表框的数据
while(m_StudentsLst.GetCount()>0)
{
m_StudentsLst.DeleteString(0);
}
UpdateData(TRUE);
//关闭上一次查询的记录集
m_pRs->Close();
//格式化时间
CString strBegin,strEnd;
strBegin = m_tmStart.Format("%Y-%m-%d %H:%M:%S");
strEnd = m_tmEnd.Format("%Y-%m-%d %H:%M:%S");
//构造SQL 检索语句
CString strSql;
strSql.Format("select * from table1 where entertm >= CDate(’%s’) and entertm <= CDate(’%s’)",strBegin,strEnd);
//检索
BSTR bsSql = strSql.AllocSysString();
m_pRs->Open((CComVariant)bsSql,m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
//将查询结果在列表框中显示出来
while(VARIANT_FALSE == m_pRs->EndOfFile)
{
_variant_t vFieldValue;
CString strID,strName,strEnterTm;
CString strItem;
vFieldValue = m_pRs->GetCollect("id");
strID = (char*)_bstr_t(vFieldValue);
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("name");
strName = (char*)_bstr_t(vFieldValue);
vFieldValue.Clear();
vFieldValue = m_pRs->GetCollect("entertm");
strEnterTm = (char*)_bstr_t(vFieldValue);
vFieldValue.Clear();
strItem.Format("学号为%s 的%s 同学的入学时间是%s",strID,strName,strEnterTm);
m_StudentsLst.AddString(strItem);
m_pRs->MoveNext();
}
}

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

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

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