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






4.50/5 (2投票s)
一篇关于如何使用 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 库中的对象生成智能指针包装类:Recordset
、Connection
、Command
等。 将以下 #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
%>