c++写入oracle数据库blob字段,读取blob到本地文件
2013-11-04 10:41
525 查看
写入本地文件到数据库
读取数据库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
相关文章推荐
- c++写入oracle数据库blob字段,读取blob到本地文件
- FME综合应用之一:oracle数据库blob字段写入和写出图片或文件等
- java读取mysql数据库的blob字段和Oracle数据库的Blob字段的区别【读取properties文件】
- (二)上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)
- 对象类型的本地写入---plist文件创建以及读取
- 如何读取Oracle的BLOB字段里的文件
- C++中txt文件读取和写入
- c++读取写入文件--IO操作合集
- 设置oracle中的blob字段,将xml文件写入到数据库中
- c++对txt文件的读取与写入
- C++中txt文件读取和写入
- 如何读取和写入文件或 BLOB 列使用 ADO.NET 和 Visual C#.NET
- C++读取、写入配置文件
- C++读取写入.txt文件(ifstream/ofstream)—读取指定行,修改指定行,复制文件,清除文件,统计文件行数
- C# StreamWriter写入一个ini文件到本地,StreamReader读取保存在本地的ini文件内容
- sqlite3中,blob字段的读取和写入
- C/C++文件——数据写入、读取
- C++对txt文件的读取和写入
- C#写入和读取数据库blob字段代码
- JS创建、写入、读取本地文件(txt)