当前位置: 首页 > news >正文

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.拷贝数据到saveArryhr = 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);}
}

 

数据库数据图片

image

 

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

image

 

http://www.jsqmd.com/news/991539/

相关文章:

  • SPI协议实战指南:从时序图到多设备组网
  • 收藏!小白程序员也能学会的大模型入门指南,抓住AI风口不焦虑!
  • 吴忠萧邦+劳力士手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 宁波各区黄金回收点位推荐 禹竞名奢汇就近交易便捷靠谱 - 名奢变现站
  • 西北大学考研辅导班精选推荐:实力品牌解析与选班指南 - 推荐评测师
  • 咸宁卡地亚+GP芝柏表手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • MySQL InnoDB 存储引擎
  • 2026免费在线抠图去背景保姆级教程,无需下载一看就会 - 办公小帮手
  • 手把手复现CVE-2019-0708:从蓝屏到Getshell的完整实战记录(附靶场环境搭建)
  • 聚焦高端制造:国内五大碳纤维缠绕设备品牌深度测评 - 深度智识库
  • Proteus离线仿真DLL元件包:AVR/PIC/8051/ARM7TDMI等百余款芯片模型即装即用
  • 【技术解析】DSVT:基于旋转集合与动态稀疏窗口的3D点云Transformer高效主干
  • 昆明五华区黄金回收实测:六家机构五维测评与避坑指南 - 上门黄金回收
  • 课题学习(十九)----捷联测试平台搭建与多传感器数据融合实践(基于MPU6050和QMC5883L)
  • 测评|嘉兴绿色新能源企业做GEO应该怎么选服务商?靠谱GEO服务商推荐 - 极义GEO
  • 当 AI 审计遇上“教科书级”代码:Mythos 与 curl 漏洞事件的深度复盘
  • 咸阳帝舵+浪琴手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 2026年防腐保温管道厂家哪家强|国产优质品牌实力排行与选购指南 - 海棠依旧大
  • 如何使用TikTokDownload工具高效下载抖音无水印视频:完整实用指南
  • 大模型 Function Call 后端编排:多工具协同的调度引擎设计
  • Go/Rust 系统编程:无锁数据结构与 CAS 并发控制的深度剖析
  • 贵阳南明区黄金上门回收足不出户轻松变现 - 上门黄金回收
  • B+ 树刨析
  • 西瓜视频怎么去水印?2026年最新去水印教程 - 科技热点发布
  • 宋韵流芳 糕承匠心:杨先生糕点,一口尝尽江南温润 - 玖叁鹿
  • CC2530串口实战:解析命令字符串实现LED智能交互
  • 周口萧邦+劳力士手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 实战指南 - 构建你的个人交易系统 (1)
  • 深圳UV单体厂家排行:技术与服务实力实测对比 - 奔跑123
  • SmoothScroll Polyfill:现代Web滚动体验的跨浏览器解决方案