描述:
上一个帖子边城浪子帮忙回复了,但我的问题还是没解决好,具体情况如下:
------------------------------
关于com组件有个返回recordset对象问题想请教一下
具体问题是这样的:
(1)首先,封装了一个名称DbConn的组件,实现数据库链接管理,执行sql语句并且
返回结果,其中一个接口如下:
// 接口:GetRecordset
// 作用:执行数据访问高层构建sql语句,返回Recordset对象
// 参数:strSql,高层构建sql语句
// 返回:Recordset/NULL
STDMETHODIMP CDbConn::GetRecordset(BSTR strSql, IDispatch **RS)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
_ConnectionPtr pCN;
_RecordsetPtr pRS;
_variant_t vtEmpty;
char chrsql[200];
HRESULT hr;
try
{
hr = pCN.CreateInstance(__uuidof(Connection));
//字符转化
if(SUCCEEDED(hr))
{
for(int i=0;strSql[i]!=0;i++)
{
chrsql[i] = (char)strSql[i];
}
chrsql[i] = 0;
hr = pCN->Open("DRIVER={MySQL ODBC 3.51
Driver};SERVER=localhost;DATABASE=test;UID=root;PWD=;","","",adModeUnknown);
pRS = pCN->Execute(chrsql,&vtEmpty,adCmdUnknown);
pRS->QueryInterface(IID_IDispatch,(void**)RS);
return S_OK;
}
}
catch(_com_error e)
{
return S_OK;
}
return S_OK;
}
此接口返回recordset对象,已经直接通过asp测试调用成功,现在问题如下:
我要中间设计一业务逻辑com组件,名称为DbAlert,提供给asp接口,根据上层asp业
务模块在这个com中构建数据库访问逻辑sql语句,处理返回recordset对象
此com组件DbAlert调用GetRecordset接口,获取recordset对象直接返回给asp,
或者处理获得的recordset后,返回某些数值给asp,请问这个组件怎么写??如何获得
recordset对象
访问底层com组件,把recordset传递给上一层,此接口程序如何写?谢谢了
我的MSN、Email:aliang.cn@gmail.com
解决方案1:
昨天你问的那个吧, 我的测试了, 很好
两个COM,
Inner -- COM, 内层实现. 访问Access 返回Recordser
Outer -- COM, 外层实现, 访问Inner 返回 Recordser ( 内部可以对 Recordset 进行操作,已经得到记录集)
调用1) MFC 对话框 工程, 调用 Outer, 返回记录集,并显示出来
调用2) ASP 脚本
-------------------------------------------------------------------
Inner: IDBConn接口实现
-------------------------------------------------------------------
STDMETHODIMP CDBCon::GetRecordset(BSTR strSQL, IDispatch **rset)
{
// TODO: Add your implementation code here
*rset = NULL;
_RecordsetPtr rs;
_ConnectionPtr conn;
if(FAILED(conn.CreateInstance("ADODB.Connection")))
{
return E_FAIL;
}
try
{
const char* connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\\XXX\\PHDebug.mdb";
conn->Open(connstr, "", "", adCreateNonCollection);
rs = conn->Execute(strSQL, NULL, adCmdText);
return rs->QueryInterface(IID_IDispatch, (void**)rset);
}
catch(_com_error& ce)
{
return ce.Error();
}
return S_OK;
}
------------------------------------------------------------------
Outer : IProc Interface
-------------------------------------------------------------------
#import "F:\MyProject\krh\test\atl\Record\Inner\Debug\Inner.DLL" no_namespace
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
/////////////////////////////////////////////////////////////////////////////
// CProc
STDMETHODIMP CProc::DoQuery(BSTR strSQL, IDispatch **pRS)
{
// TODO: Add your implementation code here
*pRS = NULL;
IDBConPtr db;
if(FAILED(db.CreateInstance("Inner.DBCon")))
{
return E_FAIL;
}
try
{
IDispatchPtr disp = db->GetRecordset(strSQL);
_RecordsetPtr rs(disp);
//p->Release();
if(rs->EndOfFile)
{
}
else
{
}
*pRS = disp.Detach();
}
catch(_com_error& ce)
{
return ce.Error();
}
return S_OK;
}
------------------------------------------------------------
MFC Dialog Caller (With COM Smart Point) :
-----------------------------------------------------------
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
#import "F:\MyProject\krh\test\atl\Record\Outer\Debug\Outer.dll" no_namespace
...
IProcPtr ptr;
if(SUCCEEDED(ptr.CreateInstance("Outer.Proc")))
{
try{
_RecordsetPtr p = ptr->DoQuery("SELECT * FROM t_user");
//p->Release();
while(!p->EndOfFile)
{
AfxMessageBox((_bstr_t)p->GetCollect("uid"));
p->MoveNext();
}
}
catch(_com_error& ce)
{
long e = ce.Error();
AfxMessageBox(CString("ERROR : ") + (const char*)(_bstr_t)_variant_t(e));
}
---------------------------------------------------------
ASP Script Caller :
-----------------------------------------------------------
<%
set obj = Server.CreateObject("Outer.Proc")
set rst = obj.DoQuery("SELECT * from t_user")
response.Write "<table border=1 bordercolor=red><tr><td> user ID</td><td> name
</td></tr>"
do while not rst.EOF
response.Write "<tr><td>" + rst.Collect("uid") + "</td><td>"+
rst.Collect("name")+"</td></tr>"
rst.MoveNext
loop
response.Write "</table>"
set rst = nothing
%>