vc6.0mfc:VC6.0数据库编程之MFC ODBC



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

ODBC
为了使数据库开发变得更方便Microsoft对ODBC API进行封装使得我们开发数据库时可以直接使用MFC ODBC类:
CDatabase:建立和数据源连接
CRecord:获取记录集
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则将

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ORDER BY子句那么m_strFilter和m_strSort必需为空.
除直接赋值外还可以使用参数化:
(1) 声明参变量代码如下:
CString strName;
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 . 书签定位:在当前记录处设置书签经过系列移动后再查找该书签处记录可直接返回书签位置
CDBvar bookmark;
rs.GetBookmark(bookmark);//获取当前记录保存到书签中
rs.SetBookmark(bookmark);//返回书签位置
使用书签前可通过CRecord::CanBookmark确定是否支持书签定位如果是还需要在记录集OpendwOptions中加上
CRecord::useBookmark,在的前CDatabase::GetBookmarkPersistence来核对是否可以安全SetBookmark
绝对定位: row=10;
rs.SetAbsoutePosition(row);
只向前滚动记录集不支持定位
注:如果不涉及从数据库中获取记录就不需要打开记录集在数据源打开后直接CDatabase::ExecuteSQL执行sql语句如插

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

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

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


2、事务处理
首先CDatabase::BeginTrans( )开始事务CommitTrans提交事务Rollback回退撤销操作
3、异常处理:在数据库编程时般会出现异常可用以下语句捕获
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类定义在此文件中...

Tags:  odbc数据库 odbc连接数据库 mfcodbc vc6.0mfc

延伸阅读

最新评论

发表评论