我用atl 作了一个组件接口如下
interface Ijdjh : IDispatch
{[id(1), helpstring("method getrs")] HRESULT getrs([in] BSTR sql ,[out] BSTR* errmsg,[out] VARIANT_BOOL* ,[out,retval] IDispatch **rs);
};errmsg是错误信息为成功标志rs是返回的记录集
在vb调用组件正常!!但在asp中调用事出错!!
set rs = Server.CreateObject("adodb.recordset")
set zj=server.CreateObject ("JD_JDJH1.jdjh")
dim errmsg
dim
sql="select * from jd_qyyjh"
set RS=zj.getrs(sql,errmsg,)‘出错位置
Response.Write
Response.Write cstr(rs.RecordCount )
set RS=nothing
set zj=nothing
Response.end
但如果组件中去掉errmsg,的返回参数,asp调用就正常,请教各位事什么原因
interface Ijdjh : IDispatch
{[id(1), helpstring("method getrs")] HRESULT getrs([in] BSTR sql ,[out] BSTR* errmsg,[out] VARIANT_BOOL* ,[out,retval] IDispatch **rs);
};errmsg是错误信息为成功标志rs是返回的记录集
在vb调用组件正常!!但在asp中调用事出错!!
set rs = Server.CreateObject("adodb.recordset")
set zj=server.CreateObject ("JD_JDJH1.jdjh")
dim errmsg
dim
sql="select * from jd_qyyjh"
set RS=zj.getrs(sql,errmsg,)‘出错位置
Response.Write
Response.Write cstr(rs.RecordCount )
set RS=nothing
set zj=nothing
Response.end
但如果组件中去掉errmsg,的返回参数,asp调用就正常,请教各位事什么原因
dim
在asp里是变体,
你写的组件这两个参数也要是变体才行
interface Ijdjh : IDispatch
{[id(1), helpstring("method getrs")] HRESULT getrs([in] BSTR sql ,[out] VARIANT* errmsg,[out] VARIANT* ,[out,retval] IDispatch **rs);
};原因:
VBScript是弱类型语言,在VBScript中定义的变量都是Variant类型的。而C++是强类型语言,所以在接口中定义的输出参数的类型就必须是VARIANT类型的。
interface Igtwo : IDispatch
{[id(1), helpstring("method getrs")] HRESULT getrs([in] BSTR sql ,[out] VARIANT* errmsg,[out] VARIANT* ,[out,retval] IDispatch **rs);};
但在组件种写了
BSTR btt=::SysAllocString(L"OK");
_variant_t aa;
aa.vt=VT_BSTR;
aa.bstrVal =btt;
*errmsg=aa;_variant_t bb;
bb.vt=VT_BOOL;
bb.boolVal = VARIANT_TRUE;
*=bb;
在客户端为什么取不到errmsg,的值
interface Igtwo : IDispatch
{[id(1), helpstring("method getrs")] HRESULT getrs([in] BSTR sql ,[out] VARIANT* errmsg,[out] VARIANT* ,[out,retval] IDispatch **rs);};
在vb中调试正常,
asp 运行提示Active Server Pages, ASP 0115 (0x80004005)
外部对象中发生一个可捕捉的错误(E06D7363)。脚本无法继续执行。
如何处理,请各位给个提示,谢谢
如果你的接口定义保持现在这个样子,那么你在asp中调用应该是这样的:
set RS=zj.getrs("select * from jd_qyyjh", errmsg, )
错误类型:
(0x800703E6)
/workshopplan/qyjh/aa.asp, 第 16 行
16行:set rs=zj1.getrs("select * from jd_qyyjh", errmsg, )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
CConstr getconstr;
_ConnectionPtr m_pconnect;
_RecordsetPtr m_precordset;
HRESULT hr;
BSTR bconstr;
bconstr=getconstr.getconnstr ();
_variant_t m_;
m_.vt =VT_BOOL;
CComBSTR m_errmsg;
try{
hr=m_pconnect.CreateInstance ("ADODB.Connection");
}
catch(_com_error &e)
{
_bstr_t temp=e.Description() ;
m_errmsg=temp.copy ();
m_=VARIANT_FALSE;
*=m_;
*errmsg=(_variant_t)m_errmsg.Detach ();
return S_FALSE;
}
if (FAILED(hr))
{
m_=VARIANT_FALSE;
*=m_;
m_errmsg.Append ("建立数据库连接实例失败!");
*errmsg=(_variant_t)m_errmsg.Detach ();
return hr;
}
hr=m_pconnect->Open (bconstr,"","",adModeUnknown);
if (FAILED(hr))
{
m_=VARIANT_FALSE;
*=m_;
m_errmsg.Append ("连接数据库失败!");
*errmsg=(_variant_t)m_errmsg.Detach ();
return hr;
}
try{
hr=m_precordset.CreateInstance ("ADODB.Recordset");
}
catch(_com_error &e)
{
_bstr_t temp=e.Description() ;
m_errmsg.Append (temp.copy());
m_=VARIANT_FALSE;
*=m_;
*errmsg=(_variant_t)m_errmsg.Detach ();
return S_FALSE;
}
if (FAILED(hr))
{
m_=VARIANT_FALSE;
*=m_;
m_errmsg.Append ("建立数据库记录集实例失败!");
*errmsg=(_variant_t)m_errmsg.Detach ();
return hr;
}
m_precordset->CursorLocation = adUseClient;
m_precordset->Open (sql,(_variant_t)(IDispatch *)m_pconnect,adOpenStatic,adLockReadOnly,adCmdUnknown);
*rs=(IDispatch*)m_precordset.Detach ();
m_errmsg.Append ("数据库记录集返回成功!");
*errmsg=(_variant_t)m_errmsg.Detach ();
m_=VARIANT_TRUE;
*=m_; return S_OK;
}
在
*rs=(IDispatch*)m_precordset.Detach ();
之前加一句
m_precordset->putref_ActiveConnection(NULL);
在Recordset对象Open成功后,将Recordset对象与数据库之间的连接断开,有利于减轻服务器的负荷。也许能够解决刷新的问题。