This example demonstrates how to store a “Paint Brush” image in a Access DB.
In my code I have created a CDaoRecordset derived class for handling and reading the binary data.
Class Wizard binds a CLongBinary to the Ole Object field when creating the recordset.
CLongBinary is difficult to manage, so in the recordset, that is to receive the binary
data, I bind a CByteArray variable to the field.
Example :
::DoFieldExchange(CDaoFieldExchange* pFX) DFX_LongBinary(pFX, _T("[Images]"), m_Images);
become
DFX_Binary(pFX, _T("[Images]"), m_Images);
In CDAORecordSet the public member “CLongBinary m_Images” become “CByteArray m_Images”
The function code is :
BOOL CBLOBSDlg::ReadFromBLOB(CByteArray & DBArray) { CByteArray Array; Array.Copy( DBArray); // the header of BLOB is OLE stuff like "Paint Brush Application" .... ecc.. // the len is 78 byte ( I do not know for other headers ) int HeaderLen = 78 + sizeof(BITMAPFILEHEADER); Array.RemoveAt( 0, HeaderLen ); // I cut all Headers // some BMP information BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ; BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ; // If bmiHeader.biClrUsed is zero we have to infer the number // of colors from the number of bits used to specify it. int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount; LPVOID lpDIBBits; if( bmInfo.bmiHeader.biBitCount > 8 ) lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) + ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0)); else lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors); CClientDC dc(NULL); HBITMAP hBmp = CreateDIBitmap( dc.m_hDC, // handle to device context &bmiHeader, // pointer to bitmap size and format data CBM_INIT, // initialization flag lpDIBBits, // pointer to initialization data &bmInfo, // pointer to bitmap color-format data DIB_RGB_COLORS); // color-data usage OleBmp.Attach( hBmp ); Array.RemoveAll(); //Relese Memory return TRUE; }
Note:
1: In the example the DB path in “CString CDaoRecorset::GetDefaultDBName()” must be changed!!
2: This code is for VC++ 5
Update regarding storing a BLOB in an Access DB:
Download Project including saving BLOB – 60 KB
Date updated : 12 Feb. 1999