C++ 连接Oracle

欢迎技术交流。 QQ:138986722

刚刚学习了C++、感觉学东西还是动手比较学得快一点!

下面是一个ADO方式连接Oracle的小程序部分代码......

首先是Oracle的配置、在Oracle的安装路径下找到:Oracle\network\ADMIN\tnsnames.ora文件、配置一下连接配置

BOSS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = boss)
    )
  )
新建一个头文件、名为CDBOperation.h:

#pragma once
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
class CDBOperation
{
public:
	//初始化数据库操作需要的对象
	CDBOperation(void);
	~CDBOperation(void);

	//连接至数据库
	bool ConnToDB(char *ConnectionString, char *UserID, char *Password);

	//数据库操作函数
	//查询操作 删除以及添加
	_RecordsetPtr ExecuteWithResSQL(const char *);

private:
	void PrintErrorInfo(_com_error &);

private:
	//初始化数据库连接、命令、记录集
	_ConnectionPtr CreateConnPtr();
	_CommandPtr CreateCommPtr();
	_RecordsetPtr CreateRecsetPtr();

private:
	//数据库连接需要的连接、命令操作对象
	_ConnectionPtr m_pConnection;
	_CommandPtr m_pCommand;
};
新建一个c++源文件、名为CDBOperation.cpp:
#include "stdafx.h"
#include "DBOperation.h"
CDBOperation::CDBOperation(void)
{
	CoInitialize(NULL);
	m_pConnection = CreateConnPtr();
	m_pCommand = CreateCommPtr();
}
CDBOperation::~CDBOperation(void)
{
	m_pConnection->Close();
}
bool CDBOperation::ConnToDB(char *ConnectionString, char *UserID, char *Password)
{
	if (NULL == m_pConnection)
	{
		printf("Failed to create connection\n");
		return false;
	}
	try
	{
		HRESULT hr = m_pConnection->Open(ConnectionString, UserID, Password, NULL);
		if (TRUE == FAILED(hr))
		{
			return false;
		}
		m_pCommand->ActiveConnection = m_pConnection;
		return true;
	}
	catch(_com_error &e)
	{
		PrintErrorInfo(e);
		return false;
	}
}
_RecordsetPtr CDBOperation::ExecuteWithResSQL(const char *sql)
{
	try
	{
		m_pCommand->CommandText = _bstr_t(sql);
		_RecordsetPtr pRst = m_pCommand->Execute(NULL, NULL, adCmdText);
		return pRst;
	}
	catch(_com_error &e)
	{
		PrintErrorInfo(e);
		return NULL;
	}
}
void CDBOperation::PrintErrorInfo(_com_error &e)
{
	printf("Error infomation are as follows\n");
	printf("ErrorNo: %d\nError Message:%s\nError Source:%s\nError Description:%s\n", e.Error(), e.ErrorMessage(), (LPCTSTR)e.Source(), (LPCTSTR)e.Description());
}

_ConnectionPtr CDBOperation::CreateConnPtr()
{
	HRESULT hr;
	_ConnectionPtr connPtr;
	hr = connPtr.CreateInstance(__uuidof(Connection));
	if (FAILED(hr) == TRUE)
	{
		return NULL;
	}
	return connPtr;
}

_CommandPtr CDBOperation::CreateCommPtr()
{
	HRESULT hr;
	_CommandPtr commPtr;
	hr = commPtr.CreateInstance(__uuidof(Command));
	if (FAILED(hr) == TRUE)
	{
		return NULL;
	}
	return commPtr;
}

_RecordsetPtr CDBOperation::CreateRecsetPtr()
{
	HRESULT hr;
	_RecordsetPtr recsetPtr;
	hr = recsetPtr.CreateInstance(__uuidof(Command));
	if (FAILED(hr) ==TRUE)
	{
		return NULL;
	}
	return recsetPtr;
}
我的代码是放在MFC一个按钮Click事件里面的:

记住在处理事件的cpp文件中导入头文件:#include "DBOperation.h"

CDBOperation dbOper;
	bool bConn = dbOper.ConnToDB("Provider=OraOLEDB.Oracle.1;Persist Security Info=True;Data Source=boss", "用户名", "密码");
	if (false == bConn)
	{
		MessageBox((LPCTSTR)"连接数据库出现错误\0",0,0);
		return;
	}

	//查询
	_RecordsetPtr pRst;
	char sql[255] = {0};
	strcpy(sql, " select * from boss_test_table2 where rownum = 1 ");
	pRst = dbOper.ExecuteWithResSQL(sql);
	if (NULL == pRst)
	{
		MessageBox(_T("查询数据出现错误!\0"),0,0);
		return;
	}
	if (pRst->adoEOF)
	{
		pRst->Close();
		MessageBox((LPCTSTR)"There is no records in this table\0",0,0);
		return;
	}
	_variant_t vSno, vName;
	while (!pRst->adoEOF)
	{
		//pRst->MoveFirst(); //记录集指针移动到查询结果集的前面
		vSno = pRst->GetCollect(_variant_t("U_NUMBER"));
		vName = pRst->GetCollect(_variant_t("USERS_NAME"));
		MessageBox((LPCTSTR)(_bstr_t)vSno,0,0);
		pRst->MoveNext();
	} 

	strcpy(sql, "insert into boss_test_table2 (u_number, users_name, users_phone, status, customno_id) values ('0001', 'C+TTT+', '13999000000', 2, 'BPPPPPPPPPP')");
	pRst = dbOper.ExecuteWithResSQL(sql);
	if (NULL != pRst)
	{
		AfxMessageBox(_T("插入数据成功\n"));
	}
	//执行删除语句
	sprintf(sql, "delete boss_test_table2 where u_number = '%s'", "009"); 
	pRst = dbOper.ExecuteWithResSQL(sql);
	if (NULL != pRst) 
	{
		MessageBox(_T("删除数据成功\0"),0,0);
	}
	//执行更新语句
	sprintf(sql, "update boss_test_table2 set users_name = '%s' ", "C++反人类、MFC反社会");
	pRst = dbOper.ExecuteWithResSQL(sql);
	if (NULL != pRst)
	{
		MessageBox(_T("更新数据成功\0"),0,0); 
	}

哎呀、又有工单了.......一个JS浏览器的兼容问题、有得搞了......o(︶︿︶)o 唉!!!



  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUG胡汉三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值