本帖最后由 yvettesharp 于 2011-08-28 11:52:34 编辑

解决方案 »

  1.   

    我继续提供一些信息,今天我特地测试一下看我的程序对数据库访问是否有问题
    导入ado
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")增加一个执行函数
    void CADONormalTestDlg::OnBnClickedBtnConnect()
    {
    // TODO: 在此添加控件通知处理程序代码
         
        _ConnectionPtr pConnection;
        _CommandPtr pCommand;
        _RecordsetPtr pRecord;    pConnection.CreateInstance(_uuidof(Connection));
        pRecord.CreateInstance(_uuidof(Recordset));
        pCommand.CreateInstance("ADODB.Command");    _bstr_t strConnect = "Provider=OraOLEDB.Oracle.1;Data Source=data;User ID=store;Password=store;";
        pConnection->Open(strConnect, "","", adConnectUnspecified);    //测试1,通过
        /*CString strSql = "select * from products";
        BSTR bstrSql = strSql.AllocSysString();
        pRecord->Open(bstrSql, (IDispatch*)pConnection, adOpenDynamic, adLockOptimistic, adCmdText);*/    //测试2,通过
        pCommand->CommandText = "select * from products";
        pCommand->ActiveConnection = pConnection;
        pCommand->CommandType = adCmdText;
        pRecord = pCommand->Execute(NULL, NULL, adCmdText);    //测试3,通过
        pCommand->CommandText = "pk_test.proc_test";
        pCommand->ActiveConnection = pConnection;
        pCommand->CommandType = adCmdStoredProc;
        pRecord = pCommand->Execute(NULL, NULL, adCmdStoredProc);    //测试4,失败,Execute函数报出异常
        /*pCommand->CommandText = "zsj_output.outputproc";
        pCommand->ActiveConnection = pConnection;
        pCommand->CommandType = adCmdStoredProc;    _ParameterPtr   m_pParameter=NULL;
        m_pParameter.CreateInstance("ADODB.Parameter");
        m_pParameter=pCommand->CreateParameter(_bstr_t("myno"),adInteger,adParamInput,sizeof(int),_variant_t(short(7900)));
        pCommand->Parameters->Append(m_pParameter);    pRecord = pCommand->Execute(NULL, NULL, adCmdStoredProc);*/    while (!pRecord->adoEOF)
        {
            _variant_t str = pRecord->GetCollect("Price");        if(str.vt != NULL && str.vt != VT_EMPTY)
            {
                CString temp = (LPSTR)(_bstr_t)str;
            }        pRecord->MoveNext();
        }
    }在这段代码里面我做了如下几个测试
    测试1:用记录集pRecord测试是否能查询到数据库products这张表的数据
    CString strSql = "select * from products";
    BSTR bstrSql = strSql.AllocSysString();
    pRecord->Open(bstrSql, (IDispatch*)pConnection, adOpenDynamic, adLockOptimistic, adCmdText);
    程序正确执行并得到数据集测试2:用命令pCommand调用Execute函数来执行还是查询功能
    pCommand->CommandText = "select * from products";
    pCommand->ActiveConnection = pConnection;
    pCommand->CommandType = adCmdText;
    pRecord = pCommand->Execute(NULL, NULL, adCmdText);
    程序正确执行,execute函数并没有报异常测试3:还是用pCommand调用Execute函数来数据库中我新建的一个普通存储过程看测试是否能通过
    存储过程代码如下
    create or replace package pk_test
    is
      procedure proc_test;
    end pk_test;create or replace package body pk_test
    is
      procedure proc_test
      is
      begin
        update products set price = price + 1;
        update products set price = price - 1;
      end proc_test;
    end pk_test;然后调用
    pCommand->CommandText = "pk_test.proc_test";
    pCommand->ActiveConnection = pConnection;
    pCommand->CommandType = adCmdStoredProc;
    pRecord = pCommand->Execute(NULL, NULL, adCmdStoredProc);
    程序也能正确执行,execute函数并没有报异常测试4就如上面所说执行不了,是我哪里写的不对吗?纳闷了,还请高手指教一下,测试4的存储过程代码见一楼,谢谢了
      

  2.   

    弹出的异常对话框写着
    ADONormalTest.exe 中的 0x7c812afb 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0012f204 处的 _com_error。代码异常指着comip文件中以下代码
    void _Release() throw()
        {
            if (m_pInterface != NULL) {
                m_pInterface->Release();
            }
        }
    这里面的 m_pInterface->Release();这句话,我看着m_pInterface这个变量也确实不为NULL