void CRMSDlg::OnButton_in() //从库中提取并显示
{
// TODO: Add your control notification handler code here
try
{
// "pic" 是字段名,该字段保存着 OLE 对象
long nSize = m_pRecordset->GetFields()->GetItem("pic")->ActualSize; // 获取字段 "pic" 的当前单元的大小(在分配内存空间时要用到)
if(nSize > 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem("pic")->GetChunk(nSize);// 读取 OLE 对象 --> varBLOB
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(BYTE *pBuffer = new BYTE [nSize+1]) // 申请必要的存储空间
{
void* pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void**)&pBuf);
memcpy(pBuffer,pBuf,nSize); // 复制数据到缓冲区 pBuffer
SafeArrayUnaccessData (varBLOB.parray);
// SafeArrayAccessData() 的作用是给 varBLOB 分配一个 void 型指针
// 因为 memcpy 的第二个参数只接受 void 型指针
// 读取图像
if(m_Pic.m_IPicture != NULL) m_Pic.FreePictureData();
m_Pic.LoadPictureData(pBuffer, nSize);
delete [] pBuffer;
pBuf=0;
// 显示图像
CStatic *pStaic;
pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);//指向图片将要要显示的区域
// memDC.CreateCompatibleDC(GetDC());
pStaic->GetClientRect(&rect);//得到指定区域
CClientDC dc(pStaic); //定义初始化设备变量
m_Pic.UpdateSizeOnDC(&dc); // Allocate memory for m_Pic
m_Pic.Show(&dc,CRect(0,0,188,190));
OnButton_Fileout();
}
}
}
}
catch (_com_error e)
{
}
}
void CRMSDlg::OnButton_out() //存入库并显示
{
// TODO: Add your control notification handler code here
CFile f;
CString FilePathName;
CFileException e;
CFileDialog dlg(TRUE,NULL,NULL,0,"jpg Files (*.jpg)|*.jpg||",this); //TRUE为OPEN对话框,FALSE为SAVE AS对话框
if(dlg.DoModal()==IDOK)
{
FilePathName=dlg.GetPathName();
if(f.Open(FilePathName, CFile::modeRead | CFile::typeBinary, &e)) //打开指定的jpg文件
{
int nSize = f.GetLength(); //先得到 jpg 文件长度
BYTE* pBuffer = new BYTE [nSize]; //按文件的大小在堆上申请一块内存 pBuffer
if (f.Read(pBuffer, nSize) > 0 ) //把 jpg 文件读到 pBuffer
{
//把pBuffer里的jpg数据放到库中
BYTE* pBuf = pBuffer;
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
// m_pRecordset->AddNew(); //添加一条新记录
OnButton_File_In();//读入文件
if(pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nSize;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound); // 创建 SAFEARRAY 对象 psa
for (long i = 0; i < (long)nSize; i++)
SafeArrayPutElement (psa, &i, pBuf++); // 将 bBuf 指向的二进制数据
// 保存到 psa 中
varBLOB.vt = VT_ARRAY | VT_UI1; // 将 varBLOB 类型设为 BYTE 类型数组
varBLOB.parray = psa; // 保存 psa 到 varBLOB
m_pRecordset->GetFields()->GetItem("pic")->AppendChunk(varBLOB);//添加 varBLOB 到数据库
}
// 更新数据库
m_pRecordset->Update();
// 读取图像
if(m_Pic.m_IPicture != NULL) m_Pic.FreePictureData();
m_Pic.LoadPictureData(pBuffer, nSize);
delete [] pBuffer;
pBuf=0; //空指针指向0
}
f.Close();
}
// 显示图像
CStatic *pStaic;
pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);//指向图片将要要显示的区域
// memDC.CreateCompatibleDC(GetDC());
pStaic->GetClientRect(&rect);//得到指定区域
CClientDC dc(pStaic); //定义初始化设备变量
m_Pic.UpdateSizeOnDC(&dc); // Allocate memory for m_Pic
m_Pic.Show(&dc,CRect(0,0,188,190));
OnButton_Fileout();
}
}
待解决的BUG:查询不能正常进行,欢迎学习交流