285上位机VC MFC使用OLE DB连接多个数据表
OLE DB连接多个数据表
功能展示
在OLE DB中使用连接方便直观且要比在ODBC中灵活在我们例程根目录中的数据库文件STUDENTSINFO.MDB有两个表Basic,Course我们例程演示在两个表中搜索相同名字的数据,并显示出来,效果如图,点击菜单栏的查询可以在两表中同时进行查询;
要点提示
在我们例程中使用SQL语句是意思 是,筛选两个表Basic,Course中的记录并连接在一起,连接的原则是两表的StuId相等;
我们对向导生成的代码的修改可能会有些不清楚,我们简单介绍下几个重要的类:
CDataSource类:包含了为一个新数据源打开会话所需要的信息,在能够使用数据源打开一个会话(CSession)前者得建立一个CDataSource类的实例
Csession:封装了一对数据源的活动连接,对数据源的所有交互都是通过此类进行;
Caccessor:静态地将程序中数据元素同Crowset类返回的数据相互连接;
Crowset:用来 攻取行数据,比如浏览记录集的函数MOVEFIRST,MOVENEXT,就是此类的成员 函数;
Ccommand:为命令类中的一个类,用于设置和执行一个基于参数的OLE DB的命令
实现功能
1.事先创建一数据源Students,再新建基于单文档的应用程序,数据表选择Basic,具体的创建过程可参考随后的视频演示;
2. 参照例程界面,添加四个编辑框ID分别为IDC_STUID,IDC_STUNAME,IDC_STUADD,IDC_STUTEL, IDC_STUSCORE, IDC_STUCOURSE
3.修改向导为我们创建的类Cbasic的成员变量
int m_StuID;
// wchar_t m_StuName[26];
// wchar_t m_StuAdd[26];
// wchar_t m_StuTel[26];
char m_StuAdd[51];
char m_StuName[51];
char m_StuTel[51];
char m_StuCourse[51];
char m_StuScore[51];
及BEGIN_COLUMN_MAP(CBasic)内的三行内容
// COLUMN_ENTRY_TYPE(2, DBTYPE_WSTR, m_StuName)
// COLUMN_ENTRY_TYPE(3, DBTYPE_WSTR, m_StuAdd)
// COLUMN_ENTRY_TYPE(4, DBTYPE_WSTR, m_StuTel)
COLUMN_ENTRY_TYPE(2, DBTYPE_STR, m_StuName)
COLUMN_ENTRY_TYPE(3, DBTYPE_STR, m_StuAdd)
COLUMN_ENTRY_TYPE(4, DBTYPE_STR, m_StuTel)
COLUMN_ENTRY_TYPE(5, DBTYPE_STR, m_StuCourse)
COLUMN_ENTRY_TYPE(6, DBTYPE_STR, m_StuScore)
4.在另一记录集类CGkbc8Set中添加变量CString m_strFilter;并修改其函数Open()
HRESULT Open()
{
CDataSource db;
CSession session;
HRESULT hr;
CDBPropSet dbinit(DBPROPSET_DBINIT);
dbinit.AddProperty(DBPROP_AUTH_CACHE_AUTHINFO, true);
dbinit.AddProperty(DBPROP_AUTH_ENCRYPT_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_MASK_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_PASSWORD, "");
dbinit.AddProperty(DBPROP_AUTH_USERID, "Admin");
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, "E:\\Database Files\\StudentsInfo.mdb");//数据库目录
dbinit.AddProperty(DBPROP_INIT_MODE, (long)16);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
dbinit.AddProperty(DBPROP_INIT_PROVIDERSTRING, "");
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033);
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
hr = db.OpenWithServiceComponents("Microsoft.Jet.OLEDB.4.0", &dbinit);
if (FAILED(hr))
return hr;
hr = session.Open(db);
if (FAILED(hr))
return hr;
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
propset.AddProperty(DBPROP_IRowsetScroll, true);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE );
hr = CCommand<CAccessor<CBasic> >::Open(session, "SELECT Basic.StuID,\
Basic.StuName,Basic.StuAdd,Basic.StuTel,Course.StuCourse,\
Course.StuScore FROM Basic INNER JOIN Course ON Basic.StuID=\
Course.StuID"+m_strFilter, &propset);
if (FAILED(hr))
return hr;
return MoveNext();
}
5.在视窗类的DoDataExchange()函数中添加
DDX_Text(pDX,IDC_STUID,m_pSet->m_StuID);//绑定编辑控件与记录
DDX_Text(pDX,IDC_STUNAME,m_pSet->m_StuName,51);//绑定编辑控件与记录
DDX_Text(pDX,IDC_STUADD,m_pSet->m_StuAdd,51);//绑定编辑控件与记录
DDX_Text(pDX,IDC_STUTEL,m_pSet->m_StuTel,51);//绑定编辑控件与记录
DDX_Text(pDX, IDC_STUCOURSE, m_pSet->m_StuCourse, 51);
DDX_Text(pDX, IDC_STUSCORE, m_pSet->m_StuScore, 51);
6.按例程界面新对话框,关联对话类class CFindNameDlg : public Cdialog,再关联编辑框变量Cstring m_sName;
7.在菜单上添加按钮<按名字查询>关联函数
#include "FindNameDlg.h"
void CGkbc8View::OnFineName()
{
CFindNameDlg Dlg;//打开查询对话框
if (Dlg.DoModal() == IDOK)//单击了OK按钮
{
CString newFilter;
if (!Dlg.m_sName.IsEmpty())
newFilter = " WHERE Basic.StuName = '" + Dlg.m_sName +"'";
else
newFilter = "";
if (m_pSet->m_strFilter.CompareNoCase(newFilter)) //比较原来的和新的查询字符是否相同
{
m_pSet->m_strFilter = newFilter;
m_pSet->Close();//关闭记录集然后打开
m_pSet->Open();
UpdateData(FALSE);
}
}
}
我们来演示整个功能实现过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|