ODBC、ADO
一、VC访问数据库的技术
1、ODBC --Open Database Connectivity微软开放式数据互联,一组用于访问和操作数据库的API,可以访问不同的数据库产品,但只能访问关系型数据库。MFC将这组API函数封装成ODBC类,使用前需要将不同的数据库设置为ODBC数据源。
2、DAO --基于ODBC的,目前已经被淘汰
3、OLE DB --基于COM技术的,提供了一组用于访问和操作数据库的接口。既可以访问关系型又可以访问非关系型数据,性能也有了很大提高。缺点是学习难度大,对程序员要求高,并未流行起来。
4、ADO --基于OLE DB,对OLE DB又进行了封装,提供了一组简单的接口,逐渐流行起来,成为使用最广泛的技术之一。
5、ADO.NET --基于.net平台的,适用于该平台之上的VB、VC、C#等各种语言。是一组用于访问和操作数据库的类。
二、ODBC类的使用
1、相关类
CDatabase类 -提供了数据库的连接和关闭功能,另外还提供了执行Sql语句的功能。
CRecordset类 -提供了对数据表中数据的操作。
以上两个类需包含头文件 #include <afxdb.h>
2、使用步骤:
2.1设置ODBC数据源
控制面板->管理工具->数据源ODBC
2.2使用ODBC类
1--连接ODBC数据源 CDatabase::Open
2--执行sql语句 CDatabase::ExecuteSQL
3--打开数据表 CRecordset::Open
4--获取字段数量 CRecordset::GetODBCFieldCount
5--获取字段的信息 CRecordset::GetODBCFieldInfo
6--获取字段的值 CRecordset::GetFieldValue
7--记录的指针移动 CRecordset::MoveFirst/MoveLast/Move/MoveNext/MovePrevious
CRecordset::IsBOF //是否移动到了最开始
CRecordset::IsEOF //是否移动到了最末尾
8--关闭记录集 CRecordset::Close
9--关闭数据源 CDatabase::Close
了解 CRecordView -显示数据库中记录的视图
三、使用ADO访问数据库
1、ADO的文件:msado15.dll
所在路径-C:/Program Files/Common Files/System/ado/msado15.dll
2、导入ADO组件
#import "组件文件所在路径" no_namespace rename("EOF","adoEOF")
在项目头文件StdAfx.h中添加以上导入命令,编译后,在Debug文件下生成msado15.tlh、msado15.tli,这两个文件类似于控件的包装类。
3、在使用任何COM组件时,都必须首先初始化COM库。
3.1使用组件前,初始化COM库 CoInitialize(NULL);
3.2使用组件后,卸载COM库 CoUninitialize();
4、ADO组件的使用
使用C++类封装ADO组件的接口,好处是方便C++程序对ADO的使用。
4.1 Connection接口(使用CAdoDatabase类封装)
功能与ODBC类的CDatabase类似
1-- Open()函数,连接数据库
HRESULT Open (
_bstr_t ConnectionString, //连接字符串
_bstr_t UserID, //登录名称;在连接字符串中设置了该处即为""
_bstr_t Password, //登录密码;在连接字符串中设置了该处即为""
long Options //连接方式,直接写-1
);
由于不同的数据库“连接字符串”各不相同,所以通过新建*.udl文件自动生成连接字符串:
在桌面新建文本文档->重命名为1.udl->打开该文件->选择[提供程序]选项卡->选择对应的数据库驱动,点击“下一步”->输入相关信息后,测试连接,成功后确定即可;将1.udl重新以记事本方式打开,即可见连接字符串,如:
Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=D:\ado.mdb;
或
Provider=Microsoft.Jet.OLEDB.4.0;
Password=123;User ID=ZWQ;
Data Source=D:\ado.mdb;
4.2 Recordset接口(使用CAdoRecordset类封装)
功能与ODBC类的CRecordset类似
1-- Open()函数,执行sql语句、打开表、执行存储过程
HRESULT Open (
const _variant_t & Source, //sql语句、表名、存储过程
const _variant_t & ActiveConnection, //活动连接
enum CursorTypeEnum CursorType, //游标类型
enum LockTypeEnum LockType, //锁定类型
long Options //标识第一个参数,sql语句-adCmdText/表名-adCmdTable/存储过程-adCmdStoredProc
);
游标类型:
enum CursorTypeEnum{
adOpenForwardOnly = 0, //单向的静态游标
adOpenKeyset = 1, //键集游标,动态游标
adOpenDynamic = 2, //动态游标
adOpenStatic = 3 //双向的静态游标
};
如果记录集使用的是动态游标,记录集会随着用户对表的修改发生变化;如果使用的静态游标,从表中取出数据后不再改变。
锁定类型(多用户对同一数据库进行操作时):
enum LockTypeEnum{
adLockReadOnly = 1, //只读记录集
adLockPessimistic = 2, //悲观锁
adLockOptimistic = 3, //乐观锁
adLockBatchOptimistic = 4 //批处理方式的乐观锁
};
2-- 获取字段的数量(Fields) Fields->GetCount()
3-- 获取字段标题 Fields->GetItem(nIndex)->GetName()
4-- 获取字段的值 Fields->GetItem(nIndex)->Value
5-- 记录集的指针操作 MoveNext/MovePrevious/MoveFirst/MoveLast/Move(long nNums)
IsEOF -是否移动到了最末尾 / IsBOF -是否移动到了最开始
6-- 方式一:通过记录集的方式增、删、改
6.1添加记录
1--从数据表中获取数据到记录集 OpenTable()
2--在记录集中添加一条新记录 AddNew()
3--设置该记录各个字段的值 SetFieldValue
4--更新到数据库 Update()
5--重新显示数据 ShowData()
6.2删除记录
1--从数据表中获取数据到记录集 OpenTable()
2--将记录指针移动到要删除的记录 MoveLast()
3--执行删除操作 Delete()
4--更新到数据库 Update()
5--重新显示数据 ShowData()
6.3修改记录
1--从数据表中获取数据到记录集 OpenTable()
2--将记录指针移动到要修改的记录 MoveFirst()
3--执行修改操作 SetFieldValue
4--更新到数据库 Update()
5--重新显示 ShowData()
7--方式二:通过执行sql语句的方式增、删、改操作
1、Connection接口Execute()函数
返回一个记录集,无法通过参数设置记录集的游标类型和锁定类型,是一个只读的,游标类型是单向的静态游标,所以,常用它执行增、删、改操作
2、Recordset接口Open()函数
常用Open()函数执行查询操作,可结合记录集的增、删、改方式对数据表中的数据进行增、删、改
5、事务处理
Connection接口提供了事务处理的功能
启动事务 BeginTrans()
结束事务 EndTrans(FALSE)--事务结束时包含了执行事务CommitTrans和回滚事务RollbackTrans
6、如何在数据表中保存视频、图片数据?
通常在数据库中保存视频、图片所对应的文件的路径