【VC++开源代码栏目提醒】:网学会员为广大网友收集整理了,VC_MFC访问ODBC数据源详解 - 技术总结,希望对大家有所帮助!
使用MFC访问ODBC数据源 一 概述 VisualC的MFC类库定义了几个数据库类.在利用ODBC编程时经常要使用到CDatabase数据库类CRecordSet记录集类和CRecordView可视记录集类.其中: CDatabase类对象提供了对数据源的连接通过它你可以对数据源进行操作. CRecordView类对象能以控制的形式显示数据库记录.这个视图是直接连到CrecordSet 对象的表视图. CRecordSet类对象提供了从数据源中提取出的记录集.CRecordSet对象通常用于两种形式: 动态行集dynasets和快照集snapshots.动态行集能保持与其他用户所做的更改保持同步.快照集则是数据的一个静态视图.每一种形式在记录集被打开时都提供一组记录所不同的是当你在一个动态行集里滚动到一条记录时由其他用户或是你应用程序中的其他记录集对该记录所做的更改会相应地显示出来. Visual C提供了几种记录集可以用来定制应用程序的工作方式.查看这些不同选项的最快方式要兼顾速度和特征.你会发现在很多情况下如果想添加特征就必须付出程序执行速度降低的代价.下面告诉你一些可以自由支配的记录集选项.更重要的是要告诉你从这个选项可以获得更快的速度还是更多的特征. 1 Snapshot快照 这个选项要Visual C在一次快照中下载整个查询.换言之及时快速地给数据库内容拍照并把它作为未来工作的基础. 这种方法有三个缺点.第一你看不到别人在网络上做的更新这可能意味着你的决定是建立在老信息的基础上.第二一次就下载所有这些记录这意味着在下载期间给网络增加了沉重的负担.第三记录下载时用户会结束等待这意味着网络的呼叫性能变得更低. 然而这种方法也有两个优点.第一记录一旦被下载该工作站所需的网络活动几乎就没有了枣这为其它请求释放了带宽.总之你会看到网络的吞吐量增大了.第二因为所有被申请的记录都在用户的机器上所以用户实际上会得到应用程序更佳的总体性能.你可能想把快照的方法限制在较小的数据库上使用原因在于快照适用于用户请求信息而不适用于数据编辑会话. 2 Dynaset动态集使用这个选项时Visual C创建指向所请求的每个记录的实际指针.另外只有填充屏幕时实际需要的记录是从服务器上下载来的.这种方法的好处很明显.几乎马上就能在屏幕上看到记录.而且还会看到其它用户对数据库所做的更改.最后其它用户也会看到你做的更改因为动态集在你更改记录时被上载到服务器上.很明显这种方法要求对服务器的实时访问它减小了网络总吞吐量并降低了应用程序的性能.这个选项适合于创建用户要花费很多时间来编辑数据的应用程序.同时它也是大型数据库的最佳选择原因在于只需下载用户实际需要的信息. 二 应用ODBC编程 可以应用AppWizard来建立一个ODBC的应用程序框架也可以直接使用ODBC来进行数据库编程这时应包括头文件afxdb.h. 应用ODBC编程两个最重要的类是CDatabase和CRecordSet但在应用程序中不应直接使用CRecordSet类而必须从CRecordSet类产生一个导出类并添加相应于数据库表中字段的成员变量.随后重载CRecordset类的成员函数DoFieldExchange该函数通过使用RFX函数完成数据库字段与记录集域数据成员变量的数据交换RFX函数同对话框数据交换DDX机制相类似负责完成数据库与成员变量间的数据交换. 下面举例说明在VisualC环境中ODBC的编程技巧: 1 数据库连接 在CRecordSet类中定义了一个成员变量m_pDatabase: CDatabase m_pDatabase 它是指向对象数据库类的指针.如果在CRecordSet类对象调用Open函数之前将一个已经打开的CDatabase类对象指针传给m_pDatabase就能共享相同的CDatabase类对象.如: CDatabase m_db CRecordSet m_set1m_set2 m_db.Open_TSuper_ES //建立ODBC连接 m_set1.m_pDatabasem_db //m_set1复用m_db对象 m_set2.m_pDatabsem_db // m_set2复用m_db对象 或如下: Cdatabase db db.OpenDatabase //建立ODBC连接 CrecordSet m_setdb //构造记录集对象使数据库指向db 2 查询记录 查询记录使用CRecordSet::Open和 CRecordSet::Requery成员函数.在使用CRecordSet类对象之前必须使用CRecordSet::Open函数来获得有效的记录集.一旦已经使用过CRecordSet::Open函数再次查询时就可以应用CRecordSet::Requery函数.在调用CRecordSet::Open函数时如果已经将一个已经打开的CDatabase 对象指针传给CRecordSet类对象的m_pDatabase成员变量则使用该数据库对象建立ODBC连接否则如果m_pDatabase为空指针就新建一个CDatabase类对象并使其与缺省的数据源相连然后进行CRecordSet类对象的初始化.缺省数据源由GetDefaultConnect函数获得.你也可以提供你所需要的SQL语句并以它来调用CRecordSet::Open函数例如: m_Set.OpenAFX_DATABASE_USE_DEFAULTstrSQL 如果没有指定参数程序则使用缺省的SQL语句即对在GetDefaultSQL函数中指定的SQL语句进行操作: CString CTestRecordSet::GetDefaultSQL return _TBasicDataMainSize 对于GetDefaultSQL函数返回的表名对应的缺省操作是SELECT语句即: SELECT FROM BasicDataMainSize 查询过程中也可以利用CRecordSet的成员变量m_strFilter和m_strSort来执行条件查询和结果排序.m_strFilter 为过滤字符串存放着SQL语句中WHERE后的条件串m_strSort 为排序字符串存放着SQL语句中ORDERBY后的字符串.如: m_Set.m_strFilterTYPE??电动机?? m_Set.m_strSortVOLTAGE m_Set.Requery 对应的SQL语句为: SELECT FROM BasicDataMainSize WHERE TYPE??电动机?? ORDER BY VOLTAGE 除了直接赋值给m_strFilter以外还可以使用参数化.利用参数化可以更直观更方便地完成条件查询任务.使用参数化的步骤如下: 1 声明参变量 Cstring p1 Float p2 2 在构造函数中初始化参变量 p1_T p20.0f m_nParams2 3 将参变量与对应列绑定 pFX-SetFieldTypeCFieldExchange::param RFX_TextpFX_TP1p1 RFX_SinglepFX_TP2p2 完成以上步骤之后就可以利用参变量进行条件查询了: m_pSet-m_strFilterTYPEANDVOLTAGE m_pSet-p1电动机 m_pSet-p260.0 m_pSet-Requery 参变量的值按绑定的顺序替换查询字串中的“”适配符. 如果查询的结果是多条记录的话可以用CRecordSet类的函数MoveMoveNext MovePrevMoveFirst 和MoveLast来移动光标. 3 增加记录 增加记录使用AddNew函数要求数据库必须是以允许增加的方式打开: m_pSet-AddNew //在表的末尾增加新记录 m_pSet-SetFieldNullm_pSet-m_typeFALSE m_pSet-m_type电动机 ... //输入新的字段值 m_pSet- Update //将新记录存入数据库 m_pSet-Requery //重建记录集 4 删除记录 直接使用Delete函数并且在调用Delete函数之后不需调用Update函数: m_pSet-Delete ifm_pSet-IsEOF m_pSet-MoveNext Else m_pSet-MoveLast 5 修改记录 修改记录使用Edit函数: m_pSet-Edit //修改当前记录 m_pSet-m_type发电机 //修改当前记录字段值 ... m_pSet-Update //将修改结果存入数据库 m_pSet-Requery 6 统计记录 统计记录用来统计记录集的总数.可以先声明一个CRecordset对象m_pSet.再绑定一个变量m_lCount用来统计记录总数.执行如下语句: m_pSet-OpenSelect Count from表名where限定条件 RecordCountm_pSet-m_lCount //RecordCount即为要统计的记录数. m_pSet-Close 或如下: CRecordset m_Setdb / /db为CDatabase对象 CString strValue m_Set.OpenSelect count from 表名 where 限定条件上一篇:VC 实现文件隐藏和显示功能的代码(操作系统课程设计)