ADO:使用事务操作Oracle数据库

31人阅读 评论(0) 收藏 举报
分类:

1、事务是为了完成一个特定的功能或任务而要进行的一系列的处理步骤,事务代表了所需的系列动作的整体。一个事务的所有语句被作为整体执行,遇到错误时,可以回滚事务、取消事务内所做的所有改变。在数据库中,事务可以把多个操作作为单一的、最基本的活动来进行。

2、ADO使用connection对象处理事务:

(1)、在事务开始时调用
 pCnn->BeginTrans();
  (2)、在事务结束并成功时调用
 pCnn->CommitTrans ();
  (3)、在事务结束并失败时调用

pCnn->RollbackTrans ();

3、ADO在Oracle中使用事务举例:

/*
    功能:在删除租借记录时,第一步需要删除tbRentInfo表中的记录,第二部需要将
	     tbDVDInfo中DVD的Num值加1,两者要么都成功,要么都不成功,这样才能保
		 整DVD影碟总数始终一致,将两步放在一个事务中处理。
	方法:调用connection对象的三个方法:BeginTrans()、CommitTrans()、RollbackTrans()。
*/
void CRentMgrDlg::DeleteRecordByConnectionTrans(CString &sID,CString &sName)
{
	BOOL bRet(FALSE);
	HRESULT hr;
	_variant_t RecordsAffected;
	CString strsql;
	strsql.Format(_T("delete from tbRentInfo where SID = %s"),sID);

	try
	{
		/*开始事务处理*/
		m_pConnection->BeginTrans();

		do 
		{
			/*第一步:*/
			hr = m_pConnection->Execute(_bstr_t(strsql), &RecordsAffected, adCmdText);
			if (FAILED(hr))
				break;
	
			/*第二步:*/
			/*使用记录集对象查询数目,并更新数目*/
			_RecordsetPtr pRecordset;
			hr = pRecordset.CreateInstance(__uuidof(Recordset));
			if(FAILED(hr))
				break;

			/*查询原始数目*/
			CString strDVDID,strValue;
			int nDVDID,dvdNum;
			nDVDID = QueryDVDId(sName);
			strDVDID.Format(_T("%d"),nDVDID);
			strsql.Format(_T("select* from tbDVDInfo where SDVDID = %s"),strDVDID);

			hr = pRecordset->Open(_variant_t(strsql),
				m_pConnection.GetInterfacePtr(),	 
				adOpenDynamic,
				adLockOptimistic,
				adCmdText);
			if(FAILED(hr))
				break;

			if(pRecordset->EndOfFile)
				break;

			/*更新数目*/
			_variant_t var;
			var = pRecordset->GetCollect("sNum");
			if(var.vt != VT_NULL)
			{
				strValue = (LPCSTR)_bstr_t(var);
				dvdNum = _ttoi(strValue);
				dvdNum += 1;
				strValue.Format(_T("%d"), dvdNum);
				pRecordset->PutCollect("sNum", _variant_t(strValue));
				pRecordset->Update();
			}
			else
			{
				break;
			}

			bRet = TRUE;

		} while (FALSE);
	}
	catch(_com_error *e)
	{
		m_pConnection->RollbackTrans();
		MessageBox(e->ErrorMessage());
	}

	if(bRet)
		m_pConnection->CommitTrans();
	else
		m_pConnection->RollbackTrans();
}

查看评论

C++ 通过ADO连接Oracle数据库

背景 接触C++以来,因为之前学的java做Web时经常要和数据库打交道,所以也就一直想用C++来操作数据库。之前也听过ODBC数据源的方法听说比较麻烦,C++用ADO的方法连接数据比较方便。 下面就...
  • u013147600
  • u013147600
  • 2015-05-13 10:06:48
  • 2937

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

  • 2016年02月18日 15:20
  • 8KB
  • 下载

C++通过ADO方式连接Oracle数据库总结

这篇博文发出去,就算在CSDN上开博了,点滴积累,见诸博文 还是先从简单的说起,C++连接数据库的方法多种多样,以下仅以ADO的方式进行简略说明。 开发环境:WinXP+Oracle 11...
  • YouHcp
  • YouHcp
  • 2013-04-23 16:48:19
  • 869

MFC中使用ADO访问Oracle数据库

操作系统:win7 64bit 软件环境:VS2012,本地客户端使用Oracle 11g 64bit           远程服务器端使用Oracle 11g 32bit 1、  导入msado15...
  • Robin__Chou
  • Robin__Chou
  • 2015-01-19 22:20:12
  • 3400

64位程序,利用ADO连接Oracle数据库

刚好手头项目解决了ADO连接Oracle数据库的问题,z
  • sisyphus_zhou
  • sisyphus_zhou
  • 2014-09-29 16:14:36
  • 6982

ADO连接oracle数据库,并调用带参数的存储过程

这两天要写一个与oracle存储过程相关的测试程序,可恨自己对着一无所知,探索两天终于出来了,记录之,备以后留用。啦啦啦啦~~~~ first:连接oracle数据库。 工具:oracle 11g 环...
  • so_so_jiang
  • so_so_jiang
  • 2013-07-26 17:02:50
  • 1249

VB下利用ADO技术访问Oracle数据库

  • 2014年09月28日 14:45
  • 122KB
  • 下载

MFC使用ADO实现与Oracle数据库的操作

  • 2017年07月12日 21:27
  • 40.07MB
  • 下载

在VS环境下以ADO方式操作Oracle数据库

利用ADO引擎方式访问Oracle数据库的实现方法: 定义数据库头文件为CDBOperation.h #pragma once #import "C:\Program Files\Common F...
  • gsls181711
  • gsls181711
  • 2013-12-04 11:46:50
  • 883

C++连接Oracle之ADO

最近因为项目的需要,要将一些获取到的数据存入Oracle数据库中,可能以前接触的数据库这一块比较少,没有在项目中使用过,所以就查找一些资料,将这几天的成果做一下记录。   环境:windows7 64...
  • u012139536
  • u012139536
  • 2016-06-13 16:23:12
  • 5999
    个人资料
    持之以恒
    等级:
    访问量: 18万+
    积分: 4510
    排名: 8203
    最新评论