UpdatePV 示例:实现可更新的 OLE DB 提供程序
更新:2007 年 11 月
UpdatePV 示例是一个说明如何实现可更新(读/写)提供程序的“OLE DB 提供程序模板”示例。具体地说,该示例说明如何执行即时和延迟插入/更新/删除。UpdatePV 还说明如何使用架构行集合(简化一些向导与提供程序的交互)。UpdatePV 也像 MyProv 一样说明 IRowsetLocateImpl 类。
有关使用提供程序加载和保存数据的其他技术的说明,请参见 AdvancedPV 示例。
安全说明: |
---|
提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。 |
获取示例和安装示例的说明:
在 Visual Studio 的“帮助”菜单上,单击“示例”。
有关更多信息,请参见定位示例文件。
示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。
还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。
生成并运行示例
若要演示该示例的预期功能,请生成该示例,创建一个带有提供程序访问器的使用者项目,并创建控制台应用程序来访问和输出数据。
生成并运行此示例
打开解决方案文件 UpdatePV.sln。
在“生成”菜单中,单击“生成解决方案”。
使用“ATL 项目向导”创建一个使用者项目(使其为属性化 .dll)。
将 OLE DB 使用者添加到该使用者项目(从“添加类”中,选择“ATL OLE DB 使用者”)。
在“ATL OLE DB 使用者向导”中单击“数据源”按钮,并在“数据链接属性”中选择“UpProv OLE DB 提供程序”。(在生成 UpdatePV 时,UpProv 提供程序应自动注册,但如果它在这里没有列出,则对 UpdatePV.dll 运行 regsvr32.exe。)
单击 Next 以转到“连接”选项卡,然后确保“输入要使用的初始目录”下的 MyData.txt 的路径名正确。
单击“确定”。出现“选择数据库对象”对话框,然后打开“表”,其中只有一项:MyData.txt 的路径名。选中它并单击“确定”。返回“ATL OLE DB 使用者向导”。
在“ATL OLE DB 使用者向导”中选择“表”,将该类重命名为较短的名称(如有必要,如 CMyCons),并单击“完成”。
按“确定”关闭弹出的安全警告对话框。
将此行从 CMyCons.h 中移除:
#error Security Issue: The connection string may contain a password
此行会妨碍编译,插入此行是为了提醒您(在现实情况中)应保护敏感信息这一事实。
右击“解决方案资源管理器”中的项目节点,再单击“生成”生成使用者项目。
创建一个新的控制台应用程序。在 .cpp 文件中,包含使用者标头并修改代码,如下所示:
#include "stdafx.h" #include <atldbcli.h> #include "..\consumer\cmycons.h" int _tmain(int argc, _TCHAR* argv[]) { HRESULT hr = CoInitialize(NULL); CMyCons c; hr = c.OpenAll(); ATLASSERT( SUCCEEDED( hr ) ); hr = c.MoveFirst(); while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) { printf( "%d %s %s %s %s\n", c.m_Fixed, c.m_Command, c.m_Text, c.m_Command2, c.m_Text2 ); hr = c.MoveNext(); } c.CloseAll(); CoUninitialize(); return 0; }
在 CoUninitialize 函数处放置一个断点,这将使控制台保持打开状态以便于查看结果。单击“启动”按钮从开发环境运行控制台应用程序。应看到输出五个文本列(一个索引列和四个文本列)。
示例的工作机制
UpdatePV 建立在 C 运行时文件 I/O 功能之上。这表示数据存储区。具体地说,该示例获取由数据元素对组成的一个文本文件,并将其转换为行集合。该示例附带了一个文本文件 MyData.txt,该文件包含数据元素对。不过,可以对任何文本文件运行该示例(会将所有内容全部分析为双字元组)。
UpdatePV 使用 RUpdateRowset::Execute (rowset.h) 执行其读取操作。写入操作则由 RUpdateRowset::FlushData (rowset.h) 处理。这些函数均由 OLE DB 提供程序模板作为正常提供程序操作的一部分进行调用。该示例使用 OLE DB 提供程序模板 IRowsetChangeImpl 和 IRowsetUpdateImpl 类。IRowsetChangeImpl 类支持即时插入/更新/删除。IRowsetUpdateImpl 类则支持延迟插入/更新/删除。IRowsetUpdateImpl 类从 IRowsetChangeImpl 继承。有关获取/设置数据的更多信息,请阅读 Visual C++ 文档中的创建可更新的提供程序及 Windows SDK 文档中 OLE DB Programmer's Reference(《OLE DB 程序员参考》)内的更新行集中的数据。
UpdatePV 也支持架构行集合。这些架构行集合使使用者不用打开行集合或执行命令就可以找出提供程序的相关信息。Visual C++ 向导使用架构行集合生成客户端访问器。主要函数有 CUpdateSessionTRSchemaRowset::Execute、CUpdateSessionColSchemaRowset::Execute 和 CUpdateSessionPTSchemaRowset::Execute。这三个函数都返回以下信息:提供程序所支持的表、表中的列及表中的数据类型。有关架构行集合进一步的信息,请参见 OLE DB Programmer's Reference(OLE DB 程序员参考)中的 IDBSchemaRowset 接口。
关键字
该示例说明下面的接口:
IRowsetChange、IRowsetUpdateImpl
该示例说明下面的属性:
DBPROP_IRowsetChange、DBPROP_IRowsetUpdate