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

VC++ 在SQL Select 语句中使用多个字符串检索条件

在检索数据库时经常会涉及到多个字符串的检索条件,本例介绍SQL 语句中如何设置多个字符串检索条件。通过控制面板注册Access 数据源students,编译并运行本例程序,如图所示。先输入要检索的学生姓名和备注,如果选择【与条件】表示两个条件都必须满足,如果选择【完全匹配】表示不模糊查询,然后单击【检索】按钮,检索符合条件的同学并在列表框中显示出来。实现方法如下:
检索使用的是SELECT 语句。与条件用“and”,例如检索姓名中包含为“王”并且备注中包含“班长”的同学:

select * from table1 where name like ‘%王%’ and comment like ‘%班长%’。或条件用“or”,例如检索姓名中包含为“王”或者备注中包含“班长”的同学:select * from table1 where name like ‘%王%’ or comment like ‘%班长%’。程序代码:
(1)使用上例的数据源。
(2)通过AppWizard 生成基于对话框的应用程序SearchByMultiStr。
(3)给对话框增加两个CEdit 控件,用来输入设置检索条件的字符串,并通过ClassWizard 生成分别对应的CString 类型变量m_strName 和m_strComment。
(4)给对话框增加两个复选框控件,用来设置是否是与条件和是否是完全匹配查询,并通过ClassWizard 生成分别对应的BOOL 类型变量m_bAnd 和m_bComplete。
(5)在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"

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

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

(7)在对话框的OnInitDialog 函数中打开数据库,获得记录集,其代码如下:

BOOL CSearchByMultiStrDlg::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; 
}

(8)给对话框增加CListBox 控件,用来显示检索的结果,通过ClassWizard 生成对应的CListBox类型的变量m_StudentsLst。
(9)给对话框增加检索按钮,其响应函数定义如下:

void CSearchByMultiStrDlg::OnSearch()
{
//情况列表框的数据
while(m_StudentsLst.GetCount()>0)
{
m_StudentsLst.DeleteString(0);
}
UpdateData(TRUE);
//关闭上一次查询的记录集
m_pRs->Close();
//构造SQL 检索语句
CString strSql;
if(m_bComplete)
{//完全匹配
if(m_bAnd)
{//与条件
strSql.Format("select * from table1 where name = ’%s’ and comment = ’%s’",m_strName,m_strComment);
}
else
{
strSql.Format("select * from table1 where name = ’%s’ or comment = ’%s’",m_strName,m_strComment);
}
}
else
{//模糊查询
if(m_bAnd)
{//与条件
strSql = "select * from table1 where name like ’%" + m_strName + "%’"
+ "and comment like ’%" + m_strComment + "%’";
}
else
{
strSql = "select * from table1 where name like ’%" + m_strName + "%’"
+ "or comment like ’%" + m_strComment + "%’";
}
}
//检索
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,strComment;
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("comment");
strComment = (char*)_bstr_t(vFieldValue);
vFieldValue.Clear();
strItem.Format("学号为%s 的%s 同学是%s",strID,strName,strComment);
m_StudentsLst.AddString(strItem);
m_pRs->MoveNext();
}
}

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

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

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