高分求教:oracle中二进制文件存储问题 请教各位:我想要将大量二进制文件存入oracle数据库中,文件后缀名为.bin,二进制文件大小从10k到200k不等。我该怎样建表?存放二进制文件的字段用什么类型比较好?用VC如何存取?最好能给段代码,或提供些这方面的文章,感谢!问题解决立即结帖给分,up有分。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用VC+SQL SERVER 存贮过这样的二进制大文件,在SQL里我建表的时候,字段类型是image类型。不知你能否用得上,如果需要我可以给你贴出代码。 比如建立两个字段,一个字段存ID号码,另外一个字段存图片,create table userphoto(long ID,BLOB photo);然后就可以开始存图片了接下来的工作就是用vc 这边的办法来把二进制文件存进去.要取数据时候注意要恢复. to cici1973(颜如玉) 请把代码贴出来看看吧,或许能给我些帮助。to zhaoshuo2113(为四里) 我要存的文件并非图片,只是一些数据。我是这样建表的create table binfile(filename varchar2(10), bindata Long RAW);我现在遇到的问题主要是在VC中怎样存取。能给我段代码吗?谢谢两位! to cici1973(颜如玉) 发到这里:[email protected] 谢谢! 木木,你好,在这写代码有些不好排格式,但是你的邮箱又收不到,只好写在这儿了。我只是写了与存贮、取有关的代码,其它的都略去了。这段代码是我从自己的项目中摘下来的,运用于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//*************************************************************************// BCGControlbar9.56安装问题 一个菜鸟问题 MFC大菜鸟的疑问--关于图标和日期 谁知道怎么读取显卡的型号和显存大小等,除了用读注册表的方法? ★请问大家VISUAL STUDIO 6.0 英文企业版哪里有下? 顶楼上那个根本不能下了~ 网络编程中多个线程的问题 如何求正弦曲线和其他任意曲线的长度? 怎样调试在ASP中使用的COM? 如何用month calendar contrl? 请问FAT32格式和NTFS格式有什么不同?各有什么优点? 有没有哪个用过CSerialPort写串口程序?? 请高手回答。
一个字段存ID号码,
另外一个字段存图片,
create table userphoto(long ID,BLOB photo);
然后就可以开始存图片了接下来的工作就是用vc 这边的办法来把二进制
文件存进去.要取数据时候注意要恢复.
请把代码贴出来看看吧,或许能给我些帮助。
to zhaoshuo2113(为四里)
我要存的文件并非图片,只是一些数据。我是这样建表的
create table binfile(filename varchar2(10), bindata Long RAW);
我现在遇到的问题主要是在VC中怎样存取。能给我段代码吗?谢谢两位!
发到这里:[email protected] 谢谢!
在表中的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
//*************************************************************************//