我用的是COM提供的API来操作ADO ,可是不知道怎么得到记录集的值。望高手帮忙。
我急着用,哪位解决了我再开一贴给100分.
HRESULT hr = S_OK;
ADORecordset *pRs1 = NULL;
ADOConnection *pConn1;
VARIANT Source;
VARIANT Connect;
VARIANT adoConn1;
VariantInit( &Source );
VariantInit( &Connect );
VariantInit( &adoConn1 );
adoConn1.vt = VT_BSTR;
adoConn1.bstrVal = SysAllocString( L"pConn1");
Source.vt = VT_BSTR;
Source.bstrVal = SysAllocString( L"SELECT count(*) FROM Customers");
Connect.vt = VT_BSTR;
Connect.bstrVal = SysAllocString( L"Provider=SQLOLEDB;Server=ZYQ;Database=Northwind;UID=sa;PWD=19781130;");
if FAILED(hr = CoInitialize (NULL))//初始化COM
{
MessageBox (hWnd, _TEXT("CoInitialize Failed"), _TEXT("Error"), MB_OK);
return FALSE;
}
hr=CoCreateInstance( CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,IID_IADOConnection, (LPVOID *) &pConn1 );
hr=pConn1->Open(Connect.bstrVal,NULL,NULL,adConnectUnspecified);
hr = CoCreateInstance( CLSID_CADORecordset,NULL,CLSCTX_INPROC_SERVER,IID_IADORecordset, (LPVOID *) &pRs1 );
if( SUCCEEDED( hr ) )
//hr = pRs1->Open(Source,adoConn1,adOpenForwardOnly,adLockReadOnly,adCmdText );
hr=pConn1->Execute(Source.bstrVal,NULL,adCmdText, &pRs1);
/** 上面的代码都可以正常运行,hr都为0 **/
long aaa=0;
hr=pRs1->MoveFirst();
hr=pRs1->get_RecordCount(&aaa);
/**上面这句hr也为0,可aaa=-1,这是为什么呀?肯定应该有接果呀。**/
//hr=pRs1->GetRows(1,Connect,adoConn1,&Source);
/**上面这句 GetRows()函数的参数是怎么用的,我怎么也得不到结果。如果这样调用不对,那怎么样才能得到正确结果呢?**/
//MessageBoxW (hWnd, Source.bstrVal, L"Error", MB_OK);
我急着用,哪位解决了我再开一贴给100分.
HRESULT hr = S_OK;
ADORecordset *pRs1 = NULL;
ADOConnection *pConn1;
VARIANT Source;
VARIANT Connect;
VARIANT adoConn1;
VariantInit( &Source );
VariantInit( &Connect );
VariantInit( &adoConn1 );
adoConn1.vt = VT_BSTR;
adoConn1.bstrVal = SysAllocString( L"pConn1");
Source.vt = VT_BSTR;
Source.bstrVal = SysAllocString( L"SELECT count(*) FROM Customers");
Connect.vt = VT_BSTR;
Connect.bstrVal = SysAllocString( L"Provider=SQLOLEDB;Server=ZYQ;Database=Northwind;UID=sa;PWD=19781130;");
if FAILED(hr = CoInitialize (NULL))//初始化COM
{
MessageBox (hWnd, _TEXT("CoInitialize Failed"), _TEXT("Error"), MB_OK);
return FALSE;
}
hr=CoCreateInstance( CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,IID_IADOConnection, (LPVOID *) &pConn1 );
hr=pConn1->Open(Connect.bstrVal,NULL,NULL,adConnectUnspecified);
hr = CoCreateInstance( CLSID_CADORecordset,NULL,CLSCTX_INPROC_SERVER,IID_IADORecordset, (LPVOID *) &pRs1 );
if( SUCCEEDED( hr ) )
//hr = pRs1->Open(Source,adoConn1,adOpenForwardOnly,adLockReadOnly,adCmdText );
hr=pConn1->Execute(Source.bstrVal,NULL,adCmdText, &pRs1);
/** 上面的代码都可以正常运行,hr都为0 **/
long aaa=0;
hr=pRs1->MoveFirst();
hr=pRs1->get_RecordCount(&aaa);
/**上面这句hr也为0,可aaa=-1,这是为什么呀?肯定应该有接果呀。**/
//hr=pRs1->GetRows(1,Connect,adoConn1,&Source);
/**上面这句 GetRows()函数的参数是怎么用的,我怎么也得不到结果。如果这样调用不对,那怎么样才能得到正确结果呢?**/
//MessageBoxW (hWnd, Source.bstrVal, L"Error", MB_OK);
解决方案 »
- 请高手帮忙看看这个C++运行错误
- 能不能自己发送一个wm_paint消息
- 给定一个值,怎么让Slider Control滑到相应的位置?
- socket连接的问题?
- 怎么样不用CSplitterWnd分割窗口?(请各位大佬多多帮忙)
- 为什么应用程序不可以在公网上使用
- CListCtrl(REPORT TYPE)控件中,每列的列头是什么控件,怎样改变该列列头中的文字颜色?--正确就结帖
- 如何解决同时使用CRuntime lib和MFC lib的冲突?
- 两个问题:IHTMLDocument3为什么不能用;如何利用IHTMLDocument2把TABLE中CELL解析出来
- vc++ dll中有回调函数。c#调用的问题。
- 如何在ATL工程中添加DHtml等ActiveX控件
- 怎么解决音频实时播放的时候,存在听到的声音滞后,延时问题?
pRsl->Cursorlocation=adUseClient;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetRows(
/* [defaultvalue][in] */ long Rows,
/* [optional][in] */ VARIANT Start,
/* [optional][in] */ VARIANT Fields,
/* [retval][out] */ VARIANT __RPC_FAR *pvar) = 0;
itemp = atol(_com_util::ConvertBSTRToString((_bstr_t)m_pRs->GetCollect("字段名"));
itemp = atol(_com_util::ConvertBSTRToString((_bstr_t)pRsl->GetCollect("字段名"));
1.stdafx.h中加入
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
2。app文件的InitInstance中加入
if(S_OK!=OleInitialize(NULL))
{
AfxMessageBox("初始化COM组件库错误");
}
下面就是数据库操作
_ConnectionPtr pConn;
_RecordsetPtr pRs;
CString strSQL;
pConn.CreateInstance(__uuidof(Connection));
pConn->CursorLocation=adUseClient;
strSQL="Provider=SQLOLEDB;Server=Gooyan;DataBase=SkillsBox;UID=sa;PWD=aaaaaaaa";
pConn->Open(_bstr_t(strSQL),"","",-1);
pRs.CreateInstance(__uuidof(Recordset));
pRs->CursorLocation=adUseClient;
pRs->PutActiveConnection(pConn.GetInterfacePtr());
pRs1.CreateInstance(__uuidof(Recordset));
pRs1->CursorLocation=adUseClient;
pRs1->PutActiveConnection(pConn.GetInterfacePtr()); strSQL="select * from catalog order by cataid";
pRs->Open(_bstr_t(strSQL),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText);
ATL作COM组件内使用数据库:
STDMETHODIMP COperatorM::SaveRsByJSBM(BSTR jsbm, _Recordset *pSaveRs)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()) // TODO: Add your implementation code here
_ConnectionPtr pConn;
_RecordsetPtr pRs;
_RecordsetPtr pDelRs;
_RecordsetPtr pUserRs;
_variant_t _vValue;
CString mkbm;
CString yhbm;
try
{
//修改一个角色的用户列表:需要删除原来的隶属于此角色的用户的权限
//删除用户列表,添加新的用户列表,添加新的用户权限
//MessageBox(NULL,"aa","succeed",MB_OK );
CString tempsql;
pConn.CreateInstance(__uuidof( Connection ) );
pConn->CursorLocation = adUseClient;
pConn->Open(dsn,"sa","",-1 );
pConn->BeginTrans();
pRs.CreateInstance(__uuidof( Recordset ) );
pRs->CursorLocation = adUseClient;
pRs->PutActiveConnection(pConn.GetInterfacePtr());
pUserRs.CreateInstance(__uuidof( Recordset ) );
pUserRs->CursorLocation = adUseClient;
pUserRs->PutActiveConnection(pConn.GetInterfacePtr()); pDelRs.CreateInstance(__uuidof( Recordset ) );
pDelRs->CursorLocation = adUseClient;
pDelRs->PutActiveConnection(pConn.GetInterfacePtr());
//删除隶属于此角色的用户的权限
//tempsql="select bm,mkbm from gy_qxb where bm='"+CString(jsbm)+"'";
tempsql.Format("select bm,mkbm from gy_qxb where yhbz='0' and bm='%s'",(char*)(_bstr_t)jsbm);
//MessageBox(NULL,"bb","succeed",MB_OK );
pRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
tempsql="select yhbm from gy_yhjs where jsbm='"+CString(jsbm)+"'";
pUserRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
//MessageBox(NULL,"OK","succeed",MB_OK );
while(!pRs->adoEOF)
{
//取出mkbm
_vValue=pRs->GetCollect("mkbm");
if(_vValue.vt!=VT_NULL)
{
_vValue.ChangeType(VT_BSTR);
mkbm=_vValue.bstrVal;
if(!pUserRs->adoEOF)
{
while(!pUserRs->adoEOF)
{
_vValue=pUserRs->GetCollect("yhbm");
if(_vValue.vt!=VT_NULL)
{
_vValue.ChangeType(VT_BSTR);
yhbm=_vValue.bstrVal;
tempsql="delete from gy_qxb where yhbz='1' and bm='"+yhbm+"' and mkbm='"+mkbm+"'";
pDelRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
}
pUserRs->MoveNext();
}
pUserRs->MoveFirst();
}
}
pRs->MoveNext();
}
//删除gy_yhjs表中的原有的角色用户列表
tempsql="delete from gy_yhjs where jsbm='" +CString(jsbm)+"'";
pRs->Close();
pRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
//添加新的用户列表
pSaveRs->PutActiveConnection(pConn.GetInterfacePtr());
pSaveRs->UpdateBatch(adAffectAll);
//M//essageBox(NULL,"OK","succeed",MB_OK );
//添加新的用户权限
tempsql="select mkbm from gy_qxb where yhbz='0' and bm='"+CString(jsbm)+"'";
pUserRs->Close();
pUserRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
if(!pSaveRs->adoEOF)
pSaveRs->MoveFirst();
while(!pSaveRs->adoEOF)
{
_vValue=pSaveRs->GetCollect("yhbm");
if(_vValue.vt!=VT_NULL)
{
_vValue.ChangeType(VT_BSTR);
yhbm=_vValue.bstrVal;
if(!pUserRs->adoEOF)
{
while(!pUserRs->adoEOF)
{
_vValue=pUserRs->GetCollect("mkbm");
if(_vValue.vt!=VT_NULL)
{
_vValue.ChangeType(VT_BSTR);
mkbm=_vValue.bstrVal;
tempsql="insert gy_qxb values('"+yhbm+"','"+mkbm+"','1')";
pRs ->Open(_bstr_t(tempsql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText );
}
pUserRs->MoveNext();
}
pUserRs->MoveFirst();
}
}
pSaveRs->MoveNext();
}
//MessageBox(NULL,"OK","succeed",MB_OK );
pRs ->PutRefActiveConnection( NULL );
pDelRs ->PutRefActiveConnection( NULL );
pSaveRs ->PutRefActiveConnection( NULL );
pUserRs ->PutRefActiveConnection( NULL );
// 关闭连接
if( pConn ->GetState() == adStateOpen )
{
pConn->CommitTrans ();
pConn ->Close();
}
pConn = NULL;
}
catch(_com_error &e)
{
pConn->RollbackTrans();
pConn->Close();
pConn=NULL;
return AtlReportError(CLSID_OperatorM,_com_util::ConvertBSTRToString(e.Description()),IID_IOperatorM,E_FAIL);
}
catch(...)
{
pConn->RollbackTrans();
pConn->Close();
pConn=NULL;
return AtlReportError(CLSID_OperatorM,"未知错误",IID_IOperatorM,E_FAIL); }
return S_OK;
}