//下面是我從資料庫中提取圖片資訊的代碼
char *pBuff = NULL;//用于存放位圖的記憶體空間
try
{
if (m_pRecordset != NULL)
{
m_pRecordset->Close();
}
//m_pRecordset->Open(bstrRecordset,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM Table_1",
_variant_t((IDispatch *)m_pConnection, true),
adOpenDynamic, adLockPessimistic, adCmdText);
/*_bstr_t bstrSQL;
bstrSQL = "select*from photo";
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);*/
long DataSize;//在資料庫中讀取出來的位圖的大小
m_pRecordset->MoveLast();//移動到記錄最后,保證最新資料
DataSize = m_pRecordset->Fields->GetItem("photo")->ActualSize;//得到位圖欄位的大小
if (DataSize > 0)//判斷那個位圖欄位是否為空
{
_variant_t TheValue;//存盤讀出來的資料
TheValue = m_pRecordset->GetFields()->GetItem("photo")->GetChunk(DataSize);//讀取欄位一
//TheValue=https://bbs.csdn.net/topics/m_pRecordset->GetCollect("photo");
if (TheValue.vt == (VT_ARRAY | VT_UI1))
{
pBuff = new char[DataSize + 1];
if (pBuff)
{
char *buff = NULL;
SafeArrayAccessData(TheValue.parray, (void**)&buff);//把位圖資料放到buff中去
memcpy(pBuff, buff, DataSize);//把位圖資料放到pBuff中
SafeArrayUnaccessData(TheValue.parray);//釋放
m_pBMPBuffer = new char[DataSize + 1];//開辟符陣列
memcpy(m_pBMPBuffer, pBuff, DataSize);
HBITMAP hBitmap = NULL;//定義一個HBITMAP物件,用于顯示位圖用
LPSTR hDIB, lpBuffer = m_pBMPBuffer;
LPVOID lpDIBBits;
BITMAPFILEHEADER bmfHeader;
DWORD bmfHeaderLen;
//獲得位圖的頭資訊
bmfHeaderLen = sizeof(bmfHeader);
//strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);
memcpy(&bmfHeader, lpBuffer, bmfHeaderLen);
//根據獲得的資訊頭判斷是否是位圖
if (bmfHeader.bfType != (*(WORD*)"BM"))
{
AfxMessageBox(_T("this is not bitmap!"));
return;
}
//獲取位圖資料
hDIB = lpBuffer + bmfHeaderLen;//將指標移動到檔案頭的后面
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB;
lpDIBBits = (lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;//偏移位元組數
//創建位圖
CClientDC dc(this);
hBitmap = CreateDIBitmap(dc.m_hDC, &bmiHeader,
CBM_INIT, lpDIBBits, &bmInfo, DIB_RGB_COLORS);
//顯示位圖
CBitmap bmp;//定義位圖變數
bmp.Attach(hBitmap);
BITMAP bm;//定義一個位圖結構
bmp.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(GetDC());//創建一個兼容的DC
CBitmap *poldBitmap = (CBitmap*)dcMem.SelectObject(bmp); //將位圖選入設備環境類
CRect lRect;//定義一個區域
CStatic *pstatic = (CStatic*)GetDlgItem(IDC_STATIC_pp);
pstatic->GetClientRect(&lRect);//獲取控制元件的客戶區域
lRect.NormalizeRect();
pstatic->GetDC()->StretchBlt(lRect.left, lRect.top, lRect.Width(), lRect.Height(),
&dcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); //顯示位圖
dcMem.SelectObject(&poldBitmap); //將原有的句柄選入設備環境
bmp.DeleteObject();
/*cv::Mat img;
if (HBitmapToMat(hBitmap, img))
{
DrawMat1(img, IDC_STATIC_pp);
MessageBox(_T("成功"));
}
else
{
MessageBox(_T("轉換失敗"));
}*/
}
}
}
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
//MessageBox(_T("打開資料表失敗!"));
return;
}
除錯之后錯誤的資訊顯示

求大佬們教教我
uj5u.com熱心網友回復:
C++使用ADO存取圖片轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/20126.html
標籤:數據庫
