请高手解答:VC+ADO执行存储过程的一个古怪问题

goldntman 2004-04-02 11:34:49
以下是我用VC+ADO做的一个验证密码的函数
程序运行一段时间(一般大约14小时,不一定)后就产生了异常:报的错误为:
《未指定的错误》,把进程停调,重新运行,又正常了
(注:该函数由线程来调用)

int checkpwd(char* area,char* dhhm,char* pwd)
{
if(CoInitialize(NULL)!=S_OK)
{
::SendMessage(AfxGetMainWnd()->m_hWnd,WM_SHOWERROR,(WPARAM)"ADO Com库初始化失败",0);
return -1;
}

int ret=0;
CString str="0";
_ConnectionPtr m_pConnection;
_CommandPtr m_pCommand;
_ParameterPtr pRet=NULL;
_ParameterPtr pIn1=NULL;
_ParameterPtr pIn2=NULL;
_ParameterPtr pIn3=NULL;
_ParameterPtr pOut=NULL;
VARIANT vtret,vtin1,vtin2,vtin3,vtout;

try
{
m_pConnection.CreateInstance(_uuidof(Connection));
m_pConnection->Open("DSN=hfcx_checkpwd;uid=test;pwd=test","","",0);
m_pConnection->CursorLocation=adUseClient;

m_pCommand.CreateInstance(_uuidof(Command));
m_pCommand->ActiveConnection=m_pConnection;
m_pCommand->CommandText="ValidPwd_10000";
m_pCommand->CommandType=adCmdStoredProc;
m_pCommand->CommandTimeout=20;

vtret.vt=VT_I4;
pRet=m_pCommand->CreateParameter(_bstr_t("RETURN_VALUE"),adInteger,adParamReturnValue,4,vtret);
m_pCommand->Parameters->Append(pRet);
pRet->Value=vtret;

vtin1.vt=VT_BSTR;
vtin1.bstrVal=_bstr_t(dhhm);
pIn1=m_pCommand->CreateParameter(_bstr_t("DHHM"),adVarChar,adParamInput,9,vtin1);
m_pCommand->Parameters->Append(pIn1);
pIn1->Value=vtin1;

vtin2.vt=VT_I4;
vtin2.intVal=0;
pIn2=m_pCommand->CreateParameter(_bstr_t("TYPE"),adInteger,adParamInput,4,vtin2);
m_pCommand->Parameters->Append(pIn2);
pIn2->Value=vtin2;

vtin3.vt=VT_BSTR;
vtin3.bstrVal=_bstr_t(pwd);
pIn3=m_pCommand->CreateParameter(_bstr_t("PWD"),adVarChar,adParamInput,7,vtin3);
m_pCommand->Parameters->Append(pIn3);
pIn3->Value=vtin3;

vtout.vt=VT_I4;
pOut=m_pCommand->CreateParameter(_bstr_t("RET"),adInteger,adParamOutput,4,vtout);
m_pCommand->Parameters->Append(pOut);
pOut->Value=vtout;

m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
ret=(pOut->Value).intVal;
m_pConnection->Close();
::CoUninitialize();
}
catch(_com_error e)
{
ret=-1;
str.Format("验证10000密码时产生异常:%s-%s-%s---%s",area,dhhm,pwd,e.ErrorMessage());
::SendMessage(AfxGetMainWnd()->m_hWnd,WM_SHOWERROR,(WPARAM)str.GetBuffer(0),0);
::CoUninitialize();
return ret;
}
return ret;
}
...全文
58 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
MuseIn 2004-09-30
catch( (_com_error e )
{
...
}
catch( Exception exc )
{
...
}
回复
alon21 2004-09-30
你有没有日志记录呢?要是有的话,出错后可以看看时到底给存储过程提交了什么参数,
用这些内容在数据库环境中存储过程中实验一下,看看存储过程的执行结果,返回结果.
回复
alon21 2004-09-30
我觉得还是检查你交给存储过程的5个参数的有效性
回复
TDwebber 2004-09-30
你的try里面的东西太多了,这样来捕捉异常等于没捕捉啊
回复
招财猫_Martin 2004-04-03
catch(_com_error e)中能捕捉到异常的类型吗?
回复
taianmonkey 2004-04-03
m_pCommand->CommandTimeout=20;
可以设置的长一点!
回复
taianmonkey 2004-04-03
catch(...)
{

}
回复
goldntman 2004-04-03
就是在catch(_com_error e)中捕捉到的,说是未指定的错误?错误码我不记得了
回复
gagamazel 2004-04-02
我初学ADO,没能全看懂,能不能认为是内存泄漏呢?那样的话可以解释一段时间以后才出错。
说的不对也别笑我哟。我想知道RollBack和ReQuery是ADO里的函数么?
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告