VC60下ODBC参数化Word下载.docx

上传人:b****6 文档编号:21606638 上传时间:2023-01-31 格式:DOCX 页数:11 大小:17.76KB
下载 相关 举报
VC60下ODBC参数化Word下载.docx_第1页
第1页 / 共11页
VC60下ODBC参数化Word下载.docx_第2页
第2页 / 共11页
VC60下ODBC参数化Word下载.docx_第3页
第3页 / 共11页
VC60下ODBC参数化Word下载.docx_第4页
第4页 / 共11页
VC60下ODBC参数化Word下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

VC60下ODBC参数化Word下载.docx

《VC60下ODBC参数化Word下载.docx》由会员分享,可在线阅读,更多相关《VC60下ODBC参数化Word下载.docx(11页珍藏版)》请在冰豆网上搜索。

VC60下ODBC参数化Word下载.docx

但是,通过分析程序的执行过程及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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1