如题,重谢50分

解决方案 »

  1.   

    用ado连接oracle读取大数据量字段:
    long lSize = m_pRecordset->Fields->Item["data"]->ActualSize; //data是你的Clob字段
    while(lSize>0)
    {
     lIsRead= lSize >=ChunkSize?ChunkSize:lSize;
     //从字段data中获取一个数据包
     varChunk = m_pRecordset->Fields->Item["data"]->GetChunk(lIsRead);
     for(index=0;index<LISREAD;INDEX++)
      ::SafeArrayGetElement(varChunk.parray,&index,buf+index);
      //将数据包写入文件
      f.Write(buf,lIsRead);
      lSize -=lIsRead;
      

  2.   

    详情参考:
    $oracle\ora90\oo4o\CPP\WORKBOOK\LOB   目录里的   CLOBREAD.CPP
      

  3.   

    供参考:
    _CommandPtr   pCommand;  
      _ParameterPtr   pParam1; //将要包含BLOB的参数  
      CString   sQuery; //SQL语句  
      _variant_t   vRecsAffected(0L);  
       
      _variant_t   vNull; //填充用  
      vNull.vt   =   VT_ERROR;  
      vNull.scode   =   DISP_E_PARAMNOTFOUND;  
       
       
      sQuery.Format("INSERT   INTO   EMP_PHOTO   VALUES   (   '%s',   'bitmap',   ?   )",   sEmpNo   );  
       
      _RecordsetPtr   pRs;  
      try  
      {  
      HRESULT   hr   =   pCommand.CreateInstance(__uuidof(Command));  
      if(FAILED(hr))   throw("Unable   to   create   Command   object");  
       
      //得到command对象  
      pCommand->PutRefActiveConnection(m_pConnection);  
       
      //开始查询  
      pCommand->PutCommandText((LPCTSTR)   sQuery);  
       
      //说明是sql语句查询  
      pCommand->PutCommandType(adCmdText);  
       
      //初始化parameter对象  
      hr   =   pParam1.CreateInstance(__uuidof(Parameter));  
      if   (FAILED(hr))   throw   ("Unable   to   create   Parameter   object");  
       
      //制造blob参数  
      pParam1   =   pCommand->CreateParameter((LPCTSTR)   "picture",   adBinary,   adParamInput,   vBLOB.parray->rgsabound[0].cElements,   vBLOB);  
       
      //将此参数加入command的参数集合  
      hr   =   pCommand->Parameters->Append(pParam1);  
      if   (FAILED(hr))   throw   ("Unable   to   append   Parameter   to   Command   Object");  
       
       
      hr   =   pCommand->Execute(&vRecsAffected,   &vNull,   adCmdText);  
      if   (FAILED(hr))   throw   ("Failed   to   insert   BLOB   into   Database");  
      }  
      catch(_com_error   &e)  
      {  
      DisplayError(e);  
      return   0;  
      }  
       
      表结构为:  
       
      id   number(3),  
      imeage_type   varchar2(20),  
      image   blob.   
      

  4.   

    利用AppendChunk  和  GetChunk   方法进行操作
    #import   "C:\Program   Files\Common   Files\System\ADO\msado15.dll"           no_namespace   rename("EOF",   "EndOfFile")  
      #define   ChunkSize       100  
      #include   <ole2.h>  
      #include   <stdio.h>  
      #include   "conio.h"  
      #include   "malloc.h"  
      #include   "AppendChunkX.h"  
      inline   void   TESTHR(HRESULT   x)   {if   FAILED(x)   _com_issue_error(x);};  
      void   AppendChunkX(void);  
      void   PrintProviderError(_ConnectionPtr   pConnection);  
      void   main()  
      {  
              if(FAILED(::CoInitialize(NULL)))  
                      return;  
              AppendChunkX();  
              ::CoUninitialize();  
      }  
      void     AppendChunkX(void)  
      {  
              _RecordsetPtr   pRstPubInfo   =   NULL;  
              _ConnectionPtr   pConnection   =   NULL;  
              IADORecordBinding       *picRs   =   NULL;      
              CPubInfoRs   pubrs;                     //C++   class   object        
       
              HRESULT   hr   =   S_OK;  
              _bstr_t   strCnn("Provider=sqloledb;Data   Source=srv;"  
                      "Initial   Catalog=Pubs;User   Id=sa;Password=;");  
              _bstr_t   strMessage,strPubID,strPRInfo;  
              _variant_t   varChunk;  
              long   lngOffSet,lngLogoSize;  
              char   pubId[50];  
              lngOffSet   =   0;          
              UCHAR   chData;  
              CHAR   ch;  
              SAFEARRAY   FAR   *psa;  
              SAFEARRAYBOUND   rgsabound[1];  
              rgsabound[0].lLbound   =   0;  
              rgsabound[0].cElements   =   ChunkSize;  
              try  
              {  
                      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));  
                      TESTHR(pConnection->Open(strCnn,"","",NULL));  
                      TESTHR(hr=   pRstPubInfo.CreateInstance(__uuidof(Recordset)));      
                      pRstPubInfo->CursorType   =   adOpenKeyset;  
                      pRstPubInfo->LockType   =   adLockOptimistic;  
                      TESTHR(pRstPubInfo->Open("pub_info",  
                              _variant_t((IDispatch*)pConnection,true),  
                              adOpenKeyset,adLockOptimistic,adCmdTable));  
                      TESTHR(pRstPubInfo->QueryInterface(  
                              __uuidof(IADORecordBinding),(LPVOID*)&picRs));  
                      TESTHR(picRs->BindToRecordset(&pubrs));  
                      strMessage   =   "Available   logos   are:   "   +   (_bstr_t)"\n\n";  
                      printf(strMessage);  
                      int   Counter   =   0;  
                      while(!(pRstPubInfo->EndOfFile))  
                      {    
                              printf("\n%s",pubrs.m_sz_pubid);  
                              printf("\n%s",strtok(pubrs.m_sz_prinfo,","));  
       
                              //Display   5   records   at   a   time   and   wait   for   user   to   continue.  
                              if   (++Counter   >=   5)  
                              {  
                                      Counter   =   0;  
                                      printf("\nPress   any   key   to   continue...");  
                                      getch();  
                              }  
                              pRstPubInfo->MoveNext();    
                      }  
       
                      //Prompt   For   a   Logo   to   Copy  
                      printf("\nEnter   the   ID   of   a   logo   to   copy:   ");  
                      scanf("%s",pubId);  
                      strPubID   =   pubId;  
       
                      //Copy   the   logo   to   a   variable   in   chunks  
                      pRstPubInfo->Filter   =   "pub_id   =   '"     +   strPubID   +   "'";  
                      lngLogoSize   =   pRstPubInfo->Fields->Item["logo"]->ActualSize;  
       
                      //Create   a   safe   array   to   store   the   array   of   BYTES      
                      rgsabound[0].cElements   =   lngLogoSize;  
                      psa   =   SafeArrayCreate(VT_UI1,1,rgsabound);  
       
                      long   index1   =   0;  
                      while(lngOffSet   <   lngLogoSize)  
                      {  
                              varChunk   =   pRstPubInfo->Fields->  
                                                      Item["logo"]->GetChunk(ChunkSize);  
       
                              //Copy   the   data   only   up   to   the   Actual   Size   of   Field.      
                              for(long   index=0;index<=(ChunkSize-1);index++)  
                              {  
                                      hr=   SafeArrayGetElement(varChunk.parray,&index,&chData);  
                                      if(SUCCEEDED(hr))  
                                      {  
                                              //Take   BYTE   by   BYTE   and   advance   Memory   Location  
                                              TESTHR(SafeArrayPutElement(psa,&index1,&chData));  
                                              index1++;  
                                      }  
                                      else  
                                              break;  
                              }  
                              lngOffSet   =   lngOffSet   +   ChunkSize;  
                      }  
                      lngOffSet   =   0;  
       
                      printf("Enter   a   new   Pub   Id:   ");  
                      scanf("%s",pubrs.m_sz_pubid);  
                      strPubID   =   pubrs.m_sz_pubid;  
       
                      printf("Enter   descriptive   text:   "   );  
                      scanf("%c",&ch);  
                      gets(pubrs.m_sz_prinfo);  
       
                      //   Temporarily   add   new   publisher   to   table   to   avoid   error   due      
                      //   to   foreign   key   constraint.  
                      pConnection->Execute("INSERT   publishers(pub_id)   VALUES('"   +    
                              strPubID   +   "')",NULL,adCmdText);  
                       
                      pRstPubInfo->AddNew();  
                      pRstPubInfo->Fields->GetItem("pub_id")->PutValue(strPubID);  
                      pRstPubInfo->Fields->GetItem("pr_info")->  
                              PutValue(pubrs.m_sz_prinfo);  
       
                      //Assign   the   Safe   array     to   a   variant.    
                      varChunk.vt   =   VT_ARRAY|VT_UI1;  
                      varChunk.parray   =   psa;  
                      hr   =   pRstPubInfo->Fields->GetItem("logo")->  
                                      AppendChunk(varChunk);    
       
                      //Update   the   table    
                      pRstPubInfo->Update();  
       
                      lngLogoSize   =   pRstPubInfo->Fields->Item["logo"]->ActualSize;  
       
                      //Show   the   newly   added   record.  
                      printf("New   Record   :   %s\nDescription   :   %s\nLogo   Size   :   %s\n",  
                              pubrs.m_sz_pubid,  
                              pubrs.m_sz_prinfo,(LPCSTR)(_bstr_t)pRstPubInfo->Fields->  
                              Item["logo"]->ActualSize);  
       
                      //Delete   new   records   because   this   is   demonstration.  
                      pConnection->Execute("DELETE   FROM   PUB_INFO   WHERE   pub_id   =   '"  
                                                      +   strPubID   +"'",NULL,adCmdText);  
       
                      pConnection->Execute("DELETE   FROM   publishers   WHERE   pub_id   =   '"  
                                                      +   strPubID   +"'",NULL,adCmdText);  
       
                      pRstPubInfo->Close();  
                      pConnection->Close();  
              }  
              catch(_com_error   &e)  
              {  
                      //   Notify   the   user   of   errors   if   any.  
                      _bstr_t   bstrSource(e.Source());  
                      _bstr_t   bstrDescription(e.Description());  
       
                      PrintProviderError(pConnection);  
                      printf("Source   :   %s   \n   Description   :   %s\n",  
                                      (LPCSTR)bstrSource,(LPCSTR)bstrDescription);  
              }  
      }  
       
       
      void   PrintProviderError(_ConnectionPtr   pConnection)  
      {  
              //   Print   Provider   Errors   from   Connection   object.  
              //   pErr   is   a   record   object   in   the   Connection's   Error   collection.  
              ErrorPtr     pErr       =   NULL;  
              long             nCount   =   0;          
              long             i             =   0;  
       
              if(   (pConnection->Errors->Count)   >   0)  
              {  
                      nCount   =   pConnection->Errors->Count;  
                      //   Collection   ranges   from   0   to   nCount   -1.  
                      for(i   =   0;   i   <   nCount;   i++)  
                      {  
                              pErr   =   pConnection->Errors->GetItem(i);  
                              printf("\t   Error   number:   %x\t%s",   pErr->Number,  
                                      (LPCSTR)   pErr->Description);  
                      }  
              }  
      }  
       
      AppendChunkX.h:  
       
      #include   "icrsint.h"  
       
      //This   Class   extracts   pubid,prinfo.  
       
      class   CPubInfoRs   :   public   CADORecordBinding  
      {  
              BEGIN_ADO_BINDING(CPubInfoRs)  
       
              ADO_VARIABLE_LENGTH_ENTRY2(1,   adVarChar,   m_sz_pubid,    
                        sizeof(m_sz_pubid),   l_pubid,   TRUE)  
       
              ADO_VARIABLE_LENGTH_ENTRY2(3,   adVarChar,   m_sz_prinfo,    
                        sizeof(m_sz_prinfo),   l_prinfo,   TRUE)  
       
              END_ADO_BINDING()  
       
      public:  
              CHAR       m_sz_pubid[10];  
              ULONG     l_pubid;  
              CHAR       m_sz_prinfo[200];  
              ULONG   l_prinfo;          
       
      };   
      

  5.   

    上述方法都试过了,行不通,再求方法,感谢zhangwonderful