如何在ATL编写COM组件时调用ADO 我在用ATL编写COM组件,需要把ADO的功能集成进来,访问数据库,如何做?或者有其他的方法实现。比如说,我要实现几个接口,1、返回指定表名称的数据库Column信息(列明、数据类型).2、能按条件输出行,并能通过com组件添加新纪录及修改纪录。 请赐教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 最简单的办法:#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")实在是太多了,你到MSDN里面查吧:) _variant_t vNull(DISP_E_PARAMNOTFOUND,VT_ERROR);//打开指定表recordset->PutRefActiveConnection(activeConnection);recordset->PutSource(sql);//一个sql字符串recordset->CacheSize=1000;try{recordset->Open(vNull,vNull,adOpenDynamic,adLockOptimistic,adCmdText);}catch( _com_error e){ _variant_t error(e.Description());}在stdafx.h里面要象楼上的那样添加如果要在idl里面使用ado的对象,就还要在idl里面添加importlib("c:\Program Files\Common Files\System\ado\msado15.dll"); 自己拼装SQL语句来做,想怎么查,就怎么查!如果查询处理很复杂的话,可以用存储过程或者触发器来做。 如果用ADO,你就不如在VB里面用。ADO简直就是量身为VB那些自动化服务器打造的。如果你用ATL,为什么不用OLE DB呢? 服务器STDMETHODIMP CGetCurrData::ReadData(BSTR name, BSTR pwd, BSTR dsn, BSTR sel, BSTR sel_table, BSTR sel_from, BSTR sel_where, int sign, IDispatch **pRS){ AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here _bstr_t temp; _bstr_t strSQL; if(sign==0) { strSQL=sel; } else { temp="SELECT "; temp+=sel_table; temp+=" FROM "; temp+=sel_from; if(sel_where==L"") { temp+=" WHERE "; temp+=sel_where; } strSQL=temp; } HRESULT hr; _RecordsetPtr pORS; _ConnectionPtr pConn; try{ pConn.CreateInstance(__uuidof(Connection)); pORS.CreateInstance(__uuidof(Recordset)); hr=pConn->Open(dsn,name,pwd,-1); if(FAILED(hr)) _com_raise_error (hr); pORS->CursorLocation = adUseClient; pORS->Open(_variant_t(strSQL),(IDispatch*)pConn,adOpenStatic, adLockReadOnly,adCmdText); if (FAILED(hr)) _com_raise_error (hr); }catch(_com_error &e) { if (m_spObjectContext != NULL) m_spObjectContext->SetAbort(); return e.Error(); }// pORS->putref_ActiveConnection(NULL); *pRS=(IDispatch *)pORS.Detach(); if (m_spObjectContext != NULL) m_spObjectContext->SetComplete(); return S_OK;}客户端 try{ // Convert Management_name to Management_id IGetCurrDataPtr pGMS; hr=pGMS.CreateInstance(CLSID_GetCurrData); if(FAILED(hr)) _com_raise_error (hr); pORS = pGMS->ReadData(name,pwd,dsn,strSQL,L"",L"",L"",0); if(pORS->EndOfFile==VARIANT_FALSE) { vName=pORS->Fields->GetItem("MANAGEMENT_ID")->Value; } }catch(_com_error &e) //end try { if (m_spObjectContext != NULL) m_spObjectContext->SetAbort(); AfxMessageBox(e.Description()); return e.Error(); }stdafx.h#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \ named_guids no_namespace rename ("EOF", "EndOfFile")#import "e:\baobiao\dbsel\dbsel.tlb" named_guids no_namespace VS2008添加CWgraph控件 CDHtmlDialog类的问题 [VS保存和编译问题] 总是出现“另一个程序正在使用此文件,进程无法访问” 跟踪调试时遇到这样的错误,如何纠错? 每个文件夹下有 if(Name != "." && Name != "..")这两个文件夹,用来干吗的? 简单的互斥量问题 如何手动打开文件??? 请问那位大哥知道硬盘FAT中的逻辑地址怎么和物理地址对应的? 鼠标钩子获取点击菜单 关于操作系统中断! 该死的静态连接,该死的MFC,帮帮我! 求助:谁有截取网页上密码输入框程序的源码?急需!!!
//打开指定表
recordset->PutRefActiveConnection(activeConnection);
recordset->PutSource(sql);//一个sql字符串
recordset->CacheSize=1000;
try
{
recordset->Open(vNull,vNull,adOpenDynamic,adLockOptimistic,adCmdText);
}
catch( _com_error e)
{
_variant_t error(e.Description());
}
在stdafx.h里面要象楼上的那样添加
如果要在idl里面使用ado的对象,就还要在idl里面添加
importlib("c:\Program Files\Common Files\System\ado\msado15.dll");
如果查询处理很复杂的话,可以用存储过程或者触发器来做。
如果你用ATL,为什么不用OLE DB呢?
STDMETHODIMP CGetCurrData::ReadData(BSTR name, BSTR pwd, BSTR dsn,
BSTR sel, BSTR sel_table, BSTR sel_from,
BSTR sel_where, int sign, IDispatch **pRS)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
_bstr_t temp;
_bstr_t strSQL;
if(sign==0)
{
strSQL=sel;
}
else
{
temp="SELECT ";
temp+=sel_table;
temp+=" FROM ";
temp+=sel_from;
if(sel_where==L"")
{
temp+=" WHERE ";
temp+=sel_where;
}
strSQL=temp;
}
HRESULT hr;
_RecordsetPtr pORS;
_ConnectionPtr pConn; try{ pConn.CreateInstance(__uuidof(Connection)); pORS.CreateInstance(__uuidof(Recordset)); hr=pConn->Open(dsn,name,pwd,-1);
if(FAILED(hr)) _com_raise_error (hr);
pORS->CursorLocation = adUseClient;
pORS->Open(_variant_t(strSQL),(IDispatch*)pConn,adOpenStatic,
adLockReadOnly,adCmdText);
if (FAILED(hr)) _com_raise_error (hr); }catch(_com_error &e)
{
if (m_spObjectContext != NULL) m_spObjectContext->SetAbort();
return e.Error();
}
// pORS->putref_ActiveConnection(NULL);
*pRS=(IDispatch *)pORS.Detach();
if (m_spObjectContext != NULL) m_spObjectContext->SetComplete();
return S_OK;
}客户端
try{
// Convert Management_name to Management_id
IGetCurrDataPtr pGMS;
hr=pGMS.CreateInstance(CLSID_GetCurrData);
if(FAILED(hr)) _com_raise_error (hr);
pORS = pGMS->ReadData(name,pwd,dsn,strSQL,L"",L"",L"",0);
if(pORS->EndOfFile==VARIANT_FALSE)
{
vName=pORS->Fields->GetItem("MANAGEMENT_ID")->Value;
}
}catch(_com_error &e) //end try
{
if (m_spObjectContext != NULL) m_spObjectContext->SetAbort();
AfxMessageBox(e.Description());
return e.Error();
}stdafx.h
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
named_guids no_namespace rename ("EOF", "EndOfFile")
#import "e:\baobiao\dbsel\dbsel.tlb" named_guids no_namespace