小弟初次接触  Oracle,现在使用ADO连接方式操作数据库,需要调用 数据库的存储过程,
Proc_TULT_CHECK
(
    PTULT002 varchar2,PTULT004 varchar2,outstr out varchar2 

前2个参数都是text类型的输入参数,输出的也是 text参数,请问用C++语言怎么实现               CAdoConnection* m_pOraDb  =new CAdoConnection;
          m_pOra->Open("Provider=OraOLEDB.Oracle.1;Password=0000;Persist Security Info=True;User ID=xxx;Data Source=xxxx");
         CAdoRecordSet OraadoPersonSet(m_pOraDb);
小弟是新手中的新手,刚开始接触,请各位哥哥姐姐帮帮忙啊 !谢谢!!!!弄好后就送分!谢谢大家,麻烦顶下!顶了都有分!!再次谢谢了!!!

解决方案 »

  1.   


    ado连oracle没用过。
    不过有CAdoConnection,CAdoRecordSet类么?msdn上没有看到。
      

  2.   

    不知道 exec("SQL语句");能不能满足你的要求
      

  3.   

    ::CoInitialize(NULL);//初始化com组件pCon.CreateInstance(__uuidof(Connection));//实例化
    pRec.CreateInstance(__uuidof(Recordset));
    comm.CreateInstance(__uuidof(Command));           HRESULT  hr;
    AfxMessageBox("开始进行连接");
    try
    {
    //_10.231.152.15
            hr=pCon->Open("Provider=MSDAORA.1;;Data Source=NLV;Password=GUEST;User ID=NLV_GUEST;Persist Security Info=True","","",adModeUnknown);
    }
    catch(_com_error *e)
    {
    MessageBox(e->ErrorMessage());
    }
    AfxMessageBox("连接结束");//oracle执行存储过程的准备
    comm->ActiveConnection    =    pCon;    //ADO连接   
    comm->CommandType  =  adCmdStoredProc; 
    comm->CommandText=_bstr_t(L"nlv_package.pro_mep");    //存储过程名     comm->Parameters->Append(comm->CreateParameter("HPZL",adBSTR,adParamInput,2,_variant_t(hpzl)));comm->Parameters->Append(comm->CreateParameter("HPHM",adBSTR,adParamInput,16,_variant_t(hphm)));comm->Parameters->Append(comm->CreateParameter("WFSJ",adDBTimeStamp,adParamInput,20,_variant_t(wfsj)));
    comm->Parameters->Append(comm->CreateParameter("WFXW",adBSTR,adParamInput,5,_variant_t(wfxw)));
    comm->Parameters->Append(comm->CreateParameter("WFDD",adBSTR,adParamInput,12,_variant_t(wfdddm)));
    comm->Parameters->Append(comm->CreateParameter("WFDZ",adBSTR,adParamInput,200,_variant_t(wfdd)));
    comm->Parameters->Append(comm->CreateParameter("CJR",adBSTR,adParamInput,8,""));
    comm->Parameters->Append(comm->CreateParameter("CJJG",adBSTR,adParamInput,10,_variant_t(cjjg)));
    comm->Parameters->Append(comm->CreateParameter("SJLY",adBSTR,adParamInput,2,_variant_t(sjly)));
    comm->Parameters->Append(comm->CreateParameter("ZPLX",adBSTR,adParamInput,1,_variant_t(zplx)));
    comm->Parameters->Append(comm->CreateParameter("SBBH",adBSTR,adParamInput,16,_variant_t(sbbh)));
    comm->Parameters->Append(comm->CreateParameter("DLGLS",adNumeric,adParamInput,4,dlgl));
    comm->Parameters->Append(comm->CreateParameter("DLMS",adNumeric,adParamInput,3,dlms));
    comm->Parameters->Append(comm->CreateParameter("FJBZ",adBSTR,adParamInput,6,""));comm->Parameters->Append(comm->CreateParameter("CLSD",adNumeric,adParamInput,3,cpsd));
    comm->Parameters->Append(comm->CreateParameter("DCXS",adNumeric,adParamInput,3,dcxs));
    comm->Parameters->Append(comm->CreateParameter("XCXS",adNumeric,adParamInput,3,xcxs));
    comm->Parameters->Append(comm->CreateParameter("DCZFXS",adNumeric,adParamInput,3,dczf));
    comm->Parameters->Append(comm->CreateParameter("XCZFXS",adNumeric,adParamInput,3,xczf));
    comm->Parameters->Append(comm->CreateParameter("ZDXS",adNumeric,adParamInput,3,0));comm->Parameters->Append(comm->CreateParameter("ZJWJ1",adBSTR,adParamInput,100,_variant_t(tp1)));
    comm->Parameters->Append(comm->CreateParameter("ZJWJ2",adBSTR,adParamInput,100,_variant_t(tp2)));
    comm->Parameters->Append(comm->CreateParameter("ZJWJ3",adBSTR,adParamInput,6,""));
    comm->Parameters->Append(comm->CreateParameter("ZJWJ4",adBSTR,adParamInput,6,""));int hh;
    comm->Parameters->Append(comm->CreateParameter("ZXJG",adInteger,adParamOutput,sizeof(int),hh)); try
    {
    comm->Execute(NULL,NULL,adCmdStoredProc); 
    catch(_com_error *e)
    {
    AfxMessageBox(e->ErrorMessage());
    }
    AfxMessageBox("存储完成");
    _variant_t var=comm->Parameters->GetItem("ZXJG")->GetValue();
      

  4.   

    谢谢大家!!!有  CAdoRecordSetCAdoRecordSet类,问题还没解决!!!
      

  5.   

    comm,是什么类型啊 ??咋没看到定义啊 ???????????
      

  6.   

    现在的程序我把获取参数的值 代码注释起来是好的,存储过程调用成功了,但是我要根据返回的参数值进一步操作,请高人帮忙啊 !代码如下:
      ::CoInitialize(0);
      _ConnectionPtr pconn;
      HRESULT hr;
      hr = pconn.CreateInstance(__uuidof(Connection));//建立对象实例
      if(SUCCEEDED(hr))
      {
      try
      {
      //打开数据源

      pconn->ConnectionString = "Provider=OraOLEDB.Oracle.1;Password=1234;Persist Security Info=True;User ID=personal;Data Source=persondb";//设置连接字符串
      pconn ->Open("","","",-1);
      _CommandPtr   cmmd;  
      HRESULT   hr   =  cmmd.CreateInstance(__uuidof(Command));//中创建_CommandPtr对象       
      if(FAILED(hr))      
      {        
      AfxMessageBox("NewNetDatabase()中创建_CommandPtr对象失败");        
      return ;      
      }
      _ParameterPtr   PickPlace;  
      _ParameterPtr   PickTime;  
      _ParameterPtr   PickIDcode;  
      //添加参数,第一个参数为存储过程中的参数,可以指定也可以不指定,第二个参数数类型,第三个输 
      PickPlace   = cmmd->CreateParameter("TULT002",adVarChar, adParamInput,64,_variant_t( pikinf.PickPlace));      
      //为_CommandPtr添加参数
      cmmd->Parameters->Append(PickPlace);

      PickTime   =   cmmd->CreateParameter("TULT004",adBigInt,adParamInput,20,_variant_t(pikinf.PickTime));      
      cmmd->Parameters->Append(PickTime);
      
      PickIDcode =   cmmd->CreateParameter("TULT003",adVarChar,adParamOutput,4000);      
      cmmd->Parameters->Append(PickIDcode);
      
      cmmd->CommandText=_bstr_t("Proc_TULT_CHECK");//存储过程的名称      
      cmmd->ActiveConnection   =   pconn;//需要使用的ADO连接      
      cmmd->CommandType=adCmdStoredProc;      
      cmmd->Execute(NULL,   NULL,   adCmdStoredProc); 

    //  strTmp =(CString)cmmd->Parameters->GetItem("TULT003")->GetValue();
      // 获取出参

      cmmd.Detach();
      }
      catch(_com_error e)
      {
      CString strerr;
      strerr.Format(_T("出错,连接数据库错误~n错误:%s"),e.ErrorMessage());
      AfxMessageBox(strerr);
      pconn.Release();

      return ;
      }
      }
      
      

  7.   

     红色注释的部分编译不能通过,不知道为什么, CString strTmp ; error C2440: 'type cast' : cannot convert from 'class _variant_t' to 'class CString'
            No constructor could take the source type, or constructor overload resolution was ambiguous
      

  8.   

    看一下实例书里面应该有讲解的,我只用ado连了access
      

  9.   

    该说的都说了,这位兄弟该不会还没解决吧? 要不加本人QQ聊好了. QQ30101
      

  10.   

    还是我来给你调用存储过程并获取返回参数的代码吧:D _ConnectionPtr cn;
    _RecordsetPtr rs;
    _CommandPtr cmd;
    _variant_t var; CString strTemp; CoInitialize(NULL); cn.CreateInstance(__uuidof(Connection));
    rs.CreateInstance(__uuidof(Recordset));
    cmd.CreateInstance(__uuidof(Command)); cn->Open(...); strTemp.Format("exec myproc")//执行你自己的存储过程
    cmd->ActiveConnection = cn;
    cmd->CommandText = strTemp.GetBuffer(strTemp.GetLength());
    rs = cmd->Execute(NULL,NULL,adCmdText);
            
            //返回的结果在rs中,可以是1个参数,也可以是一个结果集//如果是n个参数,这些参数的序号分别是0,1,2,3,.....n.
    //那获取的方式如下var.ChangeType(VT_I8);
    var.lVal = 0;//获取第1个参数
    var = rs->GetField()->GetItem(var)->value;
    你获取的第1个参数就在var中存放着
    如果是字符串,那就是var.bstrVal,如果是整数那就存在var.lVal里.......(还有很多其他类型的,比如日期,浮点等等)
    获取第2个参数的办法就是
    var.ChangeType(VT_I8);
    var.lVal = 1;//获取第2个参数
    var = rs->GetField()->GetItem(var)->value;ok现在是1行参数的,如果是一个结果集,就循环读出每个记录循环处理部分的代码如下
    while(!rs->EndOfFile)
    {
      //象前边说的那样挨个取记录的各个字段.
      var.ChangeType(VT_I8);
      var.lVal = 0;//获取第1个参数
      var = rs->GetField()->GetItem(var)->value;   .......
       //
      rs->MoveNext();
    }
      

  11.   

    抱歉纠错上边的rs->GetFields,不是GetField另外,如果你的存储过程返回的结果集是有字段名字的,
    例如你的存储过程返回的结果集合如下字段名 fna     fnb
    记录1  "aaa"   1
    记录2  "bbb"   2那么你可以使用rs->GetFields()->GetItem("fna")->value;
    获取第1个字段"aaa","bbb"数据
    使用rs->GetFields()->GetItem("fnb")->value;
    获取第2个字段1、2数据
    而不用使用字段序号去取数字,所以好习惯是存储过程返回结果集合应该带字段名。
      

  12.   

    忘记说了,ado方式调用存储过程,返回参数应该用结果集方式,如果你的存储过程是return什么,那是不行的,要select....。