从数据库中读写图片
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;
}
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;
}
相关文章推荐
- 用 iPhone 的 sqlite 数据库读写图片
- 关于SQLite 数据库 读写图片的问题
- [翻译]代码片断:如何用二进制格式读写图片到数据库
- 用VB6读写数据库中的图片
- 基于winform的二进制图片数据的存取(用于数据库照片的读写处理)
- VB中如何实从数据库中读写二进制图片信息
- asp.net读写二进制图片到数据库
- 如何读写数据库二进制图片
- 【學習筆記】sqlite 数据库读写图片
- 用 iPhone 的 sqlite 数据库读写图片
- 基于winform的二进制图片数据的存取(用于数据库照片的读写处理)
- 数据库读写图片
- 用 iPhone 的 sqlite 数据库读写图片
- VB ADO 用二进制方式来读写文件 入数据库 __________请参考(把文件(包括图片)存入数据库)
- Oracle读写数据库图片
- 透过 ASP.NET 和数据库读写图片
- 用 iPhone 的 sqlite 数据库读写图片
- c#读写数据库图片
- C# 读写数据库图片
- 基于SSH的数据库中图片的读写