ADO源码分析,找到问题就给分!

chnzhr 2003-08-26 10:30:38
void test()
{
HRESULT hr;
_bstr_t bstr;
_ConnectionPtr p_conoracle;
if(FAILED(::CoInitialize(NULL)))
{
return;
}

hr= p_conoracle.CreateInstance(__uuidof(Connection));
if(SUCCEEDED(p_conoracle))
{
p_conoracle->ConnectionTimeout = 10;
p_conoracle->CommandTimeout = 10;
try{
hr = p_conoracle->Open(
_bstr_t(L"Provider=MSDASQL.1;Password=test;Persist Security Info=True;User ID=test;Data Source=test"),
_bstr_t(L""),
_bstr_t(L""),
adModeUnknown);
if(!SUCCEEDED(hr))
{
::CoUninitialize();
return;
}
}catch(_com_error &e)
{
bstr = e.Description();
::CoUninitialize();
return 3;
}catch(...)
{
::CoUninitialize();
return;
}
}
else
{
::CoUninitialize();
return;
}

p_conoracle->CursorLocation = adUseClient;
p_conoracle->Close();
::CoUninitialize();
return ;
}
...全文
141 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
康斯坦汀 2003-08-26
  • 打赏
  • 举报
回复
“哪有这种catch语句?”

有啊,这段语句无问题,楼上。

错误信息太少了,很难判断是什么问题,
catch(_com_error &e)
{
bstr = e.Description();
::CoUninitialize();
return 3;
}

改为:

catch(_com_error &e)
{
CString ErrorStr;


_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
ErrorStr.Format( "数据库访问错误!\n\t错误代码 = %08lx\n\t代码含义 = %s\n\t来源 = %s\n\t描述 = %s\n",
e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );

AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );

::CoUninitialize();
return 3;

}

出错误时看MessageBox中的内容,再找原因。
lifezhu 2003-08-26
  • 打赏
  • 举报
回复
更正:
try{
p_conoracle->CursorLocation = adUseClient;
p_conoracle->Close();
}
catch(...)
{
}
这里还要catch一下
lifezhu 2003-08-26
  • 打赏
  • 举报
回复
不要搞这么多程序出口啊,我头都昏了,有些catch抓住了_com_error以后还有别的被catch的
整理一下你的代码
void test()
{
HRESULT hr;
_bstr_t bstr;
_ConnectionPtr p_conoracle;
if(FAILED(::CoInitialize(NULL)))
{
return;
}

hr= p_conoracle.CreateInstance(__uuidof(Connection));
if(SUCCEEDED(p_conoracle))
{
p_conoracle->ConnectionTimeout = 10;
p_conoracle->CommandTimeout = 10;
try{
hr = p_conoracle->Open(
_bstr_t(L"Provider=MSDASQL.1;Password=test;Persist Security Info=True;User ID=test;Data Source=test"),
_bstr_t(L""),
_bstr_t(L""),
adModeUnknown);
if(SUCCEEDED(hr))
{
...
}
}catch(_com_error &e)
{
bstr = e.Description();
}catch(...)
{
}
}
else
{
}

p_conoracle->CursorLocation = adUseClient;
p_conoracle->Close();
::CoUninitialize();
return ;
}
LuckFox 2003-08-26
  • 打赏
  • 举报
回复

不过在COM中用ADO好像不能像在平常程序中那样调用吧?你在看一看吧!我也不太明白
很想忙你!但只能关注了!
warmchang 2003-08-26
  • 打赏
  • 举报
回复
哪有这种catch语句?
catch(_com_error &e)
{
bstr = e.Description();
::CoUninitialize();
return 3;
}
catch(...)
{
::CoUninitialize();
return;
}
chnzhr 2003-08-26
  • 打赏
  • 举报
回复
楼上的函数是test.dll的一个接口函数,但连续运行该函数就会报以下错误:
First-chance exception in testado.exe: 0xC0000005: Access Violation.
First-chance exception in testado.exe (test.DLL): 0xC0000005: Access Violation.
LeeZi 2003-08-26
  • 打赏
  • 举报
回复
谢谢楼上各位抬爱。

---------------------------
作为VC的爱好者,欢迎一起交流经验。
LeeZi821@yahoo.com.cn
lanhuaiyu 2003-08-26
  • 打赏
  • 举报
回复
同意,LeeZi(临渊羡鱼,不如退而结网)
ayqlj 2003-08-26
  • 打赏
  • 举报
回复
LeeZi(临渊羡鱼,不如退而结网)
代码真优美!!!!
SmallBigCat 2003-08-26
  • 打赏
  • 举报
回复
同意 LeeZi(临渊羡鱼,不如退而结网) 的观点;
他的代码比楼主你的更清晰多了


是的,CoInitialize(NULL)作为一个全局的OLE初始化过程,你根本不应该把它放在一个可能会多次调用的函数内部;
LeeZi 2003-08-26
  • 打赏
  • 举报
回复
呵呵呵,这里的原因是因为你过早的调用了CoUninitialize。
而你的connection对象只有到作用范围外才析构,即函数外。

修改
void ChkErr(HRESULT hr)
{
if (FAILED(hr))
{
IErrorInfo *ei;
GetErrorInfo(0, &ei);
_com_raise_error(hr, ei);
}
}

void YourFunction()
{
try
{
_ConnectionPtr pConn = NULL;
ChkErr(pConn.CreateInstance(__uuidof(Connection)));
pConn->ConnectionTimeout = 10;
pConn->CommandTimeout = 10;

pConn->Open(...);
pConn->CursorLocation = adUseClient;
pConn->Close();
}
catch (_com_error&e )
{
//...
}
catch (....)
{
//...
}
}

void Test
{
if(FAILED(::CoInitialize(NULL)))
return;
YourFunciton();
::CoUninitialize();
}



lifezhu 2003-08-26
  • 打赏
  • 举报
回复
或者在整个函数范围内使用try{}catch(...){}
lifezhu 2003-08-26
  • 打赏
  • 举报
回复
catch(_com_error& Err)和catch(_com_error* pErr)两者之间互相换用一下,有时候接下来的catch(...)抓不住
chnzhr 2003-08-26
  • 打赏
  • 举报
回复
程序只是在函数return时报的错误,仅能跟到pInstance->Release();有兴趣的朋友可以测试一下,我很困惑,从语法上讲应该没问题,又是单线程使用。郁闷。。。 。。。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧