AdvancedPV 示例:演示高级提供程序技术

更新:2007 年 11 月

AdvancedPV 示例与 UpdatePV 非常类似,但前者说明一些高级技术。

通常情况下,用 OLE DB 模板编写的提供程序使用 CAtlArray 进行数据存储。OLE DB 提供程序模板调用用户提供的 Execute 方法来填充数组(例如,将数据文件中的所有行加载到数组中)。另一个用户提供的方法 FlushData 则用于保存数组的内容(例如,将数组内容写回数据文件中)。此方法的问题在于当使用 Execute 时必须加载行集合中的所有行,而使用 FlushData 时则必须同时保存所有行。如果行集合中有大量行,则所有的数据都需要存储在内存中(在 CAtlArray 对象中)。

AdvancedPV 说明如何使用一个特殊数组类来取代默认的 CAtlArray 数组以使提供程序根据需要加载和保存行。只有在实际请求行时(通过专门实现的 operator[])才从数据文件中加载它们,而且,数组内容一更改,这些更改就会写回文件。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行此示例

  1. 打开解决方案文件 AdvancedPV.sln。

  2. 从“生成”菜单中单击“生成”。

  3. 使用“Win32 项目向导”创建一个 Win32 控制台应用程序。赋予其 ATL 支持。

  4. 将 OLE DB 使用者添加到项目中(从“添加类”中,选择“ATL OLE DB 使用者”)。

  5. 在“ATL OLE DB 使用者”向导中,单击“数据源”按钮并在“数据链接属性”中选择“AdvancedProv 提供程序”。(在生成 AdvancedPV 时,AdvancedProv 提供程序应自动注册,但如果它在这里没有列出,请对 AdvancedPV.dll 运行 regsvr32.exe。)

  6. 单击 Next 以转到“连接”选项卡,然后在“输入要使用的初始目录”下指定要使用的初始目录(DataFile.dat 的路径)。

  7. 在“选择数据库对象”下,打开“表”,这里只有一项(DataFile.dat 的路径)。选择它并单击“确定”。当返回“ATL OLE DB 使用者向导”时,选择“表”,将该类重命名为较短的名称(如有必要,如 CMyCons),并单击“完成”。生成使用者项目。

  8. 将下面的代码添加到项目的主代码中:

    #include "MyCons.h" 
     
    int main( int argc, char* argv[] )
    {
       // Add this code
       HRESULT hr = CoInitialize(NULL);   CMyCons rs;   hr = rs.OpenAll();   ATLASSERT( SUCCEEDED(hr));   hr = rs.MoveFirst();   while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET )   {      printf( "%d %s %s %s %s\n", rs.m_Fixed, rs.m_Command, rs.m_Text,       rs.m_Command2, rs.m_Text2 );      hr = rs.MoveNext();   }   rs.CloseAll();   CoUninitialize();   return 0;
    }
    
  9. CoUninitialize 函数处放置一个断点,这将使控制台保持打开状态以便于查看结果。单击“开始”按钮(或从“调试”菜单中单击“开始执行(不调试)”)运行应用程序。应看到输出五个文本列(一个索引列和四个文本列)。

关键字

此示例使用以下接口:

IRowsetLocateImpl、IRowsetScroll、IRowsetScrollImpl、IRowsetUpdateImpl、IConnectionPointContainerImpl、IRowsetNotifyCP、IDBCreateSessionImpl、IDBInitializeImpl、IDBPropertiesImpl、IPersistImpl、IInternalConnectionImpl、IGetDataSourceImpl、IOpenRowsetImpl、ISessionPropertiesImpl、IObjectWithSiteSessionImpl、IDBSchemaRowsetImpl、IDBCreateCommandImpl、IAccessorImpl、ICommandTextImpl、ICommandPropertiesImpl、IObjectWithSiteImpl、IConvertTypeImpl、IColumnsInfoImpl、IInternalCommandConnectionImpl

此示例说明下面的类:

CSchemaRowsetImpl、CComObjectRootEx、CComObjectRootEx、CRowsetImpl、CFileArray、CSimpleRow

此示例说明下面的宏:

COM_INTERFACE_ENTRY、PROPERTY_INFO_ENTRY

请参见

其他资源

ATL 示例