65.9K
CodeProject 正在变化。 阅读更多。
Home

如何从 COM 返回断开连接的 ADO 记录集

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2002 年 3 月 19 日

CPOL

2分钟阅读

viewsIcon

143342

downloadIcon

935

一篇关于如何使用 VC 从 COM 返回断开连接的 ADO 记录集文章。

引言

一些业务对象将 ADO recordset 返回给它们的客户端。这是开发三层 Web 应用程序时常见的做法。 您需要在对象或存储过程中处理您的业务逻辑,然后将结果/结果集返回到表示层。 通常,您需要将结果集返回给客户端,以便表示层可以处理结果集(例如:转换为 XML,显示结果)。 当表示层正在进行处理时,最好将其与 SQL Server 断开连接,以节省数据库资源(例如:断开连接的 recordset)。

实现细节

首先,您必须配置 Visual C++ 以使用平台 SDK。 从“工具”菜单中选择“选项”。 单击“目录”选项卡。

  • 为 Platform SDK 包含目录添加一个条目(例如:c:\platform sdk\include
  • 为 ATL 3.0 包含目录添加一个条目(例如:c:\platform sdk\include\atl30
  • 为 Platform SDK 的库目录添加一个条目(例如:c:\platform sdk\lib
  • 为 Platform SDK 的 Bin 目录添加一个条目(例如:c:\platform sdk\bin)(确保这些条目在列表中的最前面)

接下来,您必须配置您的项目以使用 ADO。 在 Visual C++ 中使用 ADO 的最简单方法是使用本机 COM 支持来导入 ADO 类型库,并为 ADO 库中的对象生成智能指针包装类:RecordsetConnectionCommand 等。 将以下 #import 语句添加到您的项目的 stdafx.h 文件中

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "adoEOF") 

这假设您的 msado15.dll 位于 c:\Program Files\Common Files\System\ADO\msado15.dll。 创建一个方法到接口。

方法名称GetEmployeeList

参数[out, retval] _Recordset **returnvalue

STDMETHODIMP CAdoRec::GetEmployeeList(_Recordset **returnvalue)
  {
  _ConnectionPtr pConnection = NULL;
  _CommandPtr pCommand = NULL;
  _RecordsetPtr pRecordset = NULL;
 _bstr_t sql("select lastname,firstname,employeeid from employees");

  try
  {
  pConnection.CreateInstance(__uuidof(Connection));
  pConnection->Open(CONNECTION_STRING,"","",-1);
  pRecordset.CreateInstance(__uuidof(Recordset));
  pRecordset->CursorLocation=adUseClient;
  pRecordset->Open(sql,pConnection.GetInterfacePtr(), 
    adOpenStatic,adLockBatchOptimistic,-1);  
  pRecordset->AddRef();
  *returnvalue = pRecordset;
  pRecordset->putref_ActiveConnection(NULL);
  }
  catch(_com_error err)
  {
    pConnection->Close();
  }  

   pConnection->Close();
   return S_OK;
}

您必须添加对 recordset 的引用,然后返回它。 之后,您将 recordset 与数据库连接断开连接。 您可以修改代码以调用存储过程。

您还必须将 ADO 类型库导入到您的 IDL 文件中。 使用如下所示的 importlib

  import "oaidl.idl";
  import "ocidl.idl";
  [
  uuid(AAC8075D-21AD-46B2-A1BE-9777DE78B4DC),
  version(1.0),
  helpstring("ADOrecordset 1.0 Type Library")
  ]
  library ADORECORDSETLib
  {
  importlib("stdole32.tlb");
  importlib("stdole2.tlb");
  importlib("c:\Program Files\Common Files\System\ADO\msado15.dll");	 
 [
  uuid(DB761CAF-9C4A-42ED-9654-F963552F3FA4),
  helpstring("AdoRec Class")
  ]
  coclass AdoRec
  {
  [default] interface IAdoRec;
  };
  [
  object,
  uuid(E086C0B9-52EC-4F45-AE9D-03BB9CA5FE84),
  dual,
  helpstring("IAdoRec Interface"),
  pointer_default(unique)
  ]
  interface IAdoRec : IDispatch
  {
  [id(1), helpstring("method GetEmployeeList")] 
    HRESULT GetEmployeeList([out, 
    retval] _Recordset **returnvalue);
  };
  };

这就是您可以调用 GetEmployeeList 方法来将断开连接的 recordset 返回到 ASP 的方式。 请注意,objPagingRS 是断开连接的 recordset。 您可以像操作普通的 recordset 一样操作它。 为了说明目的,我只是在 ASP 页面上呈现 recordset 的第一个字段。

<%
  set fbn=server.CreateObject("adorecordset.adorec")
  set objPagingRS=fbn.GetEmployeeList()
  set fbn=nothing
  do while Not objPagingRS.EOF
  Response.Write "<BR>" + cstr(objPagingRS.Fields(1)) + vbCrLf
  objPagingRS.MoveNext
  loop
  objPagingRS.Close
  Set objPagingRS = Nothing
  %>
© . All rights reserved.