mysql blob 转cstring,c++写入oracle数据库blob字段,读取blob到本地文件 | 学步园

写入本地文件到数据库

void DlgImpRoadSection::OnOkBtnClicked()

{

#pragma region 验证

CString tempStr;

CString fileName;

m_FilePath.GetWindowText(fileName);

if (access((const char*)_bstr_t(fileName), 0) != 0)

{

ads_alert(L"文件不存在!");

return;

}

...

#pragma endregion

#pragma region 以二进制形式读文件。存入varBlob

CFile file;

if (file.Open(fileName, CFile::modeRead|CFile::typeBinary) == FALSE)

{

return;

}

long fileLen = file.GetLength(); // 文件长度

// 存放文件二进制流的指针

byte *fileBuffer = new byte[fileLen + 1];

file.Read(fileBuffer, fileLen);

file.Close();

// 指定一个一维安全数组(safe array)的边界

SAFEARRAYBOUND rgsabound[1];

rgsabound[0].lLbound = 0;

rgsabound[0].cElements = fileLen;

// 安全数组

SAFEARRAY *safeArray;

safeArray = SafeArrayCreate(VT_UI1, 1, rgsabound);

for (long i = 0; i < fileLen; i++)

{

SafeArrayPutElement (safeArray, &i, fileBuffer++);

}

// 存入数据库中的BLOB的类型数据。设置为BYTE类型的数组

VARIANT varBLOB;

varBLOB.vt = VT_ARRAY | VT_UI1;

varBLOB.parray = safeArray;

#pragma endregion

#pragma region 插入记录

CString sql = L"select * from TABLE_NAME where 1 = 0";

_RecordsetPtr rs;

rs.CreateInstance(__uuidof(Recordset));

try

{

if (rs->Open(sql.GetBuffer(0), g_conn.GetInterfacePtr(),

adOpenDynamic, adLockOptimistic, adCmdText) == S_FALSE)

{

return;

}

GUID guid;

CoCreateGuid(&guid);

CString id;

id.Format(L"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X",

guid.Data1, guid.Data2, guid.Data3,

guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],

guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);

rs->AddNew();

rs->PutCollect("ID", _variant_t(id));

rs->PutCollect("...", ...);

rs->PutCollect("CAD_FILE", _variant_t(""));

rs->GetFields()->GetItem("FILE")->AppendChunk(varBLOB);

if (rs->Update() == S_OK)

{

...

}

else

{

...

}

}

catch(...)

{

...

}

rs = NULL;

#pragma endregion

CDialog::OnOK();

}

读取数据库blob字段值,存到本地文件。

#pragma region 从数据库读取文件存到本地

CString tempFile; // 要存储到本地文件名。

_RecordsetPtr rs;

rs.CreateInstance(__uuidof(Recordset));

CString sql;

sql.Format(L"select FILE from tablename where id = '%s'", id);

try

{

if (rs->Open(sql.GetBuffer(0), g_conn.GetInterfacePtr(),

adOpenDynamic, adLockOptimistic, adCmdText) == S_FALSE)

{

return false;

}

if (rs->adoEOF)

{

return false;

}

long dataSize = rs->GetFields()->GetItem("FILE")->ActualSize;

if (dataSize < 0)

{

return false;

}

_variant_t varBlob = rs->GetFields()->GetItem("FILE")->GetChunk(dataSize);;

if(varBlob.vt == (VT_ARRAY | VT_UI1)) //判断数据类型是否正确

{

char *pBuf = NULL;

SafeArrayAccessData(varBlob.parray, (void **)&pBuf); //得到指向数据的指针

CFile cadFile;

tempFile = appPath + "\\temp.dwg";;

if (cadFile.Open(tempFile,

CFile::modeCreate|CFile::modeWrite|CFile::typeBinary) == FALSE)

{

return false;

}

cadFile.Write(pBuf, dataSize);

cadFile.Close();

SafeArrayUnaccessData (varBlob.parray);

}

}

catch (...)

{

return false;

}

#pragma endregion

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值