急!!大家帮帮我
我的存储过程返回结果集,在查询分析器里运行正常,可是用vc调用存储过程,当运行到“if(!prs->getadoeof())”时,总是提示:"对象关闭时,操作不被允许!"错在哪里呀,求大家帮帮我。
vc调用过程如下:
_commandptr m_pcommand;
m_pcommand.createinstance(__uuidof(command));
_parameterptr param;
param = m_pcommand->createparameter("",advarchar,adparaminput,m_scontractno.getlength()+1,_variant_t(m_scontractno));
m_pcommand->parameters->append(param);
m_pcommand->parameters->refresh();
m_pcommand->commandtext=_bstr_t("get_report");//存储过程的名称
m_pcommand->activeconnection = theapp.m_pconn; //需要使用的ado连接
m_pcommand->commandtype=adcmdstoredproc;
_recordsetptr prs;
try
{
prs=m_pcommand->execute(null, null,adcmdstoredproc);
if(!prs->getadoeof())
{
prs->movefirst();
.....
}
m_pcommand.detach();
}
catch(_com_error &e)
......
推荐阅读
// sql server, stored procedure , command , recordset, input parameter, output parameter, returned recordset from stored procedure
//execute stored procedure , get returned value, output value, and returned recordset.
#include "stdafx.h"
#import "c:\progra~1\common~1\system\ado\msado15.dll" rename( "eof", "adoeof" )
struct initole
{
initole() { ::coinitialize(null); }
~initole() { ::couninitialize(); }
} _init_initole_;
void printprovidererror(adodb::_connectionptr pconnection);
int main(int argc, char* argv[])
{
printf("create a adparamreturnvalue for command object to get return value of stored procedure\n");
printf("reference :msdn---append and createparameter methods example (vc++)\n");
adodb::_connectionptr conn1;
adodb::_commandptr cmd1;
adodb::_recordsetptr rs1;
adodb::_parameterptr retparam= null;
adodb::_parameterptr inparam=null;
adodb::_parameterptr outparam=null;
_variant_t vtempty (disp_e_paramnotfound, vt_error);
_variant_t vtempty2 (disp_e_paramnotfound, vt_error);
_bstr_t bstrconnect( l"driver={sql server};server=cell;database=zhg;uid=sa;pwd=;" );
// the following stored procedure return 12345 int value
_bstr_t bstrcreate ( l"create proc sp_adotest( @outparam int output,@inparam int ) "
l"as "
l"select @outparam = @inparam + 10 "
l"select * from table1"
l"return 12345" );
_bstr_t bstrsp(l"sp_adotest" );
try
{
_bstr_t bstrempty;
conn1.createinstance( __uuidof( adodb::connection ) );
cmd1.createinstance( __uuidof( adodb::command ) );
rs1.createinstance(__uuidof(adodb::recordset));
// establish connection.
conn1->connectionstring = bstrconnect;
conn1->open( bstrconnect, bstrempty, bstrempty, -1 );
// open recordset.
cmd1->activeconnection = conn1;
cmd1->commandtext = bstrsp;
cmd1->commandtype = adodb::adcmdstoredproc;
retparam=cmd1->createparameter(_bstr_t("return"),adodb::adinteger,adodb::adparamreturnvalue,sizeof(int));
cmd1->parameters->append(retparam);
outparam = cmd1->createparameter(_bstr_t("outparam"),adodb::adinteger,adodb::adparamoutput,sizeof(int));
cmd1->parameters->append(outparam);
inparam = cmd1->createparameter(_bstr_t("inparam"),adodb::adinteger,adodb::adparaminput,sizeof(int),_variant_t( (long) 10 ));
inparam->value=_variant_t( (long) 10 );
cmd1->parameters->append(inparam);
cmd1->parameters->refresh();
cmd1->parameters->item[ _variant_t( _bstr_t("@inparam") ) ]->value =_variant_t( (long) 11 );
rs1->put_cursorlocation(adodb::aduseclient);
rs1->open((_variant_t((idispatch *) cmd1)),vtempty,adodb::adopenstatic,
adodb::adlockreadonly, -1);
// get return value of the stored procedure.adcmdunknown
tchar tcbuf[1024];
long retvalue=cmd1->parameters->item[(short)0]->value;
long p2=cmd1->parameters->item[(short)1]->value;
long p3=cmd1->parameters->item[(short)2]->value;
int recordcount=0;
if(rs1->state==adodb::adstateclosed)
messagebox(null,"no recordset is returned from the stored procedure","information",mb_ok);
else
recordcount = rs1->getrecordcount();
wsprintf(tcbuf,"retvalue of the stored procedure:%d,input value:%d,output value:%d,record count :%d",retvalue,p2,p3,recordcount);
messagebox(null,tcbuf,"output",mb_ok);
}
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);
printprovidererror(conn1);
}
return 0;
}
void printprovidererror(adodb::_connectionptr pconnection)
{
// print provider errors from connection object.
// perr is a record object in the connections error collection.
adodb::errorptr perr = null;
long ncount = 0;
long i = 0;
if( (pconnection->errors->count) > 0)
{
ncount = pconnection->errors->count;
// collection ranges from 0 to ncount -1.
for(i = 0; i < ncount; i++)
{
perr = pconnection->errors->getitem(i);
printf("\n\t error number: %x\t%s", perr->number, (lpcstr)perr->description);
}
}
}


讨论区