VC中如何返回Recordset到ASP中

LuoQS1 2002-05-08 01:32:59
VC中如何返回Recordset到ASP中,如果要在组件中串很多数据到ASP中显示,大家一般事如何做的,用字符串还是用Recordset或者用数组????.希望高手指点。本人在线恭候
...全文
42 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
LuoQS1 2002-05-09
  • 打赏
  • 举报
回复
谢谢white_whan(white):给分
tpProgramer 2002-05-09
  • 打赏
  • 举报
回复
下面是一个例子:

STDMETHODIMP CMemberData::Search(BSTR strLastName ,IDispatch ** pRS)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
_RecordsetPtr pRSMems;
try
{
_bstr_t strSQL;
strSQL = "Select * from Memebers";
//Now make a recordset that can be passed up to the asp page.
hr = pRSMems.CreateInstance(__uuidof(Recordset));
if(FAILED(hr))
_com_raise_error(hr);
hr = pRSMems->Open(strSQL, VS_CONNECT, adOpenstatic,
adLockReadOnly,adCmdText);
if(FAILED(hr))
_com_raise_error(hr);
}
catch(_comm_error &e)
{
return e.Error();
}
//Return the recordset to the asp page.
*pRS = (IDispatch *) pRSMems.Detach();
return S_OK;
}
white_whan 2002-05-09
  • 打赏
  • 举报
回复
直接使用IDispatch也是可以的。另外别忘了为它获得引用计数
similar99 2002-05-09
  • 打赏
  • 举报
回复
哦, 找到一些相关源码

接口定义中使用 VARIANT
返回 _variant_t((IDispatch*)pRs); //pRs 是 _RecordsetPtr 型
similar99 2002-05-09
  • 打赏
  • 举报
回复
试试看用IDispatch ** 代替 _Recordset ** ?
tpProgramer 2002-05-09
  • 打赏
  • 举报
回复
white_whan(white) 的方法是对的,我做过,可以的。这个idl文件已经和自动生成的不同了。

还有就是在接口函数返回的时候,要注意下面代码的最后返回部分:
_RecordsetPtr pRSMems;
try
{
_bstr_t strSQL;
strSQL = "Select * from Memebers";
//Now make a recordset that can be passed up to the asp page.
hr = pRSMems.CreateInstance(__uuidof(Recordset));
if(FAILED(hr))
_com_raise_error(hr);
hr = pRSMems->Open(strSQL, VS_CONNECT, adOpenstatic,
adLockReadOnly,adCmdText);
if(FAILED(hr))
_com_raise_error(hr);
}
catch(_comm_error &e)
{
return e.Error();
}
//Return the recordset to the asp page.
*pRS = (IDispatch *) pRSMems.Detach();
return S_OK;
white_whan 2002-05-09
  • 打赏
  • 举报
回复
另外需改写IDL文件如下(ODL):
import "oaidl.idl";
import "ocidl.idl";

[
uuid(41AC6B64-752C-48BB-981D-D9F02287D208),
version(1.0),
helpstring("idltest 1.0 Type Library")
]
library IDLTESTLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
importlib("D:\\Program Files\\Common Files\\System\\ado\\msado26.tlb");

[
object,
uuid(AEE096FB-6A07-4AED-9BC5-E9D0F63460FA),
dual,
helpstring("IADOCOM Interface"),
pointer_default(unique)
]
interface IADOCOM : IDispatch
{
[id(1), helpstring("method GetRecordset")] HRESULT GetRecordset(_Recordset**ppRS);
};

[
uuid(F7E38FC8-C5AA-4485-B7A6-0D9AA3CF7089),
helpstring("ADOCOM Class")
]
coclass ADOCOM
{
[default] interface IADOCOM;
};
};

将接口定义放入Library内即写成ODL文件格式。
waynebaby 2002-05-08
  • 打赏
  • 举报
回复
如果使用 ado 2.5以上,可以把 recordset 保存成为xml
然后返回 cstr 或者 bstr 到asp
然后用asp的rs 重新读取

我是做vb的,用vb代码就是这样

com里面:
dim st as new adodb.stream
rs.save st,(这里是存为xml的一个枚举类型,俺忘了咋写了)
dim strXML as string
strXML=st.read(st.acturasize)

这样返回得就是 xml字符串

以后,asp里面就可以用 rs读取xml了
asp里面
dim st
set st=createobject("adodb.stream")
st.open
st.write strXML

rs.open st

rs就出现在asp里面了

顺便说,这个rs是离线的。。。。对不起,俺只会离线的
有些记不得拼写。。。。大家原谅



LuoQS1 2002-05-08
  • 打赏
  • 举报
回复
先谢谢white_whan(white),我去试一下
white_whan 2002-05-08
  • 打赏
  • 举报
回复
我以前做过现在记不大清楚了。
在idl文件中使用:
importlib("C:\....\..\msado15.dll");
or
引入类型库文件tlb也可以。
要是不行的话,我回去查一下。
LuoQS1 2002-05-08
  • 打赏
  • 举报
回复
to white_whan(white):
不好意思,我还不知道如何在idl文件中引入_Recordset的声明。您能否详细说明一下,谢谢!
white_whan 2002-05-08
  • 打赏
  • 举报
回复
需要在idl文件中引入_Recordset的声明。
另外,返回rs时使用rs->QueryInterface(IID_IDispatch, (void*)&pDispath)返回IDispatch接口指针比较稳妥。
LuoQS1 2002-05-08
  • 打赏
  • 举报
回复
高手是不是都去赚钱去了????????
LuoQS1 2002-05-08
  • 打赏
  • 举报
回复
to freegoal(呵呵):
其实比较难的就是在接口定义文件中如果把_Recordset 作为接口定义的一个参数会出现编译错误。如下
[id(5), helpstring("method GetADORecordset")] HRESULT GetADORecordset([out, retval] _Recordset **ppRecordset);

出现如下的编译错误
syntax error : expecting a type specification near "_Recordset"

我现在头疼就是如何解决这个编译错误,我知道用VARIANT*是可以的但是他又出现一个我到现在也无法解决另一个问题
freegoal 2002-05-08
  • 打赏
  • 举报
回复
我这是用动态连接库的方式实现的,你可以用Com DLL实现:

extern "C" __declspec(dllexport) _Recordset * WINAPI GetRecordsetBySQL(const char* bstrSQL)
{
char cnstr[260] = { 0 };

try{
_RecordsetPtr sp_rs(_uuidof(Recordset));
_ConnectionPtr sp_con(_uuidof(Connection));

//sp_con->ConnectionString ="DRIVER={Microsoft Access Driver (*.mdb)};DBQ=adostudent.MDB;DefaultDir=C:\\;";
::strcpy(cnstr, "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
::strcat(cnstr, m_LocalDBPath);
sp_con->ConnectionString = cnstr;
// sp_con->ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=pubs;Data Source=ricka5;";
sp_con->CursorLocation = adUseClient;

sp_con->Open( "", "", "", -1 );

_variant_t vRows((short)0);

sp_rs = sp_con->Execute(bstrSQL, &vRows, adCmdText);
sp_rs->PutRefActiveConnection(NULL);// Disassociate the connection from the recordset.
sp_con->Close();
sp_rs->AddRef();

return sp_rs;
}
catch( _com_error &e){
cLogFile.LogFile("GetRecordsetBySQL: %s", e.ErrorMessage );
return NULL;
}

}
LuoQS1 2002-05-08
  • 打赏
  • 举报
回复
我去回答10个别人的技术问题后回来,希望有高手回答
qhq800 2002-05-08
  • 打赏
  • 举报
回复
关注
LuoQS1 2002-05-08
  • 打赏
  • 举报
回复
大家在开发中没有遇到类似的问题吗
LuoQS1 2002-05-08
  • 打赏
  • 举报
回复
希望高手指点???????????????????????????

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧