请教各位:我想要将大量二进制文件存入oracle数据库中,文件后缀名为.bin,二进制文件大小从10k到200k不等。我该怎样建表?存放二进制文件的字段用什么类型比较好?用VC如何存取?最好能给段代码,或提供些这方面的文章,感谢!问题解决立即结帖给分,up有分。

解决方案 »

  1.   

    我用VC+SQL SERVER 存贮过这样的二进制大文件,在SQL里我建表的时候,字段类型是image类型。不知你能否用得上,如果需要我可以给你贴出代码。
      

  2.   

    比如建立两个字段,
    一个字段存ID号码,
    另外一个字段存图片,
    create table userphoto(long ID,BLOB photo);
    然后就可以开始存图片了接下来的工作就是用vc 这边的办法来把二进制
    文件存进去.要取数据时候注意要恢复.
      

  3.   

    to cici1973(颜如玉) 
    请把代码贴出来看看吧,或许能给我些帮助。
    to zhaoshuo2113(为四里) 
    我要存的文件并非图片,只是一些数据。我是这样建表的
    create table binfile(filename varchar2(10), bindata Long RAW);
    我现在遇到的问题主要是在VC中怎样存取。能给我段代码吗?谢谢两位!
      

  4.   

    to cici1973(颜如玉) 
    发到这里:[email protected]  谢谢!
      

  5.   

    木木,你好,在这写代码有些不好排格式,但是你的邮箱又收不到,只好写在这儿了。我只是写了与存贮、取有关的代码,其它的都略去了。这段代码是我从自己的项目中摘下来的,运用于SQL数据库,不知在oracle中是否能用。原理应该是一样的。
    在表中的CtgFileData为image类型的字段//存贮二进制字段。
    //打开ctg文件
    CString strFileName("Bolb.b01") ;
    CFile fImagefile ;
    if( 0 == fImagefile.Open( strFileName , CFile::modeRead ) )
    {
    m_pRecordSet->Close() ;
    return 0 ;
    }
    BYTE* pBufForSave;
    DWORD nLength = fImagefile.GetLength() ;
    pBufForSave = new BYTE[nLength] ;
    if( pBufForSave == NULL )
    {
    m_pRecordSet->Close();
    return -1 ;//allocate memory error内存分配错误
    } ;
             //read the file into memory
    fImagefile.ReadHuge( pBufForSave , nLength ) ;  
    fImagefile.Close() ;
    //build a SAFFERRAY
    SAFEARRAY* psa ;
    SAFEARRAYBOUND rgsabound[1] ;
    rgsabound[0].lLbound = 0 ;
    rgsabound[0].cElements = nLength ;
    psa = SafeArrayCreate( VT_UI1 , 1 , rgsabound ) ; for ( long i = 0 ; i < nLength ; i++ )
    {
    SafeArrayPutElement ( psa , &i , pBufForSave++ ) ;
    } // end of for
    ///*--------------为存贮大文件定义变量-------------------
    VARIANT varBLOB ;
    varBLOB.vt = VT_ARRAY | VT_UI1 ;
    varBLOB.parray = psa ;
    ///*---------------------------------------------------
    try
    {
    m_pRecordSet->Fields->GetItem("CtgFileData")->AppendChunk(     varBLOB ) ;
    m_pRecordSet->Update();
    }
             catch(略)
                 ......//读取二进制字段。
    _variant_t varBLOB;
    //read data
    long lDataLength = m_pRecordSet->Fields->GetItem("CtgFileData")->ActualSize ;
    if ( lDataLength > 0 ) 
    {
    varBLOB = m_pRecordSet->GetFields()->GetItem("CtgFileData")->GetChunk(lDataLength) ;
    if(varBLOB.vt == (VT_ARRAY | VT_UI1))
    {
    BYTE * pBuf =NULL; 
    HRESULT ret=SafeArrayAccessData(varBLOB.parray,(void * * )&pBuf); 
    if (FAILED(ret))
    {
    ret=ret;
    if(ret==S_OK)
    ret=ret;
    if(ret==E_INVALIDARG)
    ret=ret;
    if(ret==E_UNEXPECTED)
    ret=ret;
    } // end of if
    //make file name
    CString strFileName("Blob.b01") ; //文件名
    //make end
    CFile outFile( strFileName , CFile::modeCreate|CFile::modeWrite|CFile::typeBinary   );
    outFile.WriteHuge( pBuf,lDataLength ) ;
    outFile.Close() ;       
    SafeArrayUnaccessData (varBLOB.parray) ;
    } //end if
    } //end if
    //*************************************************************************//