还没试过
看oracle 文档把

解决方案 »

  1.   

    int ocinode::blob_locator(AnsiString no_flag) {//  AnsiString sqlstmt;
    //  sqlstmt="select picture from media where number_of_picture=";
      AnsiString sqlstmt=no_flag;
     //sqlstmt=(text *) "select picture from media where number_of_picture='z888888888888888888001110000001001' ";   if (OCIStmtPrepare(stmthp, errhp, sqlstmt.c_str(), (ub4) sqlstmt.Length(),
                        (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT))
      {
        (void) printf("FAILED: OCIStmtPrepare() sqlstmt\n");
        return OCI_ERROR;
      }
     if( OCIDefineByPos(stmthp, &defnp2, errhp, (ub4) 1,
                         (dvoid *) &blob, (sb4) -1, (ub2) SQLT_BLOB,
                         (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, (ub4) OCI_DEFAULT))
      {
        (void) printf("FAILED: OCIDefineByPos()\n");
        return OCI_ERROR;
      }  /* execute the select and fetch one row */
      if (OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
                        (CONST OCISnapshot*) 0, (OCISnapshot*) 0,
                        (ub4) OCI_DEFAULT))
      {    /* sword OCIErrorGet ( dvoid      *hndlp,
                        ub4        recordno,
                        text       *sqlstate,
                        sb4        *errcodep,
                        text       *bufp,
                        ub4        bufsiz,
                        ub4        type ); */
       text  msgbuf[512];
       sb4   errcode = 0;  (void) OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
                           msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR);   return OCI_ERROR;
      }    return OCI_SUCCESS;
    }//------------------------------------------------------------------------------
    /*
      关于写图片的想法:  1:用上面的blob_locator()函数实现blob字段的locator定位,前面返回的就是一个blob_locator 的指针  2:下面就是用stream_to_file()函数实现的东西了,呵呵,整各功能的实现就ok了,呵呵*/
    int ocinode::stream_write_lob(OCILobLocator *lobl,FILE *FP)
    {
      char   *bufp[MAXBUFLEN];
      ub4   offset = 1;
      ub4   loblen = 0;
      ub4   amtp;
      ub1   piece;
      sword retval;
      int   readval;
      ub4   len = 0;
      ub4   nbytes;
      ub4   filelen;
      ub4   remainder;  if (FP==NULL)
          {
          return -1;
          }    fseek(FP, 0, SEEK_END);
        filelen = (ftell(FP));
       remainder = filelen;
       amtp = filelen;   OCILobGetLength(svchp, errhp, lobl, &loblen);    fseek(FP, 0, 0);   ////////////////////////////////////////////////////   //开始具体的读图片了,呵呵   if (filelen > MAXBUFLEN)
        nbytes = MAXBUFLEN;
       else
        nbytes = filelen;    *bufp="";
       int i=fread(bufp, nbytes, 1, FP);
       if (i!=1)
        {
        return -1;
        }  remainder -= nbytes;  if (remainder == 0)       /* exactly one piece in the file */
      {
        if ( (retval = OCILobWrite(svchp, errhp, lobl, &amtp, offset, (dvoid *) bufp,
        (ub4) nbytes, OCI_ONE_PIECE, (dvoid *)0,
        (sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0,
        (ub2) 0, (ub1) SQLCS_IMPLICIT) )!= OCI_SUCCESS)
        {
          return -1;
        }  }
      else                     /* more than one piece */
      {    if (OCILobWrite(svchp, errhp, lobl, &amtp, offset, (dvoid *) bufp,
        (ub4) MAXBUFLEN, OCI_FIRST_PIECE, (dvoid *)0,
        (sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0,
        (ub2) 0, (ub1) SQLCS_IMPLICIT) != OCI_NEED_DATA)
        {
          return -1;
        }    piece = OCI_NEXT_PIECE;
        do
        {
          *bufp="";
          if (remainder > MAXBUFLEN)
    nbytes = MAXBUFLEN;      else
          {
    nbytes = remainder;
    piece = OCI_LAST_PIECE;
          }      if (fread((void *)bufp, (size_t)nbytes, 1, FP) != 1)
          {
    piece = OCI_LAST_PIECE;
          }      retval = OCILobWrite(svchp, errhp, lobl, &amtp, offset, (dvoid *) bufp,
      (ub4) nbytes, piece, (dvoid *)0,
      (sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0,
      (ub2) 0, (ub1) SQLCS_IMPLICIT);
          remainder -= nbytes;
          /////////////////////////////////
          if (retval==OCI_ERROR)
     {
       int errcode;
       char *errbuf;   (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,
    errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
      // ShowMessage(IntToStr(errcode));
     }
          ////////////////////////////////    } while (retval == OCI_NEED_DATA && !feof(FP));
      }  if (retval != OCI_SUCCESS)
      {
        return -1;
      }
      fclose(FP);
      //fclose(fp_test);
      OCITransCommit (svchp,errhp,OCI_DEFAULT);
      return 0;}
    ///////////////////////////////////////////////////////////////////////////////////