在VC6.0中咱們一般用Ado的Field 對象的GetChuck和AppendChunk來讀寫Blob對象,可是這樣作要寫不少的代碼,其實ado給咱們提供了一個更易操做的對象那就是 Stream Object,經過它咱們能夠更容易的操做數據庫中的Blob對象,並且能夠直接把Blob對象從數據庫保存到本地文件,或者直接讀取文件寫入到數據庫 中。下面就詳細描述如何操做。
首先申明Stream對象
_ StreamPtr pStm;
pStm.CreateInstance("ADODB.Stream");
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
pStm->PutType(adTypeBinary);//類型爲二進制
//獲得字段內容的大小
// long lDataSize = m_pRecordset->GetFields()->GetItem("photo")->ActualSize;
//m_pRecordset爲一個打開的紀錄集對象,含有photo這個blob字段
pStm->Open( varOptional,
adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());
//打開pStm
pStm->Write(_variant_t(m_pRecordset->GetFields()->GetItem("photo")->Value));
//把photo字段的內容寫入pStm
pStm->SaveToFile("c:\\publogo.jpg", adSaveCreateOverWrite);
pStm->Close();
//直接保存爲文件,若是是別的格式只要保存的時候改變後綴就能夠了
下面是若是不保存成文件能夠直接經過Com對象來繪製該圖片,IPicture 能夠顯示多種格式圖片.
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, pStm->GetSize());
LPVOID pvData = NULL;
IStream *ps;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
char * m_pBMPBuffer = new char[pStm->GetSize()+1];//分配必要的存儲空間
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(pvData,pBuf,pStm->GetSize()); //複製數據到緩衝 區 m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &ps);
}
} 數據庫
IPicture *pPic;
if(SUCCEEDED(OleLoadPicture(ps,pStm->GetSize() ,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{ 對象
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
CDC *pDC = GetClientDC();//這裏根據具體請況來取
fX=(double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY =(double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("圖像繪製失敗!");
pPic->Release();
}
這樣就完成了對圖片文件從數據庫讀出和顯示的過程。
對於從文件寫入數據庫就相對的容易多了,
_StreamPtr pStm;
pStm.CreateInstance("ADODB.Stream");
variant_t varOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
// long lDataSize = m_pRecordset->GetFields()->GetItem("photo")->ActualSize;
pStm->PutType(adTypeBinary; blog
pStm->Open( varOptional,
adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());
pStm->LoadFromFile("c:\\book.gif");//讀入文件
variant_t varBLOB=pStm->Read(adReadAll);
m_pRecordset->GetFields()->GetItem("photo")->Value= varBLOB;//保存到數據集對象。
以上就是關於ADO的Stream對象操做數據庫中的blob字段的具體方法,主要是對圖片咱們還可對它進行改形成其餘的,好比讀者能夠改形成讀取XMl文件,並保存等等。 圖片