VC6 ODBC 例子 之一
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 例子 之一相关推荐
- 在RadASM中导入masm32项目和win32汇编odbc示例
以下以罗云琳<Win32汇编程序设计>第18章odbc例子为例:在RadASM中导入该项目,并为该项目略添加功能: 一 masm32 项目导入radasm 先看一下radasm示例项目的结 ...
- 关于编译型语言函数的调用(一)
最终真是团团转,真可以说是好事做尽,坏事做绝, 然而想想写点东西既有助于记忆,又有利于他人参考,所以还是决定抽点时间草书此文 以前在有关破解的博文中也稍微提到这个问题,现在就深入一点去考究它吧 狭义的 ...
- 关于WAP的常见问答
WAP常见问题问答大全 目录 一.关于WAP的常见问答 二.关于WML的常见问答 三.关于WAP开发的常见问答 四.关于WMLScript的常见问答 五.关于WBMP的常见问答 六.关于WAP网关的常 ...
- ACE_INET_Addr
目录 一. 关于WAP的常见问答 二. 关于WML的常见问答 三. 关于WAP开发的常见问答 四.关于WMLScript的常见问答 五.关于WBMP的常见问答 六 ...
- 词法分析程序 LEX和VC6整合使用的一个简单例子
词法分析的理论知识不少,包括了正规式.正规文法.它们之间的转换以及确定的有穷自动机和不确定的有穷自动机等等... 要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用if ...
- vb odbc数据源 oracle,vb.net写的odbc连接dsn数据源和ole链接oracle的小例子
最近由于工作需要开始接触vb2010,也叫vb.net.相比vb6.0有面向对象编程的优势.同时接触一门新语言,要更快的实际应用起来,链接数据库是必不可少的.之前用vba写过一个售书工具,正好可以拿来 ...
- Access 和vc6.0 相连,在我indows64 位系统中,出现找不到Microsoft Access Driver(*.mdb) ODBC驱动程序的安装例程。请重新安装驱动
今天要连接Access时发现win7 64位旗舰版控制面板中管理工具下的数据源(ODBC)配置竟然只有SQLServer的驱动,其他的都没有了,这可不好玩!上网百度了一番,有人也遇过这样的问题,我在此 ...
- VC6数据库综合开发资料
VC6数据库综合开发资料 目录 用VC++6.0开发多表联接的数据库应用程序 <使用OLEDB编写数据库应用程序> <在Visual C++中用ADO进行数据 ...
- C++中一个class类对象占用多少内字节(7个例子,很清楚)
一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分? 一个Class对象需要占用多大的内存空间.最权威的结论是: *非静态成员变量总合. * ...
- VC6.0 如何改变对话框背景色
VC6.0 如何改变对话框背景色 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现. 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色.下面的例子是将应用程序对 ...
最新文章
- canvas.width和canvas.style.width区别以及应用
- 【系统分析与设计】UML协作图绘制方法(真の能看懂~!)
- 在Windows7中与虚拟机实现远程桌面连接
- 管理角色认知-新晋管理常常犯的错
- 漫谈 Gentoo 中文社区的建设
- Python数据可视化案例三:使用Slider组件调整曲线参数
- 2019年企业数据生产力调研报告,90%的人都没看过
- linux下的备份管理rsync
- 编程实践精华总结集锦系列1: SpringBoot/Maven/IDEA/Java/Kotlin/Redis等等
- HZNU 与班尼特·胡迪一起攻破浮空城 【DP】
- html required 无效,html5的input的required使用中遇到的问题及解决方法
- 万能通用!权限系统就该这么设计
- 拼多多Temu如何批量养国外买家账号进行拉新?
- 视频号互刷赞会不会出现限流的问题?
- 一木禾网盘下载分析及批量获取下载地址的实现(上)
- SpringBoot 官方强烈推荐,连接池,太快了!
- 临商银行罗庄支行能耗监测系统的应用
- 2020低压电工证考试及低压电工复审模拟考试
- 简单ops manager安装部署使用
- 华硕Xtion Pro Live驱动安装与骨骼跟踪