VC6.0数据库编程之MFC ODBC

在vc中,使用ODBC连接是数据库有两种方法,第一种就是使用ODBC API,第二种就是使用MFC ODBC,在这里我只谈一下MFC

ODBC。
为了使数据库开发变得更方便,Microsoft对ODBC API进行的封装,使得我们开发数据库时可以直接使用MFC ODBC类:
CDatabase:建立与数据源的连接
CRecordset:获取记录集
CRecordView:提供一个表单视图与某个记录集直接相连,利用对话框数据交换机制(DDX)在记录集与表单视图的空间之间传输数据
CFieldExchange:支持记录字段数据交换(DFX),即记录集字段数据成员与相应的数据库的表的字段之间的数据交换
CDBException:ODBC的异常类
一、 在实际开发中,使用MFC ODBC类访问数据库步骤如下:
a . 使用CDatabase类方法打开数据源:
定义CDatabase对象m_db;调用其OpenEx方法打开数据源,OpenEx原型如下:
virtual BOOL OpenEx( LPCTSTR lpszConnectString, DWORD dwOptions=0 );
参数一为连接字串:如"DNS=memo;UID=sa;PWD=123",DNS为数据源名称,注意到如果为lpszConnectString传递NULL,则将

出现数据源对话框,提示用户选择一个数据源。
参数二为打开方式,缺省值0表示以共享方式打开数据库,带有写访问,不装入ODBC游标库DLL,并且只有在没有足够信息形

成连接时显示ODBC连接对话框。可选参数如下:
CDatabase::openExclusive:此类库版本不支持。为共享数据源总是打开的。如果选定此选项,断言失败。
CDatabase::openReadOnly:以只读方式打开
CDatabase::UseCursorLib 装入ODBC游标库DLL。游标掩盖了基础ODBC驱动程序的一些功能,有效地阻止使用动态集(如果

驱动程序支持它们)。如果装入游标库,支持的唯一游标是静态快照和只能向前游标。缺省值为TRUE。如果计划从CRecordset直接创建

一个记录集对象而不派生,则不应装入游标库。
CDatabase::noOdbcDialog:不管是否提供了足够的连接信息,不显示ODBC连接对话框。
CDatabase::forceOdbcDialog:总是显示ODBC连接对话框。
如果要使用信任连接,即不需要用户名和密码,则应该使用Open方法,但在打开记录集时有限制,见后。
(注:创建数据源方法:控制面板—>管理工具—>数据源(ODBC)—>添加,选择对应的驱动程序,如数据库在SQL Server下则选择

SQL Server—>完成输入数据名称,描述,选择服务器"(local)",下一步,选择用户输入登陆ID和密码的SQL Server验证,输入登陆ID和

密码,下一步,勾选更改默认数据库,下一步,完成,测试。)
b . 定义CRecordset对象,调用其Open方法打开记录集,如
CRecordset rs(&m_db);
virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none

);
参数一为打开类型,如下:
AFX_DB_USE_DEFAULT_TYPE:默认值
CRecordset::dynaset:动态记录集,支持双向游标,并保持同所连接的数据源同步,对数据的更新操作可以通过一个fetch操

作获取。
CRecordset::snapshot:静态快照,一旦形成记录集,此后数据源的所有改变都不能体现在记录集里,应用程序必须重新进行

查询,才能获取对数据的更新。该类型记录集也支持双向游标。
CRecordset::dynamic:同CRecordset::dynaset记录集相比,CRecordset::dynamic记录还能在fetch操作里同步其它用户对数据

的重新排序,大部分ODBC驱动程序不支持这种记录集
CRecordset::forwardOnly:除了不支持逆向游标外,其它特征同CRecordset::snapshot相同。
参数二为sql查询语句,查询结果保存在记录集中
参数三指定创建记录集时的常用选项
CRecordset::none:无选项(缺省),与其它所有选项互斥,可以更新、删除、添加记录
CRecordset::appendOnly:不允许修改和删除记录,但可以添加记录.
CRecordset::readOnly:记录集是只读的.
其它选项查看MSDN
使用信任连接时,如果使用CRecordset::dynaset会出现ODBC不支持动态记录集错误出现CRecordset::dynamic打开记录集,会出现

ODBC不支持动态指针错误,而用CRecordset::forwardOnly则出现无效的游标位置错误
c . 绑定记录集(通过RFX)
通过向导插入CMySet类且以CRecordset为基类时,会自动生成与表字段对应的变量,并在CMySet的DoFieldExchange中自动与表

字段绑定,如:RFX_Long(pFX,_T("[列名]"),变量名);pFX为CFieldExchange类指针。(注意字段类型)
绑定之后,就可以使用这些变量更新对应字段,如添加,先调用AddNew,然后调用SetFieldNull($变量名,FALSE)将该字段标记

为脏数据(changed),最后给变量赋值,调用Update将新记录保存到数据库,Requery刷新记录集并将记录集指针回到第一条记录处,完成

插入。在AddNew和Edit后必须Update完成操作。调用Edit后可以修改当前记录。
d . 参数化记录集和查询
CRecordset成员变量:m_strFilter负责对记录集进行过滤,它存放着sql语句中where子句的条件字符串,通过
m_strfilter="列名='值'"方式赋值,赋值后调用该对象打开或刷新的记录集已经过滤,并且参数二只需给出表名rs.Open

(CRecordset::snapshot,"book")。m_strSort对记录集进行排序,m_strSort="列名".如果在Open的lpszSQL参数中已包括了WHERE和

ORDER BY子句,那么m_strFilter和m_strSort必需为空.
除直接赋值外,还可以使用参数化:
(1) 声明参变量,代码如下:
CString strName;
int nAge;
(2) 在构造函数中初始化参变量如下:
strName =_T("");
nAge =0;
m_nParams=2;
(3) 将参变量与对应列绑定,代码如下:
pFX->SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T("Name"), strName);
RFX_Single(pFX,_T("Age"), nAge);
完成以上步骤之后就可以利用参变量进行条件查询了,代码如下:

m_pmyRS->m_strFilter="Name=? AND age=?";
m_ pmyRS -> strName ="feng";
m_ pmyRS ->nAge=20;
m_ pmyRS ->Open();//如果记录集已经打开,则刷新
参变量的值按绑定的顺序替换查询字串中的“?”通配符。
f . 书签定位:在当前记录处设置书签,经过一系列移动后再查找该书签处记录,可直接返回书签位置
CDBvarint bookmark;
rs.GetBookmark(bookmark);//获取当前记录保存到书签中
rs.SetBookmark(bookmark);//返回书签位置
使用书签前可通过CRecordset::CanBookmark确定是否支持书签定位,如果是,还需要在记录集的Open函数的dwOptions中加上
CRecordset::useBookmark,在调用之前调用CDatabase::GetBookmarkPersistence来核对是否可以安全调用SetBookmark
绝对定位: row=10;
rs.SetAbsoutePosition(row);
只向前滚动的记录集不支持定位。
注:如果不涉及从数据库中获取记录,就不需要打开记录集,在数据源打开后,直接调用CDatabase::ExecuteSQL执行sql语句,如插

入、删除、更新等。只有在需要从数据库中获取记录时才打开记录集,用while( ! rs.IsEOF( ))判断是否超出记录集最后一条记录,如果

没有绑定记录集,可用GetFieldValue取当前记录的字段值,用MoveNext移到下一条记录。绑定记录集后,变量的值就是数据库中对应的

字段的值,可以直接对变量进行操作,不需要再用GetFieldValue获取。对于数据库中的数据类型与c++数据类型的转换,我将另外讨论


二、事务处理
首先调用CDatabase::BeginTrans( )开始事务,CommitTrans提交事务,Rollback回退,撤销操作
三、异常处理:在数据库编程时,一般会出现的异常可用以下语句捕获
TRY
{......
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CMemoryException,pEx)
{
pEx->ReportError();
AfxMessageBox ("memory exception");
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
由于本人水平有限,如果有什么问题,希望大家指正,谢谢!
再有一点,创建工程后,需要自己添加afxdb.h头文件,应为ODBC类定义在此文件中... s

转载于:https://www.cnblogs.com/cy163/archive/2010/11/16/1878870.html

VC6 ODBC 例子 之一相关推荐

  1. 在RadASM中导入masm32项目和win32汇编odbc示例

    以下以罗云琳<Win32汇编程序设计>第18章odbc例子为例:在RadASM中导入该项目,并为该项目略添加功能: 一 masm32 项目导入radasm 先看一下radasm示例项目的结 ...

  2. 关于编译型语言函数的调用(一)

    最终真是团团转,真可以说是好事做尽,坏事做绝, 然而想想写点东西既有助于记忆,又有利于他人参考,所以还是决定抽点时间草书此文 以前在有关破解的博文中也稍微提到这个问题,现在就深入一点去考究它吧 狭义的 ...

  3. 关于WAP的常见问答

    WAP常见问题问答大全 目录 一.关于WAP的常见问答 二.关于WML的常见问答 三.关于WAP开发的常见问答 四.关于WMLScript的常见问答 五.关于WBMP的常见问答 六.关于WAP网关的常 ...

  4. ACE_INET_Addr

    目录 一.        关于WAP的常见问答 二.       关于WML的常见问答 三.       关于WAP开发的常见问答 四.关于WMLScript的常见问答 五.关于WBMP的常见问答 六 ...

  5. 词法分析程序 LEX和VC6整合使用的一个简单例子

    词法分析的理论知识不少,包括了正规式.正规文法.它们之间的转换以及确定的有穷自动机和不确定的有穷自动机等等... 要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用if ...

  6. vb odbc数据源 oracle,vb.net写的odbc连接dsn数据源和ole链接oracle的小例子

    最近由于工作需要开始接触vb2010,也叫vb.net.相比vb6.0有面向对象编程的优势.同时接触一门新语言,要更快的实际应用起来,链接数据库是必不可少的.之前用vba写过一个售书工具,正好可以拿来 ...

  7. Access 和vc6.0 相连,在我indows64 位系统中,出现找不到Microsoft Access Driver(*.mdb) ODBC驱动程序的安装例程。请重新安装驱动

    今天要连接Access时发现win7 64位旗舰版控制面板中管理工具下的数据源(ODBC)配置竟然只有SQLServer的驱动,其他的都没有了,这可不好玩!上网百度了一番,有人也遇过这样的问题,我在此 ...

  8. VC6数据库综合开发资料

    VC6数据库综合开发资料           目录   用VC++6.0开发多表联接的数据库应用程序 <使用OLEDB编写数据库应用程序> <在Visual C++中用ADO进行数据 ...

  9. C++中一个class类对象占用多少内字节(7个例子,很清楚)

    一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分?     一个Class对象需要占用多大的内存空间.最权威的结论是:  *非静态成员变量总合.  * ...

  10. VC6.0 如何改变对话框背景色

    VC6.0 如何改变对话框背景色 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现. 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色.下面的例子是将应用程序对 ...

最新文章

  1. canvas.width和canvas.style.width区别以及应用
  2. 【系统分析与设计】UML协作图绘制方法(真の能看懂~!)
  3. 在Windows7中与虚拟机实现远程桌面连接
  4. 管理角色认知-新晋管理常常犯的错
  5. 漫谈 Gentoo 中文社区的建设
  6. Python数据可视化案例三:使用Slider组件调整曲线参数
  7. 2019年企业数据生产力调研报告,90%的人都没看过
  8. linux下的备份管理rsync
  9. 编程实践精华总结集锦系列1: SpringBoot/Maven/IDEA/Java/Kotlin/Redis等等
  10. HZNU 与班尼特·胡迪一起攻破浮空城 【DP】
  11. html required 无效,html5的input的required使用中遇到的问题及解决方法
  12. 万能通用!权限系统就该这么设计
  13. 拼多多Temu如何批量养国外买家账号进行拉新?
  14. 视频号互刷赞会不会出现限流的问题?
  15. 一木禾网盘下载分析及批量获取下载地址的实现(上)
  16. SpringBoot 官方强烈推荐,连接池,太快了!
  17. 临商银行罗庄支行能耗监测系统的应用
  18. 2020低压电工证考试及低压电工复审模拟考试
  19. 简单ops manager安装部署使用
  20. 华硕Xtion Pro Live驱动安装与骨骼跟踪

热门文章

  1. Linux下与github建立ssh连接
  2. pytorch GPU分布式训练 数据并行
  3. 30+岁、没转管理、加不动班,我的竞争力从哪里来?
  4. 辨别虚假流量的十二种方法
  5. Android中的界面组成
  6. 矩阵线性代数笔记整理汇总,超全面
  7. 优化理论12---- Rosen的梯度投影法 、投影矩阵、 既约梯度法
  8. 3.4 RNN网络扩展:堆叠RNN、递归神经网络、图网络
  9. 5.10 Memory Networks 记忆网络的应用与方法
  10. 3分钟tips:泛函中,什么是开映像定理?