Access数据库位图文件数据的读写(一)
读取位图文件到VARIANT结构中
/* 从位图文件中读取数据到VARIANT 参数: pBitmapPath 位图文件路径 varVal VARIANT结构 dwFileSize 文件大小 */ HRESULT QAdo::ReadBitmapFileToVariant(const char* pBitmapPath, VARIANT& varVal,DWORD* fileSize) { HRESULT hr = S_OK; BYTE* pBuffer = nullptr; //DWORD fileSize = 0; SAFEARRAY* psa = nullptr; void* pData = nullptr; //1.读取图片文件 hr=ReadBitmapFileToBuffer(pBitmapPath, pBuffer,fileSize); if (!pBuffer) { return E_FAIL; } //2.创建safeArry用于存储二进制数据 SAFEARRAYBOUND rgsabound; rgsabound.lLbound = 0; rgsabound.cElements = *fileSize; psa = SafeArrayCreate(VT_UI1, 1, &rgsabound); if (!psa) { if (pBuffer) free(pBuffer); if (psa) SafeArrayDestroy(psa); return E_FAIL; } //3.拷贝数据到saveArry hr = SafeArrayAccessData(psa, &pData); //CHECK_HR(hr, "SafeArrayAccessData failed"); assert(hr == S_OK); memcpy(pData, pBuffer, *fileSize); SafeArrayUnaccessData(psa); //VARIANT varData; VariantInit(&varVal); V_VT(&varVal) = VT_ARRAY | VT_UI1; V_ARRAY(&varVal) = psa; //memcpy(V_ARRAY(&varVal), psa,fileSize); if (pBuffer) free(pBuffer); //if (psa) SafeArrayDestroy(psa); return hr; }
自定义函数 ReadBitmapFileToBuffer
/*
从文件中读取位图到数组中
参数:
filename 位图文件路径名称
pBuffer 保存数据的缓存
fileSize 文件大小
返回:
成功返回s_ok,失败为s_flase
*/
HRESULT QAdo::ReadBitmapFileToBuffer(const char* filename,BYTE*& pBuffer, DWORD* fileSize) {
HANDLE hFile = CreateFileA(filename, GENERIC_READ, 0, nullptr,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (hFile == INVALID_HANDLE_VALUE) {
return S_FALSE;
}
*fileSize = GetFileSize(hFile, nullptr);
pBuffer = (BYTE*)malloc(*fileSize);
if (!pBuffer)
{
CloseHandle(hFile);
return S_FALSE;
}
DWORD bytesRead = 0;
ReadFile(hFile, pBuffer, *fileSize, &bytesRead, nullptr);
CloseHandle(hFile);
return S_OK;
}
把VARIANT结构数据写入Access数据库中
QAdo::InitConnString(0, TEXT(".\\test.accdb"));
QAdo ado;
VARIANT varVal;
DWORD lgSize = 0;
ado.ReadBitmapFileToVariant(".\\测试美女位图.bmp",varVal,&lgSize);
TCHAR sql[256] = TEXT("INSERT INTO Images (ID,ImgData) VALUES (@id,@imgdata)");
ado.SetParameter(TEXT("@id"), 13);
ado.SetParameter(TEXT("@imgdata"), varVal, lgSize);
if (ado.Open()) {
if (ado.CommandExecute(sql) > 0) {
//保存成功
}
ado.Close();
}
VARIANT数据类型的参数设置
//VARIANT类型的参数设置,要多传个数组大小
void QAdo::SetParameter(LPCTSTR lpParamName, VARIANT& varVal,long lgSize)
{
try {
if (m_pCommand == 0) {
m_pCommand.CreateInstance(__uuidof(Command));
}
m_pCommand->Parameters->Append(m_pCommand->CreateParameter((_bstr_t)lpParamName, adBinary, adParamInput, lgSize, varVal));
}
catch (_com_error& e) {
ShowErrorMsg(TEXT("SetParam参数错误!!!"), e);
}
}
数据库数据图片

数据库字段[ImgData]用OLE对象保存位图数据

签名:GreenLeaf1976

浙公网安备 33010602011771号