vc mfc 图片存储mssql数据库中及显示

//add pic to database; the column save image type must image 
void CBmpDlgDlg::WriteImage2DB(CString path)
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();


try
{ 
CFile fileAdd;
 
if (fileAdd.Open ("Debug\\nv.bmp",CFile::modeRead) == 0) // open the file
return;
 
_variant_t varChunk;
 
long m_nFileLen = fileAdd.GetLength();
BYTE * m_pBMPBuffer;
m_pBMPBuffer = new BYTE[m_nFileLen];
 
if (m_pBMPBuffer == NULL)
return;
fileAdd.Read(m_pBMPBuffer,m_nFileLen); 

 
char * pBuf = (char *)m_pBMPBuffer;
VARIANT varBLOB;
SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[1];
/****/


CString strSQL; 
_bstr_t bstr; 


strSQL.Format(_T("select count(*) as num, Max(ID) as maxid from pic"));
_RecordsetPtr   m_pRecordset;
try
{
m_pRecordset = m_AdoConn.GetRecordset((_bstr_t)strSQL);
}
catch (_com_error &e)
{
AfxMessageBox("获取最大id失败");
}

//从RecordSet中获取数据数目和当前数据库中最大的ID。
long num =m_pRecordset->GetCollect("num");
long maxid;


   try
{
if (num != 0)
{
maxid = m_pRecordset->GetCollect("maxid");
}
else
{
maxid = 0;
} 
}
catch (_com_error &e)
{
AfxMessageBox(e.Description());
} 

strSQL.Format(_T("Select * from pic where ID = %d"), maxid);
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset = m_AdoConn.GetRecordset((_bstr_t)strSQL);

m_pRecordset-> AddNew();
m_pRecordset-> PutCollect ("name", _variant_t ("Mike")); //add data to db by column


if (pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_nFileLen;
psa = SafeArrayCreate (VT_UI1, 1, rgsabound); /// Create a SAFEARRAY object
for (long i = 0; i<(long)m_nFileLen; i++)
SafeArrayPutElement (psa,&i, pBuf++); /// pBuf point binary data saved to the SAFEARRAY object psa,

varBLOB.vt = VT_ARRAY | VT_UI1; /// varBLOB type is set to an array of type BYTE
varBLOB.parray = psa; /// for varBLOB variable assignment
m_pRecordset->GetFields ()->GetItem ("pic")->AppendChunk(varBLOB) ;/// BLOB type data
} 

m_pRecordset->Update(); //update data
m_AdoConn.ExitConnect(); 

AfxMessageBox("添加数据成功!");
    }
}

//get pic data from databse and   path gen pic
int CSS628DDlg::CreateImageByBinData(CString path,CString m_IDNum)
{
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
    int m_retv=0;
try
{ 
CString strSQL; 
_bstr_t bstr; 
_RecordsetPtr m_pRecordset;


/****************************************************/
//Read from the database out of the picture
strSQL.Format(_T("Select * from IdCard where IDNum = '%s'"),m_IDNum);
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset = m_AdoConn.GetRecordset((_bstr_t)strSQL);
long lDataLength = m_pRecordset->GetFields()-> GetItem(_variant_t ("Img"))-> ActualSize;
 
m_AdoConn.m_pRecordset->adoEOF;

if(!m_AdoConn.m_pRecordset->adoEOF)
{ 
m_strIDNum=m_IDNum;




if (lDataLength> 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields ()->GetItem(_variant_t ("Img"))->GetChunk (lDataLength);
 
if (varBLOB.vt == (VT_ARRAY|VT_UI1) && varBLOB.vt != VT_EMPTY && varBLOB.vt != VT_NULL)
{
BYTE * pBuf = NULL;
pBuf = (BYTE *) GlobalAlloc (GMEM_FIXED, lDataLength);
 
SafeArrayAccessData (varBLOB.parray, (void **)&pBuf);
 
CFile outFile(path,CFile::modeCreate | CFile::modeWrite); // construct a new file, if the file exists, the length becomes 0
outFile.Write(pBuf,lDataLength);
outFile.Close();
 
SafeArrayUnaccessData (varBLOB.parray);
} 



}
else
{
//zb.bmp文件如果存在则删除
if(GetFileAttributes("zp.bmp")!=-1)
DeleteFile("zp.bmp");
}




m_retv=1;
UpdateData(FALSE);


}




/***********************************/
m_AdoConn.ExitConnect(); 
}
catch (_com_error &e)
{ 
//AfxMessageBox(e.Description());
}

return m_retv;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值