救命啊,ado如何读出二进制的数据 SQLSERVER的数据库,ado如何读出二进制的数据 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://dev.csdn.net/develop/article/21/21088.shtm http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=185973 11. 访问长数据在Microsoft SQL中的长数据包括text、image等这样长类型的数据,作为二进制字节来对待。可以用Field对象的GetChunk和AppendChunk方法来访问。每次可以读出或写入全部数据的一部分,它会记住上次访问的位置。但是如果中间访问了别的字段后,就又得从头来了。请看下面的例子://写入一张照片到数据库:VARIANT varChunk;SAFEARRAY *psa;SAFEARRAYBOUND rgsabound[1];//VT_ARRAY | VT_UI1CFile f("h:\\aaa.jpg",CFile::modeRead);BYTE bVal[ChunkSize+1];UINT uIsRead=0;//Create a safe array to store the array of BYTES while(1){ uIsRead=f.Read(bVal,ChunkSize); if(uIsRead==0)break; rgsabound[0].cElements =uIsRead; rgsabound[0].lLbound = 0; psa = SafeArrayCreate(VT_UI1,1,rgsabound); for(long index=0;index<uIsRead;index++) { if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index]))) ::MessageBox(NULL,"啊,又出毛病了。","提示",MB_OK | MB_ICONWARNING); } varChunk.vt = VT_ARRAY|VT_UI1; varChunk.parray = psa; try{ m_pRecordset->Fields->GetItem("photo")->AppendChunk(varChunk); } catch (_com_error &e) { CString str=(char*)e.Description(); ::MessageBox(NULL,str+"\n又出毛病了。","提示",MB_OK | MB_ICONWARNING); } ::VariantClear(&varChunk); ::SafeArrayDestroyData( psa); if(uIsRead<ChunkSize)break;}//while(1) f.Close();//从数据库读一张照片:CFile f;f.Open("h:\\bbb.jpg",CFile::modeWrite|CFile::modeCreate);long lPhotoSize = m_pRecordset->Fields->Item["photo"]->ActualSize; long lIsRead=0;_variant_t varChunk;BYTE buf[ChunkSize];while(lPhotoSize>0){ lIsRead=lPhotoSize>=ChunkSize? ChunkSize:lPhotoSize; varChunk = m_pRecordset->Fields-> Item["photo"]->GetChunk(lIsRead); for(long index=0;index<lIsRead;index++) { ::SafeArrayGetElement(varChunk.parray,&index,buf+index); } f.Write(buf,lIsRead); lPhotoSize-=lIsRead;}//while()f.Close(); http://www.vckbase.com/document/viewdoc/?id=252 建议用:_StreamPtr对象可直接读取文件,然后挂接数据库的_RecordSetPtr,再后Update即可 USB转串口:设备无法打开 CFormView 用Create函数怎么创建?? 在CListCtrl中显示文本,不能完全显示出来的问题!!感觉真的很麻烦 3721,你为何不思悔改,让别人怎么说你才好! CFile类的的文件怎么删除内容 初学者的疑惑( 同志们。如何将mpeg2转换成mp3文件呀 一个关于时间的问题----SOS!!~ 大家推荐一本非常好的,值得看的数据结构的书来看看先,谢谢后! 菜,,,菜,,菜,,我太菜。。。。。。。 BLENDFUNCTION结构中有一字段的解释不明! 简单的多线程问题,Up有分!
在Microsoft SQL中的长数据包括text、image等这样长类型的数据,作为二进制字节来对待。
可以用Field对象的GetChunk和AppendChunk方法来访问。每次可以读出或写入全部数据的一部分,它会记住上次访问的位置。但是如果中间访问了别的字段后,就又得从头来了。
请看下面的例子:
//写入一张照片到数据库:
VARIANT varChunk;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];//VT_ARRAY | VT_UI1
CFile f("h:\\aaa.jpg",CFile::modeRead);
BYTE bVal[ChunkSize+1];
UINT uIsRead=0;
//Create a safe array to store the array of BYTES
while(1)
{
uIsRead=f.Read(bVal,ChunkSize);
if(uIsRead==0)break;
rgsabound[0].cElements =uIsRead;
rgsabound[0].lLbound = 0;
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
for(long index=0;index<uIsRead;index++)
{
if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index])))
::MessageBox(NULL,"啊,又出毛病了。","提示",MB_OK | MB_ICONWARNING);
}
varChunk.vt = VT_ARRAY|VT_UI1;
varChunk.parray = psa;
try{
m_pRecordset->Fields->GetItem("photo")->AppendChunk(varChunk);
}
catch (_com_error &e)
{
CString str=(char*)e.Description();
::MessageBox(NULL,str+"\n又出毛病了。","提示",MB_OK | MB_ICONWARNING);
}
::VariantClear(&varChunk);
::SafeArrayDestroyData( psa);
if(uIsRead<ChunkSize)break;
}//while(1)
f.Close();//从数据库读一张照片:
CFile f;
f.Open("h:\\bbb.jpg",CFile::modeWrite|CFile::modeCreate);
long lPhotoSize = m_pRecordset->Fields->Item["photo"]->ActualSize;
long lIsRead=0;_variant_t varChunk;
BYTE buf[ChunkSize];
while(lPhotoSize>0)
{
lIsRead=lPhotoSize>=ChunkSize? ChunkSize:lPhotoSize;
varChunk = m_pRecordset->Fields->
Item["photo"]->GetChunk(lIsRead);
for(long index=0;index<lIsRead;index++)
{
::SafeArrayGetElement(varChunk.parray,&index,buf+index);
}
f.Write(buf,lIsRead);
lPhotoSize-=lIsRead;
}//while()
f.Close();
_StreamPtr对象可直接读取文件,然后挂接数据库的_RecordSetPtr,再后Update即可