输入文件保存在StrBlob中, 用一个StrBlobPtr打印出StrBlob中的每一个元素

Talk cheap, It's code:


奇怪的是, VLD检查不出内存泄漏, 但使用VS2013自带的检测机制却显示内存泄漏, 希望以后可以得到答案.

转载于:https://www.cnblogs.com/wuOverflow/p/4098726.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 `GetChunk` 函数获取 `BLOB` 数据,并将其存储到 `CString` 变量。以下是一段示例代码: ```cpp // 定义 BLOB 字段的名称和表格名称 const CString strFieldName = "BlobField"; const CString strTableName = "TableName"; // 创建连接字符串 CString strConnString = _T("Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=DatabaseName;Integrated Security=SSPI;"); // 创建 ADO 连接对象 _ConnectionPtr pConn; pConn.CreateInstance(__uuidof(Connection)); pConn->Open(strConnString, "", "", adConnectUnspecified); // 创建 ADO 记录集对象 _RecordsetPtr pRs; pRs.CreateInstance(__uuidof(Recordset)); // 打开指定表格 pRs->Open(strTableName, pConn.GetInterfacePtr(), adOpenKeyset, adLockOptimistic, adCmdTable); // 获取 BLOB 数据 _variant_t varData = pRs->Fields->Item[strFieldName]->Value; if (varData.vt == VT_NULL) { // 如果该字段为空,则执行相应的操作 } else { // 将 BLOB 数据存储到一个 CString 对象 CString strBlob; BYTE* pData = (BYTE*)varData.parray->pvData; long lSize = varData.parray->rgsabound[0].cElements; long lOffset = 0; long lChunkSize = 4096; // 每次获取的数据块大小 while (lOffset < lSize) { long lRemaining = lSize - lOffset; if (lRemaining < lChunkSize) { lChunkSize = lRemaining; } _variant_t varChunk = pRs->Fields->Item[strFieldName]->GetChunk(lChunkSize, lOffset); if (varChunk.vt == VT_NULL) { // 如果获取数据块失败,则执行相应的操作 break; } else { strBlob.Append((LPCSTR)varChunk.pbVal, varChunk.parray->rgsabound[0].cElements); lOffset += varChunk.parray->rgsabound[0].cElements; } } } // 关闭记录集和连接 pRs->Close(); pConn->Close(); ``` 注意:上述代码假设 BLOB 数据的编码方式为 ANSI,如果是 Unicode 编码,则需要将 `CString` 对象改为 `CStringW` 对象,并将字符串的转换方式改为 `WideCharToMultiByte`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值