首先在StdAfx.h中加入
建立连接:(在xxApp文件中)
1 声明变量
2 建立连接
(1) AfxOleInit
初始化 OLE 为应用程序的支持。
BOOL AFXAPI AfxOleInit( );
AfxOleInit()与CoInitialize(NULL)的区别
OLE是建立在COM之上的技术,层次比COM要高。AfxOleInit()调用的是OleInitialize(),而OleInitialize()除了调用CoInitializeEx()来初始化COM库外,还进行一些其它的操作,这些操作对OLE应用来说是必须的,这些OLE应用包括:
(1)Clipboard;
(2)Drag and drop;
(3)Object linking and embedding(现在的OLE,已不再仅仅是Object linking and embedding的概念);
(4)In-place activation;
与AfxOleInit()对应的是,AfxOleTerm()。
CoInitialize和CoUninitialize必须成对使用,后者不必。
AfxOleInit()和AfxOleTerm()其实也是需要成对的,但是,在你的程序中,AfxOleTerm()可以不出现,这是因为,MFC已经帮你做好了(有兴趣的话,你可以仔细研究一下CWinThread::m_lpfnOleTermOrFreeLib,而CWinApp是从CWinThread继承的)。
(2)CreateInstance
_uuidof: 取得和某个标示符相关联的GUID(全球唯一标识符)
(3)Open 方法 (ADO Connection)
打开到数据源的连接。
语法
connection.Open ConnectionString, UserID, Password, Options
参数
ConnectionString 可选,字符串,包含连接信息。参阅ConnectionString 属性可获得有效设置的详细信息。
UserID 可选,字符串,包含建立连接时所使用用户名。
Password 可选,字符串,包含建立连接时所使用密码。
Options 可选,ConnectOptionEnum 值。决定该方法是在连接建立之后(异步)还是连接建立之前(同步)返回。可以是如下某个常量:
常量 | 说明 |
adConnectUnspecified | (默认)同步打开连接。 |
adAsyncConnect | 异步打开连接。ConnectComplete 事件可以用于决定连接何时可用。 |
说明
使用 Connection 对象的 Open 方法可建立到数据源的物理连接。在该方法成功完成后连接是活跃的,可以对它发出命令并且处理结果。
使用可选的 ConnectionString 参数指定连接字符串,它包含由分号分隔的一系列 argument = value 语句。ConnectionString属性自动继承用于ConnectionString 参数的值,因此可在打开之前设置 Connection 对象的 ConnectionString 属性,或在 Open 方法调用时使用 ConnectionString 参数设置或覆盖当前连接参数。
如果在 ConnectionString 参数和可选的 UserID 及 Password 参数中传送用户和密码信息,那么UserID 和Password 参数将覆盖 ConnectionString 中指定的值。
在对打开的 Connection 的操作结束后,可使用 Close 方法释放所有关联的系统资源。关闭对象并非将它从内存中删除;可以更改它的属性设置并在以后再次使用 Open 方法打开它。要将对象完全从内存中删除,可将对象变量设置为Nothing。
远程数据服务用法 当在客户端的 Connection 对象上使用 Open 方法时,在 Connection 对象上打开Recordset 之前 Open 方法其实并未建立到服务器的连接。
adModeUnknown 表示目前用ado连接数据库的方式还不知道ad--ADO Mode-方式模式 Unknown-不知道,这种方式以后可以在程序中以表、视图、查询、SQL、过程等方式提取数据。
创建记录集(在XXDlg中)
1 声明变量 _RecordsetPtr m_pRecordset
2 添加记录 (在OnInitDialog中)
Recordset.open
Recordset 对象的 Open 方法 允许用户向数据库发出请求,通过是运行一个 SQL
命令、启动一个指定的数据表或调用一个指定的 Stored Procedure
格式:
Recordset.Open Source,ActiveConnection,CursorType,LockType,Options
1、Source 参数可以是一个 Command 名称,一个 SQL 命令、一个指定的数据表
名称或一个指定的 Stored Procedure。Recordset 对象可通过 Source 属性连接
Command 对象。
2、ActiveConnection 参数可以是一个 Connction 对象名称或是包含“数据库连
接信息( ConnectionString )”的字符串信息。Recordset 对象可通过
ActiveConnection 属性连接 Connection 对象。
3、CursorType 参数表示启动数据的游标类型。
常数值说明:
AdOpenForwardOnly 0 启动只能向前( Forward-only )的游标,缺省值
AdOpenKeyset 1 启动 Keyset 类型的游标
AdOpenDynamic 2 启动 Dynamic 类型的游标
AdOpenStatic 3 启动 Static 类型的游标
4、LockType 参数表示采用的 Lock 类型。
常数值说明:
AdLockReadOnly 1 以只读方式启动,无法运行 AddNew、Update、Delete
等方法,缺省值
AdLockPessimistic 2 当数据正在更新时,系统会暂时锁定其它用户的动作
,以确保数据一致性
AdLockOptimistic 3 当数据正在更新时,系统不会暂时锁定其它用户的动
作
AdLockBatchOptimistic 4 当数据正在更新时,其它用户必须将 CursorLocation
属性设为 adUseBatch ,才能对数据库操作
5、Options 参数表示对数据库请求的类型。
常数值说明 :
AdCmdUnknown -1 所指定的 CommandText 参数类型无法确定,缺省值
AdCmdText 1 所指定的 CommandText 参数是一般的命令类型
AdCmdTable 2 所指定的 CommandText 参数是一个存在的表名称
AdCmdStoredProc 3 所指定的 CommandText 参数是 Stored Procedure 表名称
ADO Recordset
对象用于容纳一个来自数据库表的记录集。一个 Recordset 对象由记录和列(字段)组成。在 ADO 中,此对象是最重要且最常用于对数据库的数据进行操作的对象。
ProgID
set objRecordset=Server.CreateObject("ADODB.recordset")
当您首次打开一个 Recordset 时,当前记录指针将指向第一个记录,同时 BOF 和 EOF 属性为 False。如果没有记录,BOF 和 EOF 属性为 True。
Recordset 对象能够支持两种更新类型:立即更新 - 一旦调用 Update 方法,所有更改被立即写入数据库。批更新 - provider 将缓存多个更改,然后使用 UpdateBatch 方法把这些更改传送到数据库。
在 ADO,定义了 4 中不同的游标(指针)类型
- 动态游标 - 允许您查看其他用户所作的添加、更改和删除
- 键集游标 - 类似动态游标,不同的是您无法查看有其他用户所做的添加,并且它会防止您访问其他用户已删除的记录。其他用户所做的数据更改仍然是可见的。
- 静态游标 - 提供记录集的静态副本,可用来查找数据或生成报告。此外,由其他用户所做的添加、更改和删除将是不可见的。当您打开一个客户端 Recordset 对象时,这是唯一被允许的游标类型。
- 仅向前游标 - 只允许在 Recordset 中向前滚动。此外,由其他用户所做的添加、更改和删除将是不可见的。
可通过 CursorType 属性或 Open 方法中的 CursorType 参数来设置游标的类型。
注释:并非所有的提供者(providers)支持 Recordset 对象的所有方法和属性。
属性
属性描述AbsolutePage | 设置或返回一个可指定 Recordset 对象中页码的值。 |
AbsolutePosition | 设置或返回一个值,此值可指定 Recordset 对象中当前记录的顺序位置(序号位置)。 |
ActiveCommand | 返回与 Recordset 对象相关联的 Command 对象。 |
ActiveConnection | 如果连接被关闭,设置或返回连接的定义,如果连接打开,设置或返回当前的 Connection 对象。 |
BOF | 如果当前的记录位置在第一条记录之前,则返回 true,否则返回 fasle。 |
Bookmark | 设置或返回一个书签。此书签保存当前记录的位置。 |
CacheSize | 设置或返回能够被缓存的记录的数目。 |
CursorLocation | 设置或返回游标服务的位置。 |
CursorType | 设置或返回一个 Recordset 对象的游标类型。 |
DataMember | 设置或返回要从 DataSource 属性所引用的对象中检索的数据成员的名称。 |
DataSource | 指定一个包含要被表示为 Recordset 对象的数据的对象。 |
EditMode | 返回当前记录的编辑状态。 |
EOF | 如果当前记录的位置在最后的记录之后,则返回 true,否则返回 fasle。 |
Filter | 返回一个针对 Recordset 对象中数据的过滤器。 |
Index | 设置或返回 Recordset 对象的当前索引的名称。 |
LockType | 设置或返回当编辑 Recordset 中的一条记录时,可指定锁定类型的值。 |
MarshalOptions | 设置或返回一个值,此值指定哪些记录被返回服务器。 |
MaxRecords | 设置或返回从一个查询返回 Recordset 对象的的最大记录数目。 |
PageCount | 返回一个 Recordset 对象中的数据页数。 |
PageSize | 设置或返回 Recordset 对象的一个单一页面上所允许的最大记录数。 |
RecordCount | 返回一个 Recordset 对象中的记录数目。 |
Sort | 设置或返回一个或多个作为 Recordset 排序基准的字段名。 |
Source | 设置一个字符串值,或一个 Command 对象引用,或返回一个字符串值,此值可指示 Recordset 对象的数据源。 |
State | 返回一个值,此值可描述是否 Recordset 对象是打开、关闭、正在连接、正在执行或正在取回数据。 |
Status | 返回有关批更新或其他大量操作的当前记录的状态。 |
StayInSync | 设置或返回当父记录位置改变时对子记录的引用是否改变。 |
方法
方法描述AddNew | 创建一条新记录。 |
Cancel | 撤销一次执行。 |
CancelBatch | 撤销一次批更新。 |
CancelUpdate | 撤销对 Recordset 对象的一条记录所做的更改。 |
Clone | 创建一个已有 Recordset 的副本。 |
Close | 关闭一个 Recordset。 |
CompareBookmarks | 比较两个书签。 |
Delete | 删除一条记录或一组记录。 |
Find | 搜索一个 Recordset 中满足指定某个条件的一条记录。 |
GetRows | 把多条记录从一个 Recordset 对象中拷贝到一个二维数组中。 |
GetString | 将 Recordset 作为字符串返回。 |
Move | 在 Recordset 对象中移动记录指针。 |
MoveFirst | 把记录指针移动到第一条记录。 |
MoveLast | 把记录指针移动到最后一条记录。 |
MoveNext | 把记录指针移动到下一条记录。 |
MovePrevious | 把记录指针移动到上一条记录。 |
NextRecordset | 通过执行一系列命令清除当前 Recordset 对象并返回下一个 Recordset。 |
Open | 打开一个数据库元素,此元素可提供对表的记录、查询的结果或保存的 Recordset 的访问。 |
Requery | 通过重新执行对象所基于的查询来更新 Recordset 对象中的数据。 |
Resync | 从原始数据库刷新当前 Recordset 中的数据。 |
Save | 把 Recordset 对象保存到 file 或 Stream 对象中。 |
Seek | 搜索 Recordset 的索引以快速定位与指定的值相匹配的行,并使其成为当前行。 |
Supports | 返回一个布尔值,此值可定义 Recordset 对象是否支持特定类型的功能。 |
Update | 保存所有对 Recordset 对象中的一条单一记录所做的更改。 |
UpdateBatch | 把所有 Recordset 中的更改存入数据库。请在批更新模式中使用。 |
事件
Note: You cannot handle events using VBScript or JScript (only Visual Basic, Visual C++, and Visual J++ languages can handle events).
事件描述EndOfRecordset | 当试图移动到超过 Recordset 结尾的行时被触发。 |
FetchComplete | 当异步操作中的所有记录均被读取后被触发。 |
FetchProgress | 在异步操作期间被定期地触发,报告已读取多少记录。 |
FieldChangeComplete | Field 对象的值更改被触发。 |
MoveComplete | Recordset 中的当前位置更改后被触发。 |
RecordChangeComplete | 一条记录更改之后被触发。 |
RecordsetChangeComplete | 在 Recordset 更改之后被触发。 |
WillChangeField | 在 Field 对象的值更改之前被触发 |
WillChangeRecord | 在一条记录更改之前被触发。 |
WillChangeRecordset | 在 Recordset 更改之前被触发。 |
WillMove | 在 Recordset 中的当前位置更改之前被触发。 |