VC60下ODBC参数化Word下载.docx
- 文档编号:21606638
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:11
- 大小:17.76KB
VC60下ODBC参数化Word下载.docx
《VC60下ODBC参数化Word下载.docx》由会员分享,可在线阅读,更多相关《VC60下ODBC参数化Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
但是,通过分析程序的执行过程及MFC的源代
码可知:
在每次建立一个新的筛选字符串后,CRecordSet类根据所对应的表的结
构生成一个SQL语句,并经ODBC驱动程序提交给服务器执行。
服务器在接到请求
以后首先要对此SQL语句进行语法分析以及优化,将SQL语句所定义的操作分解,
然后提交给服务器数据库引擎执行,并将最终结果返回给客户。
这样当筛选字
符串具有相同的形式而仅仅只有筛选参数取值不同时,每次进行这样相同的操
作将严重浪费服务器的资源。
针对上述情况ODBC接口提供了参数化记录集的功能,即可以生成一个满足通过
一些参数给定查询条件的记录集,直接修改这些参数就可以得到满足不同条件
的记录集。
这样由于参数化记录集中参数直接传递给数据库引擎,避免了每次
对相同的SQL语句进行上述操作,因而大大提高了SQL语句的执行效率,特别是
针对重复的、结构相似的查询,这种提高更显著。
而动态绑定技术则允许应用
程序根据不同的条件绑定不同的数据项,这样可以在程序中利用一个
CRecordSet的实例分别存储多个表中的数据或者操作用户在程序运行中生成的
新表(因为利用ClassWizard生成CRecordSet的派生类时,必须先有确定的表的
结构)。
这对于减少程序占用机器资源以及提高程序的灵活性具有重要意义。
参数化记录集的实现
下面以一个学生学籍表为例,通过生成一个将学生学号作为参数的记录集来说
明VC4.0中参数化记录集的实现。
该表的结构如下:
...操作步骤如下:
1.利用VC4.0中的ClassWizard工具创建对应于StudentTable的CRecordSet类
的派生类CStudentSet。
2.在CStudentSet的头文件中为该类加入一个公有的CString类的数据成员
m_strStudent_Param,注意此数据成员必须加在一对AFX_FIELD注释之外。
//在一对AFX_FIELD注释之中定义的变量即被绑定列对应的变量。
//{{AFX-FIELD(CStudentSet,CRecordSet)
CStringm_Student_Name;
CStringm_Student_NO;
CStringm_Home_Address;
CStringm_Telephone_NO;
CStringm_Home_Zip;
//}}AFX_FIELD
//被绑定参数列对应的变量
CStringm_strStudent_Param;
3.把新的成员变量加到DoFieldExchange方法中,参数正是通过该方法传递到
驱动程序中去的。
在把参数增加到DoFieldExchange方法之前,必须先调用
SetFieldType函数表明后面的字段是参数值。
voidCStudentSet:
:
DoFieldExchange(CFieldExchange*pFX)
{
//{{AFX_FIELD_MAP(CStudentSet)
pFX->SetFieldType(CFieldExchange:
outputColumn);
//说明绑定列
RFX->Text(pFX,_T("
[Student_Name]"
),m_Student_Name);
Student_NO"
),m_Student_NO);
[Home_Address〗"
),m_Home_Address);
[Telephone_NO〗"
),m_Telephone_NO);
[Home_Zip〗"
),m_Home_Zip);
//}}AFX_FIELD_MAP
param);
//说明绑定参数
Studnet-NO"
),m_strStudent_Param);
}
4.建立参数化筛选字符串,在构造函数中将CStudentSet中从CRecordSet继承的
数据成员m_strField初始化成包含未知参数的形式;
同时初始化参数和
m_nParam。
CStudentSet:
CStudentSet(CDatabase*pDb):
CRecordSet(m_pDb)
{//参数初始化
//{{AFX_FIELD_INIT(CWhiteboardSet)
m_Student_Name=_T("
"
);
m_Student_NO=_T("
m_Home_Address=_T("
m_Telephone_NO=_T("
m_Home_Zip=_T("
m_nFields=5;
//绑定列数目
//}}AFX_FIELD_INIT
m_strStudent_Param=_T("
m_nParams=1;
//参数数目
m_strFilter="
Student-NO=?
;
其中"
?
即代表参数所在的位置,在包含多个参数的情况下,ODBC引擎将按
DoFieldExchange方法中参数出现的顺序替换m_strField中的问号。
m_nParam的值必须与参数的实际个数相等,否则将引起一些难以觉察的错误。
这样,每次根据学生学号来查找学生信息时,只须简单地为m_strStudent_Param
赋值,并调用Requery()则可得到给定学号的学生信息。
动态绑定的实现
我们仍以StudentTable为例,假设我们现在根据用户的选择只须要绑定
Student_NO列和其它三列中的某一列或某几列。
首先,我们在CStudentSet中加入一个CStringList成员变量和一个CObList成员
变量,其中CStringList用于存放字段名,CObList用于存放与CStringList字段
名对应的变量的指针。
其次,修改DoFieldExchange方法。
注意在调用Requery()以前必须修改m_nField的值:
m_nField=m_Column_List.GetCount();
这样,通过往m_Column_List和m_Storage_List中成对地填入字段名和对应的
变量名,即可实现动态绑定。
具有动态绑定特性的CStudentSet类的详细结构及实现如下:
//studentSet.hCStudentSet类头文件
classCStudentSet:
publicCRecordset
public:
CStudentSet(CDatabase*pDatabase=NULL);
DECLARE_DYNAMIC(CStudentSet)
//设置绑定参数
//{{AFX_FIELD(CStudentSet,CRecordset)
//添加存储动态绑定对象的链表
CStringListm_Column_List;
CObListm_Storage_List;
//{{AFX_VIRTUAL(CStudentSet)
virtualCStringGetDefultConnect();
//Defaultconnectionstring
virtualCStringGetDefaultSQL();
//defaultSQLforRecordset
virtualvoidDoFieldExchange(CFieldExchange*pFX);
//RFXsupport
//}}AFX_VIRTUAL
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&
dc)const;
#endif
};
//studentSet.cppCStudentSet类CPP文件
#include"
stdafx.h"
student.h"
studentSet.h"
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE〖〗=--FILE--_;
IMPLEMENT_DYNAMIC(CStudentSet,CRecordset)
CStudentSet(CDatabase*pdb):
CRecordset(pdb)
//{{AFX_FIELD_INIT(CStudentSet)
m_nDefaultType=snapshot;
CStringCStudentSet:
GetDefaultConnect()
return_T("
ODBC;
DSN=Student"
GetDefaultSQL()
Student"
//修改后的DoFieldExchange方法函数
DoFieldExchange(CFieldExchange*pFX)
POSITIONpos=m_Column_List.GetHeadPosition();
while(pos!
=NULL)
RFX_Text(pFx,m_Column_List.GetNext(pos),
*m_Storage_List.GetNext(pos));
//CStudentSetdiagnostics
AssertValid()const
CRecordset:
AssertValid();
Dump(CDumpContext&
dc)const
Dump(dc);
#endif//_DEBUG
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC60 ODBC 参数