📄 subject_39942.htm
字号:
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:FirstHoward 回复日期:2003-05-27 11:32:36
<br>内容://****************************server****************************************<BR>STDMETHODIMP CPriseMTSObject::GetReturnedQuery(long QuerySolution, BSTR QueryStr, IUnknown **ppUn)<BR>{<BR> HRESULT hErr = NULL;<BR><BR> TraceError(_T("Begin the function\n"));<BR><BR> <BR> if(m_pConnection == NULL)<BR> {<BR> TraceError(_T("No ConnectionPtr defined! Cancel the called function\n"));<BR> *ppUn = NULL;<BR> return S_FALSE;<BR> }<BR><BR> if(!m_pConnection->State)<BR> {<BR> TraceError(_T("Database not opened! Cancel the called function\n"));<BR> *ppUn = NULL;<BR> return S_FALSE;<BR> }<BR><BR> if(m_pRecordset == NULL)<BR> {<BR> TraceError("Creating RecordsetPtr\n");<BR> hErr = m_pRecordset.CreateInstance(__uuidof(Recordset)); <BR> if(FAILED(hErr))<BR> {<BR> TraceError(_T("Create RecordsetPtr Error!\n"));<BR> *ppUn = NULL;<BR> return hErr;<BR> }<BR> }<BR><BR> switch(QuerySolution)<BR> {<BR> case 0: <BR> try<BR> {<BR> m_pRecordset->CursorLocation = adUseClient;<BR><BR> m_pRecordset->Open( _variant_t ((_bstr_t) QueryStr),<BR> _variant_t ((IDispatch *) m_pConnection),<BR> adOpenKeyset,<BR> adLockOptimistic,<BR> adCmdText<BR> );<BR> //commit<BR> m_spObjectContext->SetComplete(); <BR><BR> m_pRecordset->put_ActiveConnection(vtMissing); //a disconnected recordset<BR> //clone<BR> _RecordsetPtr pRecordSetClone = m_pRecordset->Clone(adLockOptimistic);<BR> //close ori recordset m_pRecordset->Close();<BR> m_pRecordset.Release();<BR> <BR> //return <BR> *ppUn = (IUnknown *) pRecordSetClone.Detach();<BR> TraceError(_T("&Otilde;&yacute;&sup3;&pound;·&micro;&raquo;&Oslash;\n"));<BR> }<BR> catch(_com_error & err)<BR> {<BR> _bstr_t bString = err.Description();<BR> TraceError((TCHAR*) _com_util::ConvertBSTRToString((BSTR) bString)); <BR> TraceError(_T("&Ograve;ì&sup3;&pound;·&micro;&raquo;&Oslash;\n"));<BR> *ppUn = NULL;<BR> m_spObjectContext->SetAbort(); <BR> return S_FALSE;<BR> }<BR><BR> break;<BR> case 1: <BR>...<BR><BR>//*******************client(this is a thread)***********************************<BR>DWORD WINAPI DealwithMultiCom(LPVOID lpParam)<BR>{<BR> ::CoInitialize(NULL); <BR> <BR> IPriseMTSObject *pDBAObject = NULL;<BR> _RecordsetPtr m_pRecordset;<BR><BR> HRESULT hErr = ::CoCreateInstance(<BR> CLSID_PriseMTSObject,<BR> NULL,<BR> CLSCTX_SERVER,<BR> IID_IPriseMTSObject,<BR> (void **) &pDBAObject);<BR> if(FAILED(hErr)) <BR> {<BR> AddItemToList(_T("Error1!"));<BR> ::CoUninitialize(); <BR> return -1;<BR> }<BR><BR> hErr = m_pRecordset.CreateInstance(__uuidof(Recordset)); <BR> IUnknown *pUn = (IUnknown*) m_pRecordset.Detach(); if(!FAILED(hErr))<BR> {<BR> BSTR sqlstr = SysAllocString(L"select tablespace_name from dba_free_space");<BR> hErr = pDBAObject->GetReturnedQuery(<BR> 0L,<BR> sqlstr,<BR> &pUn);<BR> SysFreeString(sqlstr);<BR> if(FAILED(hErr))<BR> {<BR> pDBAObject->Release();<BR> AddItemToList(_T("Error2!"));<BR> ::CoUninitialize(); <BR> return -1;<BR> }<BR><BR> if(pUn!=NULL)<BR> {<BR> m_pRecordset.Attach((_Recordset *) pUn); <BR><BR> _variant_t theValue;<BR> if(m_pRecordset)<BR> {<BR> m_pRecordset->MoveFirst();<BR> m_pRecordset->get_Collect(_variant_t (long(0)), &theValue); //get a value<BR> AddItemToList(_T("Okey!!!"));<BR> AddItemToList((TCHAR *) _com_util::ConvertBSTRToString((BSTR) ((_bstr_t) theValue)));<BR> m_pRecordset->Close(); <BR> m_pRecordset.Release();<BR> }<BR> }<BR> }<BR><BR><BR> pDBAObject->Release(); //close the COM object<BR> ::CoUninitialize(); <BR><BR> return 0;<BR>}<BR><BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:笑笑生 回复日期:2003-05-27 15:10:10
<br>内容:真是太感谢你了,现在终于可以传到客户端了。以前按你第一次告诉我的方法不能Clone和传递的最大的问题可能是我没有设服务器端Recordset的CursorLocation,开始按你第三次告诉我的方法,一Clone就出错,后来发现你的代码里有m_pRecordset->CursorLocation = adUseClient,加上这句后就可以了。真是太感谢你了。!!!!!!<BR>另外还有一个事想向你请教,我在msdn上看过一篇文章《Much ADO About Something - or Other》,上面介绍的使用ADO的方法,不是#import msado15.dll,而是#include adoid.h和<BR>#include adoint.h,好像还用到了adoid.lib文件。不知道#import方法和#include方法有什么区别?如果机器上没有msado15.dll文件(由于某种原因不想安装他),那么用#include方法编写的程序还能不能正常运行?还有,#include方法中,用智能指针时的m_pRecordset.CreateInstance()方法,在没有注册表信息,没有msado15.dll情况下能否正常运行?如果要求客户端无msado15.dll文件,但想用ado连数据库,并在客户端用DataGrid控件,不知有什么好方法?因为感觉客户端程序使用DataGrid控件时,使用者在编辑查询结果是很方便,可以直接在控件上单击编辑,而ListCtrl控件似乎做不到这一点,所以想在客户端使用DataGrid控件。但如果客户端没有Recordset类型,似乎又用不了DataGrid控件。使用#include方法,表面上似乎没有用到msado15.dll文件,但在m_pRecordset.CreateInstance()方法执行时,以及以后m_pRecordset->MoveFirst()等一系列方法的执行时,是否用到msado15.dll文件,也不太清楚。我现在只有xp系统,xp系统里的msado15.dll文件有删不掉,没办法做测试。不知道你对此是否了解?<BR>如果无msado15.dll文件,客户端就不能用Recordset类型,想实现服务器端用ado连接数据库,客户端使用DataGrid控件,有没有什么好建议?<BR>再次谢谢你的帮助!!!!希望以后你不吝赐教!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:FirstHoward 回复日期:2003-05-27 16:34:23
<br>内容:#include 方法是你要使用 "在安装VC6的时候,VC给你提供的ado库文件,包括*.h和*.lib文件"。这样操作ADO的时候,完全是按照VC提供出来的指针操作的。但是在这种方法下,你不能定义_RecordsetPtr指针了,要定义ADORecordset,并且指针的获得要采用::CreateInstance(CLSID_Recordset, , , ,)方法,而不是.CreateInstnce(__uuidof())方法了。<BR>另外,由于.h文件和.lib文件产生于你安装VC的时候,所以应该不会兼容最新的msado15.dll文件,后者可能会有最新的函数。我想后来的VC补丁应该会有相应的update的。<BR><BR>#import是根据你目前机器安装有的msado15.dll文件,生成相应的.tlb文件,那么以后程序里的指针都是从这个文件里得到的,或者说你是根据目前的.dll来操作的。<BR><BR>如果采用#include方法,因为.lib文件会被编译到你的.exe文件中,所以可以直接运行。<BR><BR>如果采用#import方法,我想client必须安装并且注册msado15.dll,因为::createinstance()函数是要访问注册表的,所以msado15.dll必须注册到register里。(光有这个文件不可以,这是COM访问的机制)<BR><BR>我有一个建议,你在组件管理器中,将你的COM和msado15.dll放在一个组里,然后对这个组打包,客户安装的时候不就什么都有了。(该方法我还没有实验过)<BR><BR>我记得网上有一篇文章,讲得是因为client的msado15.dll和他开发时使用的msado15.dll版本不一样,导致了一些错误的产生。所以我想,最好的办法还是将自己开发时使用的msado15.dll一起安装并注册到client上面,大家都省事。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:69662929 回复日期:2003-10-17 11:01:01
<br>内容:请问在VB中如何传递Recordset对象到客户端呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:中老 回复日期:2004-02-18 17:17:47
<br>内容:请问ASP中怎样调上述GetReturnedQuery方法?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -