Click here to Skip to main content
6,595,444 members and growing! (17,837 online)
Email Password   helpLost your password?
Database » Database » General     Intermediate

Using CLongBinary for BLOBs

By Shekar Narayanan

SQL, VC6, SQL Server, DBA, Dev
Posted:30 Nov 1999
Views:118,718
Bookmarked:37 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
31 votes for this article.
Popularity: 7.13 Rating: 4.78 out of 5

1

2
1 vote, 7.7%
3
1 vote, 7.7%
4
11 votes, 84.6%
5
  • Download demo project - 29 Kb
  • Sample Image - UsingBlob.gif

    At times, storing images and other types of documents like word document, or excel spread sheet or even a compressed zip file in the database is inevitable. MFC provides a supporting class to handle these BLOBs called CLongBinary. It is just a wrapper around the HGLOBAL of WIN32. But how do you use it? The wizard creates a member variable of type CLongBinary in your record set object and also creates the corresponding RFX routine (RFX_LongBinary).

    Okay, does it mean that you can use this member just like any other variable? No, That's where this document comes in handy. For regular data types, all you have to is create an instance of the recordset object, assign the values and call Update. But for BLOBs, you have to do something special. For inserting BLOBs, you have to remember 3 points.

    1. Allocate and lock the storage buffer using GlobalAlloc() and GlobalLock() calls
    2. Prepare the recordset for blob operation using SetFieldDirty() and SetFieldNull() calls
    3. Unlock the storage buffer

    By default, the destructor of the CLongBinary will delete the buffer using GlobalFree() call. So you don't have to bother about freeing the memory. Reading from the database is pretty simple. All you have to do is lock the buffer.

    Following code snippet shows how to do this in the actual code:

    // Store the Image to database table
    
    // 
    
    try
    {
        dbImages.Open();
        dbImages.AddNew();
    
        CFile	fileImage;
        CFileStatus	fileStatus;
    
        fileImage.Open("c:\\winnt\\winnt256.bmp", CFile::modeRead);
        fileImage.GetStatus(fileStatus);
    
        dbImages.m_BLOBName = fileImage.GetFileTitle();
        dbImages.m_BLOBImage.m_dwDataLength = fileStatus.m_size;
    
        HGLOBAL hGlobal		= GlobalAlloc(GPTR,fileStatus.m_size);
        dbImages.m_BLOBImage.m_hData = GlobalLock(hGlobal);
    
        fileImage.ReadHuge(dbImages.m_BLOBImage.m_hData,fileStatus.m_size);
    
        dbImages.SetFieldDirty(&dbImages.m_BLOBImage);
        dbImages.SetFieldNull(&dbImages.m_BLOBImage,FALSE);
        dbImages.Update();
    
        GlobalUnlock(hGlobal);
    
        dbImages.Close();
    
        pList->InsertItem(0,fileImage.GetFileTitle());
    }
    catch(CException* pE)
    {
        pE->ReportError();
        pE->Delete();
        return;
    }

     

    // To restore image from db table
    
    CdbImages   dbImages(&theApp.m_DB);
    CString     strFileName = pList->GetItemText(nIndex,0);
    dbImages.m_strFilter.Format("BLOBName = '%s'",strFileName);
    try
    {
        dbImages.Open();
        if  (dbImages.IsEOF())
            AfxMessageBox("Unable to get image from db");
        else
        {
            char    tmpPath[_MAX_PATH+1];
            GetTempPath(_MAX_PATH,tmpPath);
    
            strFileName.Insert(0,tmpPath);
            
            CFile	outFile(strFileName,CFile::modeCreate|CFile::modeWrite);
            LPSTR	buffer = (LPSTR)GlobalLock(dbImages.m_BLOBImage.m_hData);
            outFile.WriteHuge(buffer,dbImages.m_BLOBImage.m_dwDataLength);
            GlobalUnlock(dbImages.m_BLOBImage.m_hData);
            outFile.Close();
    
            theApp.OpenDocumentFile(strFileName);
        }
    
        dbImages.Close();
    
    }
    catch(CException* pE)
    {
        pE->ReportError();
        pE->Delete();
        return;
    }
    
    

    The demo project uses an Access database to store the images. This project also demonstrates the following:

    • DSN - less Connection to MS Access database
    • Dialog Bars
    • Image Display in CScrollView

    The images are displayed using the simplest technique of using BitBlt() call. It does not use any Palettes because it is beyond the scope of this article.

    License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here

    About the Author

    Shekar Narayanan


    Member

    Location: United States United States

    Other popular Database articles:

    Article Top
    You must Sign In to use this message board.
    FAQ FAQ 
     
    Noise Tolerance  Layout  Per page   
     Msgs 1 to 25 of 42 (Total in Forum: 42) (Refresh)FirstPrevNext
    Generalerror C2039: 'WriteHuge' : is not a member of 'CFile' g:\mainfrm.cpp and Error and error C2039: 'ReadHuge' : is not a member of 'CFile' g:\mainfrm.cpp 205 PinmemberKYAW KYAW OO18:49 31 Jul '08  
    GeneralRe: error C2039: 'WriteHuge' : is not a member of 'CFile' g:\mainfrm.cpp and Error and error C2039: 'ReadHuge' : is not a member of 'CFile' g:\mainfrm.cpp 205 PinmemberRolando E. Cruz-Marshall3:04 26 Sep '08  
    GeneralReally Good Pinmembermanish rastogi0:48 3 Jul '08  
    Generalsome question about insert images,please tell me! Pinmemberfreesky3234:03 25 Jan '07  
    Questionnew record Pinmemberali212121212121215:36 9 May '06  
    Generalhow to insert image to SQL server Pinmemberthanhthuyvn_vtajkhskjakjd21:18 12 Nov '05  
    GeneralBLOB Pinmemberpmk_82:04 20 Jun '05  
    GeneralAn annotation Pinmemberbuho_usp5:17 7 Jun '05  
    GeneralODBC Crash with CLongBinary PinsussAnonymous23:53 21 Oct '04  
    GeneralODBC Crash with CLongBinary PinsussAnonymous23:34 21 Oct '04  
    Generaldo the method work when considering oracle Pinmemberxuyang_deng22:28 21 Apr '04  
    GeneralCByteArray Pinmembermjwilliamson2:16 16 Mar '04  
    GeneralExcel files PinmemberAl Findlay8:12 17 Feb '04  
    GeneralError: Data truncated Pinmembermef5267:06 3 Jul '03  
    GeneralRe: Error: Data truncated Pinmemberwancol22:59 25 Aug '03  
    Generalproblem when call update() PinmemberCS42922:24 1 Jul '03  
    GeneralCan u give an example with ADO about how to save a CLongBinary into database? Pinmemberztliu0123:22 4 Jun '03  
    GeneralStore Images with RecordsetPtr Pinmemberjsundjsund22:57 7 Apr '03  
    GeneralOut of memory error with Sybase PinmemberStan Harris17:10 20 Feb '03  
    GeneralRe: Out of memory error with Sybase PinmemberWes Jones9:06 28 Jul '06  
    GeneralHow to Delete or Modify a BLOB? PinsussMate16:48 7 Jan '03  
    GeneralRe: How to Delete or Modify a BLOB? PinsussBen Mathews11:42 13 Feb '03  
    GeneralRe: How to Delete or Modify a BLOB? Pinmemberipadilla7:31 4 Sep '05  
    GeneralProblem while updating the BLOB to ORACLE using CLongBinary PinmemberMytreya4:14 25 Mar '02  
    GeneralRe: Problem while updating the BLOB to ORACLE using CLongBinary PinmemberDiWa6:18 7 Aug '02  

    General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

    PermaLink | Privacy | Terms of Use
    Last Updated: 30 Nov 1999
    Editor: Chris Maunder
    Copyright 1999 by Shekar Narayanan
    Everything else Copyright © CodeProject, 1999-2009
    Web18 | Advertise on the Code Project