用ADO调用存储过程
我的这个函数只能执行一次存储过程,可是第二次执行时就出错。请问原因
void test()
{CString sPhone="123",retMsg="您申请的业务代码不存在";
int Succ=0;
InsSysMsg("",sPhone,"xtxx","0",Succ,retMsg);
}
bool InsSysMsg(CString sPhone,CString dPhone,CString CodeId,CString LenFlag,int& Succ,CString Msg)
{
if(!AfxOleInit()){
::AfxMessageBox("Init OLE failed!");
return 0;
}
::CoInitialize(NULL);
try{
_ConnectionPtr pCnn(_uuidof(Connection));
_CommandPtr pCmd(_uuidof(Command));
pCnn->Open((_bstr_t)"DSN=test;UID=work;PWD=work;","","",-1);
pCmd->ActiveConnection=pCnn;
pCmd->CommandType=adCmdStoredProc;
pCmd->CommandText="MS_000_ins";
_ParameterPtr pParam;
_variant_t vMsg,vNewid;
vMsg.vt=VT_BSTR;
vMsg.bstrVal=(_bstr_t)Msg;
pParam=pCmd->CreateParameter(_bstr_t("Msg"),adBSTR,adParamInput,Msg.GetLength(),_variant_t(vMsg));
pCmd->Parameters->Append(pParam);
vNewid.vt=VT_I2;
pParam=pCmd->CreateParameter(_bstr_t("Newid"),adInteger,adParamOutput,sizeof(adInteger),_variant_t(vNewid));
pCmd->Parameters->Append(pParam);
pCmd->Execute(NULL,NULL,adCmdStoredProc);
_variant_t temp=pCmd->Parameters->Item["Newid"]->GetValue();
int i=temp.intVal;
::CoUninitialize();
return 1;
}
catch(_com_error e){
::CoUninitialize();
AfxMessageBox(e.ErrorMessage());
return 0;
}
}
问题点数:20、回复次数:7Top
1 楼LuoQS1((大水货))回复于 2001-07-03 18:06:12 得分 1
没释放连接吧Top
2 楼theSky(云霄)回复于 2001-07-03 18:07:09 得分 1
没有释放 pCnn,pCmdTop
3 楼serf(塞外雪)回复于 2001-07-03 18:19:34 得分 1
智能指针析构在::CoUninitialize()后,危险
Top
4 楼Acely(Acely)回复于 2001-07-04 09:18:55 得分 0
用什么语句释放Top
5 楼xwchena(天雨)回复于 2001-07-16 16:58:12 得分 6
pCmd->release();
pCnn->close();Top
6 楼mywater(在水一方)回复于 2001-07-16 23:22:15 得分 6
if(!AfxOleInit()){
//这个函数是不是只需要调用一次就行了???放在app中去!
::CoInitialize(NULL);
还有一种可能性,你的数据源只允许一个连接
如果是这样,你可以把pCnn拿到外面去,确保连接一次,或者每次用万就释放掉(这个最好,
OleDB会自动处理优化方面的问题)
Top
7 楼cafecai(入门新手㊣)回复于 2001-07-16 23:33:12 得分 5
AfxOleInit()只能运行一次,应该放在CYourClassApp::InitInstance()的前面,
在运行pCnn->Open前要确认pCnn已经关闭Top




