<转>vc 用ado访问Oracle数据库的代码示例

简介: #pragma once class CDBOp { public: bool ReConnect(); bool CloseConnect(); bool OpenConnect(CString hostName, CString dBName, CString us...
#pragma once

class CDBOp  
{
public:
	bool ReConnect();
	bool CloseConnect();
	bool OpenConnect(CString hostName, CString dBName, CString userName, CString password);
	bool GetItemData(CString itemID, float &price, CString &descript);  //取存储过程数据,这里只是举例说明
	CString GetErrorMsg();
	CDBOp();
	virtual ~CDBOp();
private:
	_ConnectionPtr m_pConnection;  //连接对象
	_RecordsetPtr m_pRecordset;     //记录集对象
	bool   m_bConnectSuccess;     //连接是否成功
	CString   m_strConnString;      //数据库连接字符串 
	CString   m_strErrMsg;           //保存错误信息
};




#include "StdAfx.h"
#include "DBOp.h"

//类实现


CDBOp::CDBOp():m_bConnectSuccess(false)
{
	::CoInitialize(NULL);
	m_pConnection.CreateInstance("ADODB.Connection");
	m_pConnection->ConnectionTimeout=30; 
	m_pRecordset.CreateInstance("ADODB.Recordset");
}
CDBOp::~CDBOp()
{
	//::CoUninitialize();
	CloseConnect();
}
//打开连接(数据库类型,主机名,数据库名,登陆名,密码)
//数据库类型: 0 为Sql server, 1为 Oracle
bool CDBOp::OpenConnect(
						CString hostName, 
						CString dBName, 
						CString userName, 
						CString password)        
{
	CString strConn;

	//MSDAORA or OraOLEDB.Oracle.1
	strConn = "Provider=OraOLEDB.Oracle.1";
	strConn+= ";Persist Security Info=true";
	strConn+= ";User ID=";
	strConn+= userName;
	strConn+= ";Password=";
	strConn+= password;
	strConn+= ";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)";
	strConn+= "(HOST=";
	strConn+= hostName;
	strConn+= ")(PORT=1521))(CONNECT_DATA=";
	strConn+= "(SERVICE_NAME=";
	strConn+= dBName;
	strConn+= ")))";


	if (strConn.IsEmpty()) 
	{
		m_strErrMsg="The connect string is null.";
		return false;
	}
	CloseConnect();
	m_strConnString =strConn; 

	return ReConnect();
}
//再次连接
bool CDBOp::ReConnect()
{
	m_strErrMsg=_T("");
	m_bConnectSuccess= false;
	HRESULT hr;
	try
	{
		hr = m_pConnection->Open(_bstr_t(m_strConnString), "", "", adModeUnknown);
		if (SUCCEEDED(hr))
			m_bConnectSuccess=true;  
	}
	catch(_com_error e)
	{  
		m_strErrMsg.Format(_T("Connect database failure!\r\n\r\n message error:%s\r\n\r\n The connect string:%s"),e.ErrorMessage(),m_strConnString); 
	}
	return m_bConnectSuccess;
}
//关闭链接
bool CDBOp::CloseConnect()
{
	if (m_bConnectSuccess)
	{
		if (m_pConnection->State==1) 
			m_pConnection->Close(); 
		m_bConnectSuccess =false;
	}
	return true;
}
//取得错误信息
CString CDBOp::GetErrorMsg()
{
	return m_strErrMsg;
}

bool CDBOp::GetItemData(CString itemID, float &price, CString &descript)
{
	_CommandPtr   pCommand = NULL;
	pCommand.CreateInstance("ADODB.Command");
#ifdef   _DEBUG   
	if   (pCommand   ==   NULL)   
	{   
		AfxMessageBox(_T("Command Created fail! Please confirm whether initialize COM."));   
	}   
#endif   
	ASSERT(pCommand   !=   NULL);  
	try   
	{   
		if (m_bConnectSuccess==false)
		{
			if (ReConnect()==false) 
				return false;
		}
		//输入参数   itemID    
		_ParameterPtr   pParamItemID;   
		pParamItemID.CreateInstance("ADODB.Parameter");   
		pParamItemID->Name="ItemID";   //所用存储过程参数名称   
		pParamItemID->Type=adChar;    //参数类型   
		pParamItemID->Size=10;     //参数大小   
		pParamItemID->Direction=adParamInput;  //表明是输入参数   
		pParamItemID->Value=_variant_t(itemID);   
		pCommand->Parameters->Append(pParamItemID);    


		//输出参数   price    
		_ParameterPtr   pParamPrice;       
		pParamPrice.CreateInstance("ADODB.Parameter");   
		pParamPrice->Name="Price";    //参数名称   
		pParamPrice->Type=adNumeric;    //参数类型   
		pParamPrice->Size=9;      //参数大小
		pParamPrice->Precision =9;
		pParamPrice->NumericScale =2;  
		pParamPrice->Direction=adParamOutput;  //声明是输出参数   
		pCommand->Parameters->Append(pParamPrice);  

		//输出参数   Descript    
		_ParameterPtr   pParamDescript;       
		pParamDescript.CreateInstance("ADODB.Parameter");   
		pParamDescript->Name="Descript";   //参数名称   
		pParamDescript->Type=adVarChar;    //参数类型   
		pParamDescript->Size=160;     //参数大小
		pParamDescript->Direction=adParamOutput; //声明是输出参数   
		pCommand->Parameters->Append(pParamDescript);  
		//执行存储过程   
		pCommand->ActiveConnection=m_pConnection;   
		pCommand->CommandText="spItemInfo";   //存储过程名称   
		pCommand->CommandType=adCmdStoredProc;  //表示为存储过程adCmdStoredProc   
		pCommand->Execute(NULL,   NULL,   adCmdStoredProc);   


		price=(float)(pParamPrice->Value);
		descript = (char*)_bstr_t(pParamDescript->Value);  
		return true;
	}
	catch(_com_error   e)   
	{         
		m_strErrMsg.Format(_T("Error:GetItemData. Reason:%s\n file: %s; line: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);       
		return false;
	}   

}

  转自http://www.cnblogs.com/finema/archive/2008/08/22/1273478.html

相关文章
|
22天前
|
Oracle 关系型数据库 数据库
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,急需恢复zxfg用户下的数据。 出现“system01.dbf需要更多的恢复来保持一致性”这个报错的原因可能是控制文件损坏、数据文件损坏,数据文件与控制文件的SCN不一致等。数据库恢复工程师对数据库文件进一步检测、分析后,发现sysaux01.dbf文件损坏,有坏块。 修复并启动数据库后仍然有许多查询报错,export和data pump工具使用报错。从数据库层面无法修复数据库。
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
|
1天前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
15 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
10天前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—异常断电导致Oracle数据库数据丢失的数据恢复案例
Oracle数据库故障: 机房异常断电后,Oracle数据库启库报错:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。数据库没有备份,归档日志不连续。用户方提供了Oracle数据库的在线文件,需要恢复zxfg用户的数据。 Oracle数据库恢复方案: 检测数据库故障;尝试挂起并修复数据库;解析数据文件。
|
10天前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
37 2
|
29天前
|
Oracle 安全 关系型数据库
Oracle数据恢复—Oracle数据库误删除的数据恢复方法探讨
删除Oracle数据库数据一般有以下2种方式:delete、drop或truncate。下面针对这2种删除oracle数据库数据的方式探讨一下oracle数据库数据恢复方法(不考虑全库备份和利用归档日志)。
|
1月前
|
SQL NoSQL Java
彻底革新你的数据库操作体验!Micronaut数据访问技巧让你瞬间爱上代码编写!
【9月更文挑战第10天】Java开发者们一直在寻找简化应用程序与数据库交互的方法。Micronaut作为一个现代框架,提供了多种工具和特性来提升数据访问效率。本文介绍如何使用Micronaut简化数据库操作,并提供具体示例代码。Micronaut支持JPA/Hibernate、SQL及NoSQL(如MongoDB),简化配置并无缝集成。通过定义带有`@Repository`注解的接口,可以实现Spring Data风格的命名查询。
50 6
|
1月前
|
前端开发 数据库
数据库表设计生成代码
BizWorks ToolKit插件集成Mybatis-Plus代码生成工具,支持从数据库表生成代码,便于研发过程中数据模型变更后的代码同步。本文介绍批量生成代码的方法、配置说明及项目示例。配置文件`*.mp.yaml`用于描述生成行为,可放置于`src/main/resource/bizworks/mybatis-plus/`路径下。配置包括数据库信息、输出目录及包名等。通过IDEA右键菜单即可启动代码生成。具体配置和示例详见文档。
26 2
|
1月前
|
存储 Oracle 关系型数据库
Oracle同一台服务器创建多个数据库
【8月更文挑战第30天】在 Oracle 中,可在同一服务器上创建多个数据库。首先确保已安装 Oracle 软件并具有足够资源,然后使用 DBCA 工具按步骤创建,包括选择模板、配置存储及字符集等。重复此过程可创建多个数据库,需确保名称、SID 和存储位置唯一。创建后,可通过 Oracle Enterprise Manager 进行管理,注意服务器资源分配与规划。
39 10
|
14天前
|
SQL Oracle 关系型数据库
Oracle数据库管理:从入门到精通
表(Table):表是Oracle数据库中存储数据的基本结构单元,由行(Row)和列(Column)组成。每行代表一个记录,每列代表一个字段。 SQL(Structured Query Language):SQL是Oracle数据库的核心语言,用于与数据库交互,执行查询、插入、更新和删除等操作。 数据库实例与数据库:在Oracle中,数据库实例是一组后台进程和内存结构,用于管理数据库并提供服务。而数据库则是数据的物理存储,包括数据文件、控制文件、联机日志和参数文件等。
38 0
|
1月前
|
前端开发 数据库 开发者
数据模型(数据库表设计)生成代码
BizWorks ToolKit 插件集成 Mybatis-Plus 代码生成工具,支持从数据库表批量生成代码,简化开发流程。本文详细介绍配置方法及项目示例,包括配置文件格式、生成选项及具体操作步骤,帮助开发者快速实现代码同步更新。配置文件 `.mp.yaml` 支持自定义输出目录、生成组件等,适用于多种项目结构。
32 0

推荐镜像

更多