工控编程吧
标题:
269上位机VC MFC使用ODBC实现多记录查询
[打印本页]
作者:
qq263946146
时间:
2016-5-1 14:37
标题:
269上位机VC MFC使用ODBC实现多记录查询
(, 下载次数: 2)
上传
点击文件名下载附件
269上位机VC MFC使用ODBC实现多记录查询
功能展示
查阅单一数据表的信息对一个实用的工程是不够的,我们还经常要用到多记录集查询技术,我们当前例程就实现这一功能,单击菜单的查看全部,可以选择性的查询想要的信息,例程将会从两个表中查询两表同一学生的相关信息,并显示出来,效果如图;
要点提示
1.当前例程中使用的数据库文件有用到两个表,在对此两表进行联合查询的时候,由于两表都有关键字StuID,所以使用此关键字使两个表想到连接, 同时因为两表中都有一个StuID字段,且内容相同,所以总是只显示一个
实现功能
1.新建一视窗派生于CListView的单文档的应用程序;
2.再依照例程界面创建一对话框资源,关联类CStudentDlg,再给对话框关联两变量 BOOL m_Add;BOOL m_Tel;
3.在视窗类中包含三头文件#include<afxdb.h>#include<ODBCINST.H>#include "StudentDlg.h"
4.在视窗类中添加四成员变量public:
CDatabase m_DB;
CListCtrl*m_List;//列表视图控件的指针
CRecordset* m_Set;//记录集对象的指针
CStudentDlg m_Studlg;
并在构造函数中初始化,在析构函数中删除
CGkbc8View::CGkbc8View()
{
m_Set=NULL;
m_List=&GetListCtrl();//获取列表视图控件
m_dwDefaultStyle|=LVS_REPORT;//以报表的格式显示
}
CGkbc8View::~CGkbc8View()
{
if(m_Set!=NULL)
delete m_Set;
}
复制代码
5.在视窗中化函数OnInitialUpdate()中注册数据源,并连接记录集显示数据
void CGkbc8View::OnInitialUpdate()
{
CListView::OnInitialUpdate();
if(m_Set==NULL)
{
if(!SQLConfigDataSource(NULL, //父窗口指针;
ODBC_ADD_DSN, //添加的数据源的类型;
"Microsoft Access Driver (*.mdb)",//驱动程序名;
//属性:
"DSN=Students\0" //数据源名
"Description=工控编程吧测试用\0" //数据源的说明
"FileType=Microsoft Access\0" //数据源文件类型
"DBQ=E:\\每日任务\\STUDENTSINFO.MDB\0"//数据库文件全路径名
//在根据现有数据设置列的数据类型时所要扫描的行数。 可以为 1 到 16,
//默认值为 8;如果设置为 0,将扫描 所有行。(如果数字超出界限,会返回一个错误)
"MaxScanRows=0\0")
)
{
AfxMessageBox("创建数据源失败!!");
return;
}
m_Set=new CRecordset(&m_DB);
if(!m_DB.OpenEx(_T("DSN=Students"),0))
{
AfxMessageBox("打开数据源失败!!");
return;
}
m_Set->Open(CRecordset::dynaset,_T("Select * from Basic"));
}
int i=0,j=0;
CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
LV_COLUMN LvColumn;//存储列信息的结构体
LvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
//读取记录集的字段信息
int nDBFields=m_Set->GetODBCFieldCount();
for(i=0;i<nDBFields;i++)
{
m_Set->GetODBCFieldInfo(i,DbFi);
LvColumn.iSubItem=i;
复制代码
LvColumn.fmt=LVCFMT_CENTER;
LvColumn.cx=DbFi.m_strName.GetLength()*10+20;
LvColumn.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
GetListCtrl().InsertColumn(i,&LvColumn);
}
//根据记录集的数据信息添加行
LV_ITEM LvItem;//条目结构体对象
CString string;//字符串临时变量
CDBVariant DbVariant;
i=0;
if(m_Set->IsEOF())//记录集是否为空
{
AfxMessageBox("记录集没有记录");
return;
}
m_Set->MoveFirst();//从第一个记录开始
while(m_Set->IsEOF()==0)//是否到达最后一个记录
{
LvItem.mask=LVIF_TEXT;
LvItem.iItem=i;
LvItem.iSubItem=0;
m_Set->GetFieldValue((short)0,string);
LvItem.pszText=string.GetBuffer(string.GetLength());
m_List->InsertItem(&LvItem);//插入条目
//显示列数据
for(j=1;j<nDBFields;j++)
{
m_Set->GetFieldValue((short)j,string);
m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
}
m_Set->MoveNext();//下移记录
i++;
}
}
复制代码
6.添加菜单项<查看全部>关联函数,实现执行SQL语句功能
void CGkbc8View::OnCheck()
{
CString sExplore;
if(m_Studlg.DoModal()==IDOK)
{
复制代码
if(m_Studlg.m_Add==TRUE)
{
if(m_Studlg.m_Tel==TRUE)
{
sExplore="SELECT Basic.StuID,Basic.StuName,"
"Course.StuCourse,Course.StuScore,Basic.StuAdd,Basic.StuTel"
" FROM Basic INNER JOIN Course ON Basic.StuID=Course.StuID;";
}
if(m_Studlg.m_Tel==FALSE)
{
sExplore= "SELECT Basic.StuID,Basic.StuName,"
"Course.StuCourse,Course.StuScore,Basic.StuAdd"
" FROM Basic INNER JOIN Course ON Basic.StuID=Course.StuID;";
}
}
if(m_Studlg.m_Add==FALSE)
{
if(m_Studlg.m_Tel==TRUE)
{
sExplore= "SELECT Basic.StuID,Basic.StuName,"
"Course.StuCourse,Course.StuScore,Basic.StuTel"
" FROM Basic INNER JOIN Course ON Basic.StuID=Course.StuID;";
}
if(m_Studlg.m_Tel==FALSE)
{
sExplore="SELECT Basic.StuID,Basic.StuName,"
"Course.StuCourse,Course.StuScore"
" FROM Basic INNER JOIN Course ON Basic.StuID=Course.StuID;";
}
}
}
m_List->SetRedraw(TRUE);
m_List->DeleteAllItems();
CHeaderCtrl* pHeaderCtrl=(CHeaderCtrl*)m_List->GetDlgItem(0);
int nClCount=pHeaderCtrl->GetItemCount();
for(int i=nClCount-1;i>=0;i--)
{
int j=m_List->DeleteColumn(i);
}
if(m_Set->IsOpen())
{
m_Set->Close();
}
复制代码
复制代码
if(!m_Set->IsOpen())
{
m_Set->Open(CRecordset::dynaset,sExplore);
}
//显示记录集
int j=0;
CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
LV_COLUMN m_Lc;//存储列信息的结构体
m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
//读取记录集的字段信息
int nDBFields=m_Set->GetODBCFieldCount();
for(i=0;i<nDBFields;i++)
{
m_Set->GetODBCFieldInfo(i,DbFi);
m_Lc.iSubItem=i;
m_Lc.fmt=LVCFMT_CENTER;
m_Lc.cx=DbFi.m_strName.GetLength()*10+20;
m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
GetListCtrl().InsertColumn(i,&m_Lc);
}
//根据记录集的数据信息添加行
LV_ITEM m_item;//条目结构体对象
CString string;//字符串临时变量
CDBVariant DbVariant;
i=0;
if(m_Set->IsEOF())//记录集是否为空
{
AfxMessageBox("记录集没有记录");
return;
}
m_Set->MoveFirst();//从第一个记录开始
while(m_Set->IsEOF()==0)//是否到达最后一个记录
{
m_item.mask=LVIF_TEXT;
m_item.iItem=i;
m_item.iSubItem=0;
m_Set->GetFieldValue((short)0,string);
m_item.pszText=string.GetBuffer(string.GetLength());
m_List->InsertItem(&m_item);//插入条目
//显示列数据
复制代码
for(j=1;j<nDBFields;j++)
{
m_Set->GetFieldValue((short)j,string);
m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
}
m_Set->MoveNext();//下移记录
i++;
}
}
复制代码
我们来演示功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/be8483ad39d7fdbcfe65462fe4a253d6/0/0/w_19rsuajtop.swf-albumId=6383761509-tvId=6383761509-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4