⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 图片access.txt

📁 dephi视频控制(Demo+源码) SendMessage做视频捕获,不要驱动
💻 TXT
字号:
11. 访问长数据
在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();




//写入一张照片到数据库:
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();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -