您的位置:首页 > 数据库

从数据库中读写图片

2007-08-02 19:07 106 查看
写图片进数据库(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;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: