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

#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

时间: 2024-10-26 19:37:38

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

如何使用ADO访问Oracle数据库存储过程

一.关于ADO 在基于Client/Server结构的数据库环境中,通过OLE DB接口可以存取数据,但它定义的是低层COM接口,不仅不易使用,而且不能被VB,VBA,VBScript等高级编程工具访问. 而使用ADO则可以很容易地使VB等编程语言直接访问数据(通过OLE DB接口).ADO是基于面向对象方法的,其对象模型如下图所示(略) 由上图可见,ADO对象模型总共才包括六个对象,相对于数据访问对象(DAO)来说简单得多.因此实际中常常使用它来访问数据库. 二.ADO访问数据库实例 下面,我

ASP.NET访问Oracle数据库的方法

asp.net|oracle|访问|数据|数据库 引言 Microsoft .NET Framework Data Provider for Oracle(以下简称为.NET for Oracle)是一个.NET Framework的组件.这个组件为我们使用.NET访问Oracle数据库提供了极大的方便.那些使用.NET和Oracle的开发人员,相信会乐的手舞足蹈,因为他们再也不必使用那个并不十分"专业="的OLEDB来访问Oracle数据库了.这个组件的设计非常类似.NET中内置的M

通过.NET访问 Oracle数据库

oracle|访问|数据|数据库 长期以来,我一直用的是 MS SQL Server / Access 数据库,通过.NET 访问MS自家的东西几乎没碰到过什么麻烦.最近项目中要用 Oracle 作为数据库,学习研究了一些 .NET 访问Oracle 的东西,发现问题倒真的不少. 1.System.Data.OracleClient 和 System.Data.OleDb 命名空间 虽然通过这两个命名空间的类都可以访问 Oracle 数据库,但和 SQL Server 类似的(System.Da

简介使用ASP.NET访问Oracle数据库的方法

asp.net|oracle|访问|数据|数据库 摘要 本文简要介绍了使用ASP.NET访问Oracle数据库的方法.首先,介绍了组件的安装:其次,简单说明了System.Data.OracleClient中包含的核心类:最后,通过一个实例讲解了具体的使用方法. -------------------------------------------------------------------------------- 目录 引言 系统需求和安装 核心类介绍 举例说明 参考信息 -------

有关ADO访问不同数据库的差别详细介绍

ado|访问|数据|数据库 Microsoft公司提供了统一的数据访问接口ActiveX Data Object,简称ADO.但实际应用编程中,访问不同的数据库,如Access.SQL Server或VFP,会存在一些"细微"差别,常常有这样的情况,用ADO对象访问某一数据库的程序都调试通过了,但用同样的程序访问其他数据库就存在这样或那样的问题,反之也一样.这种差别就笔者来看好像没什么意义,因为都是一个公司的产品:虽然这种差别不多,但要搞清它的来龙去脉,足以使用户忙乎一阵子,a无端增加

谈ADO访问不同数据库的差别

ado|访问|数据|数据库 Microsoft公司提供了统一的数据访问接口ActiveX Data Object,简称ADO.但实际应用编程中,访问不同的数据库,如Access.SQL Server或VFP,会存在一些"细微"差别,常常有这样的情况,用ADO对象访问某一数据库的程序都调试通过了,但用同样的程序访问其他数据库就存在这样或那样的问题,反之也一样.这种差别就笔者来看好像没什么意义,因为都是一个公司的产品:虽然这种差别不多,但要搞清它的来龙去脉,足以使用户忙乎一阵子,a无端增加

解决ASP.NET安装后无法访问Oracle数据库问题

asp.net|oracle|访问|解决|数据|数据库|问题   问题安装完ASP.NET,Oracle9i客户端后,使用System.Data.OracleClient访问Oracle数据库时收到如下信息 System.Data.OracleClient requires Oracle client software version 8.1.7 or greater. 原因Oracle 9i Release 2 客户端在安装到Windows的NTFS分区下时的安全认证设置不正确,引起本机的Au

ado-c++ ADO 连接ORACLE 数据库 windows系统验证方式连接老是失败.

问题描述 c++ ADO 连接ORACLE 数据库 windows系统验证方式连接老是失败. 开发过程中要用C++ 连接oracle 数据库,但是由于数据库的密码不知道,所有用系统验证的方式连接数据库,但是查询了网上的各种资料,一直都无法连接上数据库. 参考到的资料有.http://www.codeproject.com/Articles/2304/ADO-Connection-Strings http://www.connectionstrings.com/oracle/ 代码: OLE DB

JAVA频繁访问oracle数据库获取记录(间隔1秒就读取数据库记录或修改数据库记录),如何操作

问题描述 JAVA频繁访问oracle数据库获取记录(间隔1秒就读取数据库记录或修改数据库记录),使用什么连接方式最好(高效)??,用jdbc连接池好吗?,怎么使用jdbc连接池后释放资源而不关闭连接呢??,谢谢各位了!!