从数据库中读写图片

来源:互联网 发布:淘宝卖家怎么开通达人 编辑:程序博客网 时间:2024/05/22 15:58

 写图片进数据库(SQL Server 2000):

 

DWORD            m_nFileLen;
    
char            *m_pBMPBuffer;
    BOOL            m_bNewUser;
    CFile file;
    
if!file.Open( "D:/MAP.bmp", CFile::modeRead) )
        
return ;
    m_nFileLen 
= file.GetLength();
    m_pBMPBuffer 
= new char[m_nFileLen + 1];
    
if(!m_pBMPBuffer)
        
return ;
    
if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)
        
return ;

    CADOConn m_all;
    _RecordsetPtr m_pRecordset;
    
char            *pBuf = m_pBMPBuffer;
    VARIANT            varBLOB;
    SAFEARRAY        
*psa;
                     SAFEARRAYBOUND    rgsabound[
1];
    
    m_pRecordset.CreateInstance(
"ADODB.Recordset");
    m_pRecordset 
= m_all.GetRecordSet((_bstr_t)("SELECT * FROM TroubleInfo"));
    m_pRecordset
->AddNew();
    m_pRecordset
->PutCollect("Number",_variant_t("1"));
    m_pRecordset
->PutCollect("Status",_variant_t("T"));
    
if(pBuf)
    
{    
        rgsabound[
0].lLbound = 0;
        rgsabound[
0].cElements = m_nFileLen;
        psa 
= SafeArrayCreate(VT_UI1, 1, rgsabound);
        
for (long i = 0; i < (long)m_nFileLen; i++)
            SafeArrayPutElement (psa, 
&i, pBuf++);
        varBLOB.vt 
= VT_ARRAY | VT_UI1;
        varBLOB.parray 
= psa;
        m_pRecordset
->GetFields()->GetItem("Picture")->AppendChunk(varBLOB);
    }

    m_pRecordset
->Update();

 

从数据库中读取图片:

 

HBITMAP hbmp;
int     m_Length;
int    m_nMaxWidth;
int    m_nMaxHeight;
char    *m_pBMPBuffer;

HBITMAP CMyScrollView::BufferToHBITMAP()
{
    HBITMAP    hBmp;
    LPSTR hDIB,lpBuffer 
= m_pBMPBuffer;
    LPVOID lpDIBBits;
    BITMAPFILEHEADER bmfHeader;
    DWORD bmfHeaderLen;
    bmfHeaderLen 
= sizeof(bmfHeader);
    strncpy((LPSTR)
&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
    
if (bmfHeader.bfType != (*(WORD*)"BM"))
    
{
        
return NULL;
    }

    hDIB 
= lpBuffer + bmfHeaderLen;
    BITMAPINFOHEADER 
&bmiHeader = *(LPBITMAPINFOHEADER)hDIB;
    BITMAPINFO 
&bmInfo = *(LPBITMAPINFO)hDIB;
    
    m_nMaxWidth 
= bmiHeader.biWidth;
    m_nMaxHeight 
= bmiHeader.biHeight;
    
    lpDIBBits
=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;
    CClientDC dc(
this);
    hBmp 
= CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
    
return hBmp;
}


BOOL CMyScrollView::ShowBitmap()
{
    CString m_sql;
    
//读取照片二进制表示
    m_sql = "select * from TroubleInfo where Status = 'T'";
    
try
    
{
        _RecordsetPtr pRst;
        pRst 
= m_ado.GetRecordSet((_bstr_t)m_sql);
        
long lDataSize = pRst->GetFields()->GetItem("Picture")->ActualSize;
        
if(lDataSize>0)
        
{
            _variant_t varPhoto;
            varPhoto 
= pRst->GetFields()->GetItem("Picture")->GetChunk(lDataSize);
            
if(varPhoto.vt == (VT_ARRAY|VT_UI1))
            
{
                
if(m_pBMPBuffer = new char[lDataSize+1])
                
{
                    
char *pBuf = NULL;
                    SafeArrayAccessData(varPhoto.parray,(
void **)&pBuf);
                    memcpy(m_pBMPBuffer,pBuf,lDataSize);
//图形二进制缓冲区
                    SafeArrayUnaccessData(varPhoto.parray);
                    m_Length 
= lDataSize;//图形二进制长度
                    hbmp = BufferToHBITMAP();
                }

            }

        }

    }

    
catch (...) 
    
{
        MessageBox(
"数据库错误,电路图读取失败!","系统提示");
        
return FALSE;
    }

    
return TRUE;
}
原创粉丝点击