1. VC把一个文件存入数据库
CFile imagefile;
CFileException fileerr;
if(!imagefile.Open(".\\Pic\\20080806_0824_川A33181_in.jpg", CFile::modeRead | CFile::typeBinary, &fileerr)) //打开了一个jpg文件
return;
BYTE* pbuf;
long nLength = imagefile.GetLength();
pbuf = new BYTE[nLength+2];
if(pbuf == NULL)
return; //allocate memory error;
imagefile.Read(pbuf,nLength); //read the file into memory
BYTE *pBufEx = pbuf;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < nLength; i++)
SafeArrayPutElement (psa, &i, pBufEx++);
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
try
{
//Open a connection
OleInitialize(NULL);
_RecordsetPtr pRs;
_ConnectionPtr pConnection(__uuidof(Connection));
bstr_t strCnn = GetConnectionString();
//pConnection.CreateInstance(__uuidof(Connection));
pConnection->Open(strCnn,"","",NULL); //Connect a DataBase
pRs.CreateInstance(__uuidof(Recordset));
pRs->Open("LicenseImage",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable); //Open a Table
pRs->AddNew();
pRs->PutCollect("CarImageName",_variant_t("20080806_0824_川A33181_in.jpg"));
pRs->Fields->GetItem("ImageLicense")->AppendChunk(varBLOB);
pRs->Update();
pRs->Close();
pRs.Release();
pConnection->Close();
pConnection.Release();
}
catch(_com_error &e)
{
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
CString sError;
sError.Format("Source : %s \n Description : %s\n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
AfxMessageBox(sError);
}
OleUninitialize();
delete [] pbuf;
pbuf = NULL;
2. VC把数据库中IMAGE字段取出存为文件
try
{
//Open a connection
OleInitialize(NULL);
_RecordsetPtr pRs = NULL;
_ConnectionPtr pConnection = NULL;
_variant_t varBLOB;
bstr_t strCnn = GetConnectionString();
pConnection.CreateInstance(__uuidof(Connection));
pConnection->Open(strCnn,"","",NULL);
pRs.CreateInstance(__uuidof(Recordset));
pRs->Open("LicenseImage",_variant_t((IDispatch *) pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable);
//read data
CString strImageName = pRs->GetCollect("CarImageName").bstrVal;
long lDataLength = pRs->Fields->GetItem("ImageLicense")->ActualSize;
varBLOB = pRs->GetFields()->GetItem("ImageLicense")->GetChunk(lDataLength);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(BYTE *pBuffer = new BYTE [lDataLength+1])
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(pBuffer,pBuf,lDataLength); ///复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);
//Build a File in Windows Temp Directory
char tmpPath[_MAX_PATH+1];
GetModuleFileName(AfxGetApp()->m_hInstance, tmpPath, _MAX_PATH);
CString strPath = tmpPath;
strImageName = strPath.Left(strPath.ReverseFind('\\')+1)+strImageName;
CFile outFile(strImageName,CFile::modeCreate|CFile::modeWrite);
LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pBuf);
outFile.WriteHuge(buffer,lDataLength);
GlobalUnlock((HGLOBAL)pBuf);
outFile.Close();
delete [] pBuffer;
pBuffer = NULL;
}
}
pRs->Close();
pRs.Release();
pConnection->Close();
pConnection.Release();
}
catch(_com_error &e)
{
// Notify the user of errors if any.
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
CString sError;
sError.Format("Source : %s \n Description : %s\n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
AfxMessageBox(sError);
}
OleUninitialize();