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