大家好怎样读取blob类型的数据 MYSQL 中 大家好怎样读取blob类型的数据 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HGLOBAL hgImageMem = NULL;LPVOID lpvImageMem = NULL; long lImageSize = rs->GetFields()->GetItem("图片")->ActualSize;if(lImageSize > 0){ _variant_t varImage; varImage = rs->GetFields()->GetItem("图片")->GetChunk(lImageSize); if(varImage.vt == (VT_ARRAY | VT_UI1)) { hgImageMem = GlobalAlloc(GHND, lImageSize); if(hgImageMem!=NULL) { lpvImageMem = GlobalLock( hgImageMem); char *pBuffer= NULL; SafeArrayAccessData(varImage.parray,(void **)&pBuffer); CopyMemory(lpvImageMem,pBuffer,lImageSize); SafeArrayUnaccessData (varImage.parray); CFile file("a.jpg",CFile::modeWrite|CFile::modeCreate); file.Write(lpvImageMem,lImageSize); file.Close(); } }} GlobalUnlock(hgImageMem); lpvImageMem=NULL; GlobalFree(hgImageMem); 从数据库中读取到richedit _bstr_t bstrConn="Provider=Microsoft.Jet.OLEDB.4.0;" "Data Source=E:\\vc\\test.mdb;" "User Id=Admin;Password=;"; _RecordsetPtr rs=NULL; long lLength=0L; _variant_t varText; try { rs.CreateInstance(__uuidof(Recordset)); rs->Open("[longText]",bstrConn, adOpenKeyset, adLockOptimistic, adCmdTable); if(!rs->GetBOF()) rs->MoveFirst(); lLength= rs->GetFields()->GetItem("text")->ActualSize; LPTSTR pszBuffer= NULL; varText = rs->GetFields()->GetItem("text")->GetChunk(lLength); if(varText.vt == (VT_ARRAY | VT_UI1)) { SafeArrayAccessData(varText.parray,(void **)&pszBuffer); CopyMemory(m_strRichedit.GetBufferSetLength(lLength),pszBuffer,lLength); SafeArrayUnaccessData (varText.parray); } } catch (_com_error e) { PrintComError(e); } rs->Close(); UpdateData(FALSE); 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(); RichEdit 截图图片的信息 如何实现这样的界面? 想得到一份去除宏指定的编译指令中代码的清晰的代码,有没有办法或者工具? ***************急急!就是说怎样把Virtual key (VK_*)转换成Ascii字符?应该有这样的一个函数吧?我忘记了 关于WM_KEYDOWN的响应小问题!! 关于CStdioFile类,帮帮忙! 很奇怪的问题 如何在程序刚开始时,让Radiao按钮选中默认的按钮? 在VC6下如何编译纯DOS程序 变速齿轮原理 数据库同步问题 来来来,大家一起进来靠一下,马上结贴!
LPVOID lpvImageMem = NULL; long lImageSize = rs->GetFields()->GetItem("图片")->ActualSize;if(lImageSize > 0)
{
_variant_t varImage;
varImage = rs->GetFields()->GetItem("图片")->GetChunk(lImageSize);
if(varImage.vt == (VT_ARRAY | VT_UI1))
{
hgImageMem = GlobalAlloc(GHND, lImageSize);
if(hgImageMem!=NULL)
{
lpvImageMem = GlobalLock( hgImageMem);
char *pBuffer= NULL;
SafeArrayAccessData(varImage.parray,(void **)&pBuffer);
CopyMemory(lpvImageMem,pBuffer,lImageSize);
SafeArrayUnaccessData (varImage.parray);
CFile file("a.jpg",CFile::modeWrite|CFile::modeCreate);
file.Write(lpvImageMem,lImageSize);
file.Close();
}
}
} GlobalUnlock(hgImageMem);
lpvImageMem=NULL;
GlobalFree(hgImageMem);
"Data Source=E:\\vc\\test.mdb;"
"User Id=Admin;Password=;"; _RecordsetPtr rs=NULL;
long lLength=0L;
_variant_t varText; try
{
rs.CreateInstance(__uuidof(Recordset));
rs->Open("[longText]",bstrConn, adOpenKeyset, adLockOptimistic, adCmdTable);
if(!rs->GetBOF())
rs->MoveFirst();
lLength= rs->GetFields()->GetItem("text")->ActualSize;
LPTSTR pszBuffer= NULL;
varText = rs->GetFields()->GetItem("text")->GetChunk(lLength);
if(varText.vt == (VT_ARRAY | VT_UI1))
{
SafeArrayAccessData(varText.parray,(void **)&pszBuffer);
CopyMemory(m_strRichedit.GetBufferSetLength(lLength),pszBuffer,lLength);
SafeArrayUnaccessData (varText.parray);
} }
catch (_com_error e)
{
PrintComError(e);
}
rs->Close();
UpdateData(FALSE);
在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();