请高手解答: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;
}
...全文
74 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2004-04-02 11:34
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……