用VC如何执行ORACLE的存储过程呢?哪位大虾有这方面的代码,可否参考一下,感激不尽啊

解决方案 »

  1.   

    http://support.microsoft.com/kb/309362
    http://support.microsoft.com/kb/176086
      

  2.   

    How to call an Oracle Stored Procedure that returns one or more REF CURSORS, using ADO from C++
    http://www.codeproject.com/database/Oracle_RefCursor_ADO_C__.asp
      

  3.   

    oracle调用存储过程和sql server用法差不多,不过在指定存储过程参数名称的时候,万万不能给参数前面加@符号
      

  4.   

    存储过程代码:
    CREATE OR REPLACE PROCEDURE "SP_ADMINPWD_MODIFY"  
    (p_Result OUT NUMBER, p_UserName IN VARCHAR2, p_OldPwd IN VARCHAR2, p_NewPwd IN VARCHAR2)
    IS
            v_Pwd VARCHAR2(20);
        BEGIN
            p_Result := 0;               --先把返回值置0,表示无错误        BEGIN                        --先验证旧密码是否正确
                SELECT PassWord INTO v_Pwd FROM charge_Admin_Info WHERE UserName = p_UserName;
                IF v_Pwd != p_OldPwd THEN
                    p_Result := 6;
                    RETURN;
                END IF;
            END;        BEGIN                         --旧密码验证通过,修改密码
                UPDATE charge_Admin_Info SET PassWord = p_NewPwd WHERE UserName = p_UserName;
                EXCEPTION
                    WHEN OTHERS THEN
                        ROLLBACK;
                        p_Result := 8;
                        RETURN;
            END;
            COMMIT;end ;
    调试正确,实现管理员修改密码功能.
    调用存储过程如下:
    try
    {
    _CommandPtr m_pCommand;
    m_pCommand.CreateInstance(__uuidof(Command));
    m_pCommand->ActiveConnection = cnn;
    m_pCommand->CommandText =  "SP_AdminPwd_Modify";
    m_pCommand->CommandType = adCmdStoredProc; _ParameterPtr mp_var1;
    mp_var1.CreateInstance(__uuidof(Parameter));
    _ParameterPtr mp_var2;
    mp_var2.CreateInstance(__uuidof(Parameter));
    _ParameterPtr mp_var3;
    mp_var3.CreateInstance(__uuidof(Parameter)); _ParameterPtr outParam = NULL;
    outParam.CreateInstance(__uuidof(Parameter)); mp_var1 = m_pCommand->CreateParameter(_bstr_t("p_UserName"),adVarChar,adParamInput,20,
          _variant_t(UserName));
            m_pCommand->Parameters->Append(mp_var1); CString strOldPass;
    m_OldPass.GetWindowText(strOldPass);
    mp_var2 = m_pCommand->CreateParameter(_bstr_t("p_OldPwd"),adVarChar,adParamInput,200,
          _variant_t(strOldPass));
            m_pCommand->Parameters->Append(mp_var2); mp_var3 = m_pCommand->CreateParameter(_bstr_t("p_NewPwd"),adVarChar,adParamInput,200,
    _variant_t(m_PassNew));
    m_pCommand->Parameters->Append(mp_var3);        outParam = m_pCommand->CreateParameter(_bstr_t("p_Result"),adInteger,adParamOutput,3);
    m_pCommand->Parameters->Append(outParam);
            
    m_pCommand->Execute(NULL,NULL,adCmdStoredProc); 
    } catch(_com_error e)
    {
    AfxMessageBox(e.ErrorMessage());
    }运行后出现IDispatch error #3092,小弟找了好久都没搞定,急,请个位帮个忙,先谢了!
      

  5.   

    outParam = m_pCommand->CreateParameter(_bstr_t("p_Result"),adInteger,adParamOutput,(long)3);整型数据在ADO方法传递的时候要转换为long
      

  6.   

    好象不是,这个3是代表输出的SIZE
    我改了,还是一样的错误啊
      

  7.   

    float f=100;
    param =  m_pCommand->CreateParameter (_bstr_t("p_Result"),adNumeric,adParamInput,3,_variant_t(f));
    param->NumericScale=long(3);
    param->Precision=long(0);
    m_pCommand->->Parameters->Append(param);你用adNumeric代替adInteger试一下
      

  8.   

    老大,p_Result是输出参数啊,按照这个方法还是不行
      

  9.   

    TRACE("Error info: %s \n", (LPCTSTR)(_bstr_t)(pCome.Description()));
    TRACE("Error info: %s \n", (pCome.ErrorMessage()));
    把所有的错误信息都抛出来看看
      

  10.   

    我用TRY CATCH语句看了,就一直出现IDispatch error #3092的错误
      

  11.   

    AfxMessageBox((LPCTSTR)(_bstr_t)(e.Description()));
      

  12.   

    出现  
    ORA-01403:  未找到数据
    ORA-06512:  在"CHARGE.SP_ADMINPWD_MODIFY", line9
    ORA-06512  在line 1
      

  13.   

    你的存储过程没有执行成功,有错误SELECT PassWord INTO v_Pwd FROM charge_Admin_Info WHERE UserName = p_UserName;
    如果表里没有查到你所需的纪录,你要有判断v_Pwd 是否确定被赋值了
      

  14.   

    SELECT PassWord INTO v_Pwd FROM charge_Admin_Info WHERE UserName = p_UserName;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
        p_Result := 6;
        RETURN;
    END;             
    IF v_Pwd != p_OldPwd THEN
        p_Result := 6;
        RETURN;
    END IF;
      

  15.   

    老大,非常感谢,但是我后来又看了一下,存储过程一点都不需要改,是代码的问题,必须把OUTPUT参数放在前面才可以
    try
    {
    cmmd->ActiveConnection = m_pConnection;
    cmmd->CommandText=_bstr_t("SP_ADMINPWD_MODIFY");   
    cmmd->CommandType=adCmdStoredProc;    _ParameterPtr param=NULL; 
    param.CreateInstance(__uuidof(Parameter)); param = cmmd->CreateParameter("p_Result",adNumeric, adParamOutput,2);
        cmmd->Parameters->Append(param); param = cmmd->CreateParameter("p_UserName",adVarChar, adParamInput, 20, _variant_t("eee"));
    cmmd->Parameters->Append(param); param = cmmd->CreateParameter("p_OldPwd",adVarChar, adParamInput, 20, _variant_t("a"));
    cmmd->Parameters->Append(param); param = cmmd->CreateParameter("p_NewPwd",adVarChar, adParamInput, 20, _variant_t("tanyi"));
    cmmd->Parameters->Append(param);    cmmd->Execute(NULL,NULL,adCmdStoredProc); //cmmd->Parameters->Refresh();
    // _variant_t vft=cmmd->Parameters->Item["p_Result"]->Value;
        m_nNewResult=(long)cmmd->Parameters->GetItem("p_Result")->GetValue();//
    CString S;
    S.Format("%d",m_nNewResult);
    AfxMessageBox(S);
    // TRACE("result:%d\n",lft);
    }
    catch(_com_error e)
    {
    AfxMessageBox((LPCTSTR)(_bstr_t)(e.Description()));
    }