vc如何调用oracle里的存储过程,包,函数?还有如何在VC中对应不同的数据源(如sybase,oracle,SQL),它们的存储过程的调用方法和语法结构好像都不一样。如果用dll方式的话,那我要用多少的if...else...啊。哪位高手指点一下思路。

解决方案 »

  1.   

    用odbc怎么调用oracle中的存储过程(带有输入输出参数的)谢谢楼上的大侠
      

  2.   


    bool CStoreProcedureProcessor::DoBackupBillingCycle(long& iRet,std::string& szRet)
    {
    m_Database.GetParameters().Add("iret",0,OPARAMETER_OUTVAR,OTYPE_NUMBER);
    m_Database.GetParameters().Add("errcode",0,OPARAMETER_OUTVAR,OTYPE_VARCHAR2);
    if(OSUCCESS != m_Database.ExecuteSQL("Begin Dobackupbillingcycle(:iret,:errcode); end;"))
    throw RuntimeError("错误:执行Dobackupbillingcycle存储过程错误!");
    OValue value;
    if(OSUCCESS != m_Database.GetParameters().GetParameter("iret").GetValue(&value))
    throw RuntimeError("错误:无法取得 返回参数iret!");
    iRet = (long)value;
    if(OSUCCESS != m_Database.GetParameters().GetParameter("errcode").GetValue(&value))
    throw RuntimeError("错误:无法取得 返回参数errcode!");
    szRet = (LPCTSTR)value;
    m_Database.GetParameters().GetParameter("iret").Close();
    m_Database.GetParameters().GetParameter("errcode").Close();
    m_Database.GetParameters().Remove("iret");
    m_Database.GetParameters().Remove("errcode");
    m_Database.GetParameters().Close();
    return true;
    }
      

  3.   

    oo4o的例子,在Oracle下都有例子,不一一列举了。
      

  4.   

    请问在vc里面怎么样通过odbc调用oracle带有输入输出参数的存储过程呢?谢谢大侠
      

  5.   

    请问在vc里面怎么样通过odbc调用oracle带有输入输出参数的存储过程呢?谢谢大侠
      

  6.   

    zfive5(醉马不肖)
    大侠好像知道啊,麻烦赐教啊,:)
      

  7.   

    把执行存储过程的那一段语句直接放在ADO里面执行就可以了啊!
    如:
    //执行存储过程
    m_pRs->Open("begin PCaseAnalysis('1','20041215'); end;",_variant_t((IDispatch*)m_pConn,true),
    adOpenDynamic,adLockOptimistic,adCmdUnknown);
    上面这段语句就是执行了名为PCaseAnalysis的存储过程,'1','20041215'则分别是传给这个存储过程的第一及第二个参数。
      

  8.   

    推荐用ADO,比较省事。
    如果是一次性传入参数,可以把存储过程和参数组成一个SQL语句传入,如果是变参,则须引入Command 对象。
      

  9.   

    但是不是odbc更通用一些吗?这位大侠能给推荐个好的参考资料吗?谢谢啦
      

  10.   

    oracle存储过程如下CREATE OR REPLACE PROCEDURE SERVER.QUERYBAL (
       transtype IN VARCHAR2,
       u_id IN VARCHAR2,
       bankcode IN VARCHAR2,
       savingaccount IN VARCHAR2,
       paytranscode IN VARCHAR2,
       contractno IN VARCHAR2,
       amount OUT VARCHAR2,
       moneytype IN VARCHAR2,
       as400serial in VARCHAR2,
       pid IN VARCHAR2,
       payserial IN VARCHAR2,
       transtime IN VARCHAR2,
       stocktranspin IN VARCHAR2,
       cryptogram IN VARCHAR2,
       handleresult OUT VARCHAR2,
       oldbalance IN VARCHAR2,
       note OUT VARCHAR2) IS
    v_LocalNote VARCHAR2(147) := '';
    BEGIN
      handleresult :='99';
      amount := '0000000013000';
      note := '0000000000000';
    END QUERYBAL;入口参数:
    contractno 8位,用户号
    date  6位, 查询月份(格式yyyymm)
    其他参数为null出口参数:
    handleresult  2位 
    amount 13 位
    note 共13 位void CGasServiceDlg::OnStartserviceButton() 
    {
    // TODO: Add your control notification handler code here App->dboracle=new CDatabase; CString ConnectString;
    ConnectString.Format("DSN=%s;UID=%s;PWD=%s",App->AliasName_oracle,App->UserName_oracle,App->PassWord_oracle); int nRet;
    TRY
    {
    nRet=App->dboracle->OpenEx(ConnectString,CDatabase::noOdbcDialog);
    }
    CATCH (CDBException, e)
    {
    App->WriteLogFile("Oracle数据库连接失败");
    AddToLogList("Oracle数据库连接失败");
    delete App->dboracle;
    return;
    }END_CATCH

    if(nRet==0)
    {
    App->WriteLogFile("Oracle数据库连接失败");
    AddToLogList("Oracle数据库连接失败");
    return;
    }
    else
    {
    App->WriteLogFile("Oracle数据库连接成功");
    AddToLogList("Oracle数据库连接成功");
    } if((m_SocketThread=AfxBeginThread(RUNTIME_CLASS(CSocketThread)))==NULL)
    {
    App->WriteLogFile("启动侦听服务线程失败");
    AddToLogList("启动侦听服务线程失败");
    }
    else
    {
    m_StartService.EnableWindow(false);
    m_StopService.EnableWindow(true);
    App->WriteLogFile("启动侦听服务线程成功");
    AddToLogList("启动侦听服务线程成功");
    }
    }void CTradeThread::Trade7301Proc()
    {
    CString SQL;
    char Amount[14];
    char HandleResult[3];
    char Note[148]; memset(Amount,0x0,sizeof(Amount));
    memset(HandleResult,0x0,sizeof(HandleResult));
    memset(Note,0x0,sizeof(Note)); char date[7],contractno[9]; memset(date,0x0,sizeof(date));
    memset(contractno,0x0,sizeof(contractno)); memcpy(date,RecvBuffer+24,6);
    memcpy(contractno,RecvBuffer+16,8); SQL.Format("exec QUERYBAL NULL,'%s',NULL,NULL,NULL,'%s',Amount,NULL,NULL,NULL,NULL,NULL,NULL,NULL,HandleResult,NULL,Note",date,contractno);
    App->dboracle->ExecuteSQL(SQL);  //一执行就抛出异常}