我在用vc6.0连接PostgreSQL数据库时,代码编译没有错误,但是运行时出现了错误,如果我把断开数据库的语句给取消了,程序能够运行,但是有效功能却不行,请各位高手指点一下。
void  CADOConn::OnInitADOConn()
{
// 初始化OLE/COM库环境 
::CoInitialize(NULL);
  
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = "Provider=PostgreSQL OLE DB Provider;Password=sa;User ID=postgres;Data Source=localhost;Location=central;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
}
void CADOConn::ExitConnect()
{
// 关闭记录集和连接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 释放环境
::CoUninitialize();
}
void CComBoxDlg::AddToCom()
{
//连接数据库
CADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
//设置查询字符串
_bstr_t bstrSQL = "SELECT * FROM Users";
//创建记录集指针对象实例
m_AdoConn.m_pRecordset.CreateInstance(__uuidof(Recordset));
//打开记录集
m_AdoConn.m_pRecordset->Open(bstrSQL,m_AdoConn.m_pConnection.GetInterfacePtr(),adOpenDynamic,
adLockOptimistic,adCmdText);
while(!m_AdoConn.m_pRecordset->adoEOF)
{
m_ComBox.InsertString(0,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("UserName"));
//将记录集指针移动到下一条记录
m_AdoConn.m_pRecordset->MoveNext();
}
//断开数据库连接
m_AdoConn.ExitConnect();//就在这一步出现了问题,请大家帮着看一下。
}

解决方案 »

  1.   

    你确认在断开之前的程序都正确运行了吗?比如m_AdoConn.m_pRecordset->MoveNext执行到了没有,正确么?
      

  2.   

    可是如果不去掉m_AdoConn.ExitConnect(),程序根本就打不开,就是不知道在哪儿出的错呀!我以前是连接MS Server 2000的,程序没有错误的。
      

  3.   

    我就是说如果去掉,ExitConnect,那其它代码都能正确运行吗?数据库连接能成功吗?
      

  4.   

    断点调试,进入ExitConnect函数中,查看是那一语句出了问题
      

  5.   

    楼主的代码看起来没问题, 现在报错的地方在
    void CADOConn::ExitConnect() 

    // 关闭记录集和连接 
    if (m_pRecordset != NULL) 
    m_pRecordset->Close(); 
    m_pConnection->Close(); 
    // 释放环境 
    ::CoUninitialize(); 

    这个里面, 楼主没办法去顶是那行吗,大多数可能是 ::CoUninitialize()吧?
      

  6.   

    跟到ExitConnect()函数里面,看具体出错是哪个语句
      

  7.   

    // 释放环境 
    ::CoUninitialize();
    是这个语句有错误,去掉这个语句就没有问题了,该怎么办?
      

  8.   

    ::CoInitialize(NULL);与::CoUninitialize(); 报错的问题,以前也有贴子,好象是说全局智能指针的问题(初始化一次足够了),有以下方式仅供参考:
    1.分别放进构造与析构里面(CComBoxDlg,先用这个)。
    2.这样如果你有别的地方用到初始化了,就把这两个去掉吧(前提就是保证执行都成功)。
    当然,最好听听快乐鹦鹉的高论,大家都学习下呵呵