请高手解答:VC+ADO执行存储过程的一个古怪问题
以下是我用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;
}
程序运行一段时间(一般大约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;
}
...全文
相关推荐
VC+ADO+ORACLE连接
VC+ADO+ORACLE连接"的主题聚焦于如何利用ActiveX Data Objects(ADO)在VC环境中与Oracle数据库建立连接并执行相关操作。下面我们将深入探讨这一主题。
【Linux系列】Linux设备驱动之Ioctl控制
DATE: 2019.9.14 1、参考 linux设备驱动框架 ioctl系统调用流程 Linux设备驱动之Ioctl控制 使用ioctl“实现”自定义的系统调用 ioctl()分析——从用户空间到设备驱动 2、Linux设备驱动模型 (1) 在Linux文件系统中,每个文件都用一个struct inode结构体来描述,这个结构体记录了这个文件的所有信息,例如文件类型,访问权限等。 (2) 在...
VC ADO调用存储过程
**生成并初始化_CommandPtr对象**: ADO中的_CommandPtr对象代表一个数据库命令,可以用来执行SQL语句或存储过程。
vc执行存储过程实例
今天我们将深入探讨一个具体的话题:“vc执行存储过程实例”。
使用ADO处理存储过程VC源代码:stored_proc_using_ado
当我们需要与数据库进行交互时,ADO(ActiveX Data Objects)是一个强大的工具,它允许开发者方便地访问和操作数据库中的数据,包括执行存储过程。


