c++写入oracle数据库blob字段,读取blob到本地文件

简介: 版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/7407158 写入本地文件到数...
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/7407158

写入本地文件到数据库


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








相关文章
|
12天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
52 7
|
28天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
167 0
|
29天前
|
Oracle 关系型数据库 数据库
Oracle数据库基本概念理解(3)
Oracle数据库基本概念理解(3)
18 2
|
12天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
40 5
|
20天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
29天前
|
Oracle 关系型数据库 数据库
Oracle数据库基本概念理解(2)
Oracle数据库基本概念理解(2)
13 1
|
4天前
|
SQL 关系型数据库 MySQL
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
16 2
|
4天前
|
存储 Oracle 关系型数据库
Oracle的模式与模式对象:数据库的“城市规划师”
【4月更文挑战第19天】在Oracle数据库中,模式是用户对象的集合,相当于数据库的城市规划,包含表、视图、索引等模式对象。模式对象是数据存储结构,如表用于存储数据,视图提供不同查看角度,索引加速数据定位。良好的模式与模式对象设计关乎数据效率、安全和稳定性。规划时需考虑业务需求、性能、安全和可扩展性,以构建高效数据库环境,支持企业业务发展。
|
12天前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
35 7
|
27天前
|
SQL 关系型数据库 MySQL
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
10 0

热门文章

最新文章

推荐镜像

更多