开发者社区> 狂斩一条龙> 正文

<转>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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
再不懂时序就 OUT 啦!,DBengine 排名第一时序数据库,阿里云数据库 InfluxDB 正式商业化!
阿里云数据库 InfluxDB® 版已于近日正式启动商业化 。 InfluxDB 是 DBengine 网站时序数据库类目排名第一的数据库产品,广泛应用于互联网基础资源监控,容器监控,业务运营监控分析,物联网设备远程实时监控,工业安全生产监控,生产质量评估和故障回溯。
3258 0
.NET数据库编程求索之路--6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(2)
6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(2)      【 夏春涛 email: xchuntao@163.com  blog: http://www.cnblogs.
798 0
symbian 数据库运用小例
一、主要的类:RDbStoreDatabaseRDbNamedDatabaseTDbColRDbView.
662 0
Java对文件的读、写随机访问,RandomAccessFile类的使用分析
  在网上看了一些关于java中的RandomAccessFile类的介绍,又经过查看Java API和自己编的测试程序,总算是对RandomAccessFile的使用有了一定的了解。自己做了以下比较详细的总结吧。
1067 0
PostgreSQL 数据库实例只读锁定(readonly) - 硬锁定,软锁定,解锁
PostgreSQL 数据库实例只读锁定(readonly) - 硬锁定,软锁定,解锁
733 0
.NET数据库编程求索之路--7.使用ADO.NET实现(工厂模式-实现多数据库切换)(3)
7.使用ADO.NET实现(工厂模式-实现多数据库切换)(3)   7.5 SQL数据访问层HomeShop.DALOfSql   OrderDAO.cs View Code using System;using System.
674 0
怎样新建Oracle数据库
原文:怎样新建Oracle数据库 新建Oracle数据库三种方法:1.通过运行Oracle Database Configuration Assistant 创建配置或删除数据库(也可在命令行下输入dbca);2.
1036 0
+关注
狂斩一条龙
惯用c++,在windows平台做应用开发和底层研究,并对ua语言有深入的了解
476
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载