
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
3.2 数据库应用程序创建
3.2. 1 创建单表单文档的数据库应用程序
根据前面建立的数据源DB-FSB,使用VC++ Appwizard 生成一个单表单、单文档的数据库应用程序。选择数据源DB-FSB的数据表时应选择FSB.DBF。应用程序名为ZF0001(具体步骤可参考有关VC++资料)。ZF0001应用程序中创建了CZf0001Doc、CZf0001Set、CZf0001View等派生类。
3.2.2 设置m _strFilter参数
在上一步生成的CZf0001Set类中,按以下方式,在① ② ③程序中设置m _strFilter参数(黑体部分的语句都是为CZf0001Set的参数mbzm而手动增加的)。为节省篇幅,省略程序清单的部分内容。
①. 在Crecordset派生类的定义中,描述了被连接的数据源表的字段,并在VC++ Appwizard 生成的程序注释“// Field/Param Data ”中提示在此可定义参数。
CRecordset派生类:CZf0001Set的定义
class CZf0001Set : public Crecordset //Crecordset派生类CZf0001Set
{
public:
CZf0001Set(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CZf0001Set)
// Field/Param Data
//{{AFX_FIELD(CZf0001Set, CRecordset) //被绑定的字段
CString m_bzm;
CString m_dgqd1;
、、、、、、 //为节省篇幅,省略部分字段
CString m_bz;
//}}AFX_FIELD
CString mbzm; // 参数mbzm
// Overrides
// ClassWizard generated virtual function overrides
、、、、、、、
virtual void Dump(CDumpContext& dc) const;
#endif
};
②.Crecordset派生类:CZf0001Set的构造函数
其中,对被绑定字段的相应内存变量进行了初始化。
CZf0001Set::CZf0001Set(CDatabase* pdb) : CRecordset(pdb)
{
//{{AFX_FIELD_INIT(CZf0001Set)
m_bzm = _T("");
m_dgqd1 = _T("");
、、、、、、
m_bz = _T("");
m_nFields = 16; //数据源表的记录字段个数
//}}AFX_FIELD_INIT
m_nDefaultType = snapshot;
m_nParams=1; // CZf0001Set的参数个数
mbzm=""; //参数初始化
}
③.记录字段交换(RFX)
通过使用RFX,MFC框架可以在数据库和CRecordset类变量之间交换。交换是通过执行DoFieldExchange()函数而建立的。
void CZf0001Set::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CZf0001Set)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, _T("[bzm]"), m_bzm);
RFX_Text(pFX, _T("[dgqd1]"), m_dgqd1);
、、、、、、;
RFX_Text(pFX, _T("[dgdl2]"), m_dgdl2);
RFX_Text(pFX, _T("[bz]"), m_bz);
//}}AFX_FIELD_MAP
pFX->SetFieldType(CFieldExchange::param);
//把字段类型设为CFieldExchange::param
RFX_Text(pFX,"mbzm",mbzm); //为参数设置RFX 宏,如果有多个参数,必须按SQL的语句中的位置标志符的顺序设置,RFX 宏中的参数的名字如"mbzm",并非用来与参数匹配,可以自己定义。
}
3.2.3 增加第二个表,并设置第二个表的参数
在3。2。1创建的数据库应用程序基础上,进入ClassWizard,点击Add Class...按钮并在弹出的菜单中选择New...,然后在Create New Class对话框中的Name栏中输入CZf1001,在Base class栏中选择CRecordset,按Create按钮。
在弹出的Database Options对话框中,在ODBC组合框里选择DB-FSB数据源。然后按OK按钮。在弹出的Select Database Tables对话框中选择DBK1表。按OK确认。并在所有存在 #include "CZf0001Set.h" 的文件中,都加入#include "CZf1001.h" 。这样就创建了与DBK1表对应的Crecordset派生类。
在第一步创建的CZf0001Doc类中,增加一个CZf1001 对象的指针变量m_zf1002(即:CZf1001* m_zf1002)。
按3.2.2介绍的CZf0001Set类m _strFilter参数的设置方法,在CZf1001类中,设置参数mhh。
3. 3 参数mhh及参数mbzm在CrecordView的派生类CZf0001View中的使用
3.3.1 参数在CZf0001View::OnInitialUpdate()函数使用
在CZf0001View::OnInitialUpdate()函数的开头部分,调用CZf0001View:: GetDocument()从文档类CZf0001Doc类中,返回二个CrecordSet类(CZf0001Set、CZf1001)的指针。根据返回的指针,设置m _strFilter (相当于SQL语句的WHERE子句),并确定二个参数的初始值。这里要说明一点:
m_pSet->m_strFilter="BZM like ?";
m_pSet2->m_strFilter="hh like ?";
语句中的“?”,在调用Open或Requery时,“?"将分别自动地被CZf0001Set::mbzm和 CZf1001::mhh的值取代。例如,指定mbzm为“31001",则m_pSet->m_strFilter将变成"BZM =31001"。这样用户只要指定了mbzm,就可以得到所需要的记录集。CZf0001View::OnInitialUpdate()的程序清单如下(黑体部分的语句是手工增加的):
void CZf0001View::OnInitialUpdate()
{ m_pSet = &GetDocument()->m_zf0001Set;
m_pSet2=&GetDocument()->m_zf1002;
if(!m_pSet2->Open())
return;
m_pSet->m_strFilter="BZM like ?";
m_pSet->mbzm= "%"; //初始选择所有记录
m_pSet->m_strSort="";
m_pSet2->m_strFilter="hh like ?";
m_pSet2->mhh=m_pSet->m_bzm; //将表FSB对应的CRecordset派生类的m_bzm的值,作为参数mhh的值
m_pSet2->m_strSort=""; //检索的结果不进行排序
m_pSet->m_pDatabase= m_pSet2->m_pDatabase; //共享CDatabase
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
3.3.2 在对话框中加入编辑框
在资源视图Dialog的IDD_ZF0001_FORM表单中,加入用户需要的编辑框。用ClassWizard在第一个表FSB中选择有关字段与它们相连。但是.使用ClassWizard无法找到第二个表DBK1字段变量,因此,对于计划与第二个表DBK1字段相连的编辑框,必须用手工修改CRecordView类的DoDataExchange()(对话框数据交换函数)。 在DoDataExchange()函数 “//}}AFX_DATA_MAP” 后面加入有关内容。见下面程序的黑体部分。如果黑体部分语句加在“//}}AFX_DATA_MAP”的前面,那么,要再次修改IDD_ZF0001_FORM表单时,就无法使用ClassWizard.
void CZf0001View::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CZf0001View)
DDX_Control(pDX, IDC_COMBO1, m_comb);
DDX_Control(pDX, IDC_EDIT4, m_SS);
DDX_FieldText(pDX, IDC_EDIT2, m_pSet->m_bl1, m_pSet);
DDX_FieldText(pDX, IDC_EDIT3, m_pSet->m_dgdl1, m_pSet);
DDX_FieldCBString(pDX, IDC_COMBO1, m_pSet->m_bzm, m_pSet);
DDX_FieldText(pDX, IDC_EDIT5, m_pSet->m_dgqd1, m_pSet);
//}}AFX_DATA_MAP
DDX_FieldText(pDX, IDC_EDIT1, m_pSet2->m_bl, m_pSet2);
DDX_FieldText(pDX, IDC_EDIT6, m_pSet2->m_hh, m_pSet2);
DDX_FieldText(pDX, IDC_EDIT7, m_pSet2->m_zzcm, m_pSet2);
}