当前位置: 首页 > 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.zskr.cn/news/1503286.html

相关文章:

  • 手把手复现CVE-2019-0708:从蓝屏到Getshell的完整实战记录(附靶场环境搭建)
  • 测评|嘉兴绿色新能源企业做GEO应该怎么选服务商?靠谱GEO服务商推荐 - 极义GEO
  • 大模型 Function Call 后端编排:多工具协同的调度引擎设计
  • 贵阳南明区黄金上门回收足不出户轻松变现 - 上门黄金回收
  • 深圳UV单体厂家排行:技术与服务实力实测对比 - 奔跑123
  • SmoothScroll Polyfill:现代Web滚动体验的跨浏览器解决方案
  • 深度解析PersonaLive:CVPR 2026实时人像动画的终极实战指南
  • 2026小程序开发公司哪家好?推荐十家口碑实力双优的小程序公司
  • 中小企业为什么要做网站建设? - GrowthUME
  • 三指拖拽:在Windows上解锁MacBook般流畅操作体验的完整指南
  • 从势垒到通路:深入解析肖特基与欧姆接触的物理机制与器件应用
  • 轻规划鸿蒙开发实战3:AR Engine Kit 深度实践,基于面部追踪与骨骼捕捉的体感微笑打
  • 北方工业大学考研辅导班精选推荐:实力品牌解析与选班指南 - 推荐评测师
  • 测评|宁波亲子连锁店做GEO应该怎么选服务商?靠谱GEO服务商推荐 - 极义GEO
  • 用LabVIEW和X-Plane 11搭建你的私人飞行仪表盘(附完整UDP通信源码)
  • iTop开源ITSM平台:3步搭建你的企业级IT服务管理中心
  • 2026上海黄金回收攻略,16区上门服务“速度王”和“价格王”揭晓 - 开心测评
  • 淘宝大数据|电商行业大数据
  • 企业级工作流自动化引擎:ProcessMaker开源BPM平台深度解析
  • ALNS算法入门实战:手把手教你用Java搞定旅行商问题(TSP)可视化
  • 2026更换图片背景颜色怎么做?免费修图软件手把手详细教程 - 办公小帮手
  • STM32H750以太网实战:CubeMX配置、LwIP内存优化与TCP保活机制深度解析
  • C++17文件操作实战:用std::filesystem::path写一个简易的日志文件管理器(含完整代码)
  • 桂林帝舵+浪琴手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 化工化纤 / 食品医药 / 半导体:纸塑五综网厂家选型指南 - 奔跑123
  • 别再只玩Arduino了!试试用OpenPLC Project实现工业级梯形图编程(附项目实战)
  • 中介效应检验实战:从理论到SPSS操作全解析
  • 抖音无水印视频批量下载实战:GitHub开源工具完整使用指南
  • 动物森友会存档编辑器终极指南:NHSE让你的岛屿创意无限
  • 手串DIY小程序怎么开发?一文讲透功能设计与商业价值