[问题][ADO][command + recordset遇到的问题]

苦逼热狗

路边通讯社社长
VIP
注册
2002-10-12
消息
47,114
荣誉分数
2,376
声望点数
393
代码:
void CheckPassword()
{	
	/*
	CREATE PROCEDURE [dbo].[ap_GetPwd]  @account varchar(14), @pwd binary(16) output
	AS
	SELECT @pwd=password FROM user_login with (nolock) WHERE account=@account

	GO
	*/
	BYTE *buf;
	SAFEARRAY *psa;
	SAFEARRAYBOUND rgsabound[1];

	_variant_t pPwd;
	HRESULT hr;
	ADODB::_CommandPtr pCmd;
	ADODB::_RecordsetPtr pRecordset;
	ADODB::_ParameterPtr pAccount;
	ADODB::_ParameterPtr pPassword;

	try{
	pCmd.CreateInstance( __uuidof( ADODB::Command ) );
	buf = (BYTE *)GlobalAlloc(GMEM_ZEROINIT, 16);	
	rgsabound[0].cElements = 16; 
	rgsabound[0].lLbound = 0;
	psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
	SafeArrayAccessData(psa, (void **)&buf);
	RtlZeroMemory(buf, 16); 
	SafeArrayUnaccessData(psa);
	pPwd.vt = VT_ARRAY | VT_UI1;
	pPwd.parray = psa;

	pCmd->ActiveConnection = pConn;
	pCmd->CommandText = _bstr_t("{call ap_GetPwd(?,?)}"); 
	pCmd->CommandType = ADODB::adCmdText;
	
	pRecordset.CreateInstance ( __uuidof ( ADODB::Recordset ) );
	pAccount = pCmd->CreateParameter( _bstr_t ("@account"), 
										ADODB::adVarChar, 
										ADODB::adParamInput, 
										14, 
										_bstr_t ("torune"));//强制给一个,我暂时做测试
	pCmd->Parameters->Append( pAccount );
	pPassword = pCmd->CreateParameter( _bstr_t ("@pwd"),
										ADODB::adBinary,
										ADODB::adParamOutput,
										16,
										pPwd);
	pCmd->Parameters->Append( pPassword );
[color=blue]
//替换为这个代码也不行
	pRecordset->Open((IDispatch *) pCmd, vtMissing, 
					ADODB::adOpenForwardOnly,
					ADODB::adLockReadOnly, 
					ADODB::adCmdText);

[/color]
[color=green]
	pRecordset = pCmd->Execute(NULL, NULL, ADODB::adCmdText);
[/color]
[color=red]	if (!pRecordset->GetADOEOF())[/color][b] //出错的地方[/b]
	{
		printf("found\n");
	}
	else
	{
		printf("not found\n");
	}
	}catch(_com_error &e)
	{
		_bstr_t bstrSource(e.Source());
		_bstr_t bstrDescription(e.Description());
		printf("\nCOM error occurred, Source : %s \n Description : %s \n",
		(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
	}
}

/////////////////////
//SQL Log
/////////////////////
declare @P1 binary(16)
set @P1=0x3179AB922F22AE5C69F0D6D61B81A7A7
exec ap_GetPwd 'torune', @P1 output
select @P1
/////////////////////

可是,我得到的错误信息确是:
COM error occurred, Source : ADODB.Recordset
Description : Operation is not allowed when the object is closed.

我没有close我的pRecordset啊
编译环境:VC++6
:thanks:
 
后退
顶部