⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap14_eg1.cpp

📁 《Oracle Spatial与OCI高级编程》相关配套源码。介绍了Oracle数据库中的两项关键开发技术Oracle Spatial以及OCI(Oracle Call Interface)。
💻 CPP
字号:
/*
* Copyright (c) OCI高级编程
* @File name: chap14_eg1.cpp
* @Author   : He Xiong
* @Content  : 本地简单事务处理

****/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>

#if defined(WIN32)
#pragma comment(lib, "oci.lib")
#endif

//获取错误诊断信息
//@param   : pErr,错误句柄
//           lStatus, 状态码信息
//@return  : 0: 失败,出错
//			 1: 成功返回
int CheckErr(OCIError *pErr, sword lStatus);

//数据库服务名
static text* dbname = (text*) "orcl";

//用户及密码
static text* username = (text*) "ocitest";
static text* password = (text*) "ocitest";

//DML(INSERT)操作的SQL语句
static text* insert1 = (text*) "INSERT INTO STUDENT(id, name, age)"
			" VALUES(100, '李四', 25)";

static text* insert2 = (text*) "INSERT INTO STUDENT(id, name, age)"
			" VALUES(101, '张三', 23)";


int main()
{
	
	OCIEnv *myenvhp; // 环境句柄
	OCIServer *mysrvhp; //服务器句柄
	OCIError *myerrhp; //错误句柄
	OCIError *myerrhp1; //错误句柄
	OCIError *myerrhp2; //错误句柄
	OCISession *myusrhp; //用户会话句柄
	OCISvcCtx *mysvchp; //服务上下文句柄
	OCIStmt* stmthp; //语句句柄

	OCIBind* bndhp1 = NULL;
	OCIBind* bndhp2 = NULL;

	int	nSID[5] = {1, 2, 1, 1, 3}; //学号
	char szName[5][32] = {"Bob", "Ying", "HeXiong", "Jenny", "Mary" }; //姓名
	sb4 nNameLen = 32;
	sb4 status = 0;


	//使用线程和对象模式来创建环境句柄
	OCIEnvCreate(&myenvhp, OCI_THREADED|OCI_OBJECT, (dvoid *)0,
		0, 0, 0, (size_t) 0, (dvoid **)0);
	//分配服务器句柄
	OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&mysrvhp,
		OCI_HTYPE_SERVER, 0, (dvoid **) 0);
	//分配错误句柄
	OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&myerrhp,
		OCI_HTYPE_ERROR, 0, (dvoid **) 0);
	OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&myerrhp1,
		OCI_HTYPE_ERROR, 0, (dvoid **) 0);
	OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&myerrhp2,
		OCI_HTYPE_ERROR, 0, (dvoid **) 0);

	//创建服务器上下文句柄,"orcl"为建立连接的数据库名
	if (OCIServerAttach (mysrvhp, myerrhp, (text *)dbname,
		strlen ((char*)dbname), OCI_DEFAULT) == OCI_SUCCESS)
		printf("\n已经成功连上数据库orcl\n");
	else //终止程序
	{
		printf("\n数据库名字不对,连接数据库失败!\n");
		return -1;
	}
	//分配服务器上下文句柄
	OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&mysvchp,
		OCI_HTYPE_SVCCTX, 0, (dvoid **) 0);
	//设置服务器上下文句柄的服务器句柄属性
	OCIAttrSet ((dvoid *)mysvchp, OCI_HTYPE_SVCCTX,
		(dvoid *)mysrvhp, (ub4) 0, OCI_ATTR_SERVER, myerrhp);
	//分配用户会话句柄
	OCIHandleAlloc ((dvoid *)myenvhp, (dvoid **)&myusrhp,
		OCI_HTYPE_SESSION, 0, (dvoid **) 0);
	//为用户会话句柄设置用户名和密码属性
	OCIAttrSet ((dvoid *)myusrhp, OCI_HTYPE_SESSION,
		(dvoid *)username, (ub4)strlen((char*)username),
		OCI_ATTR_USERNAME, myerrhp);
	OCIAttrSet ((dvoid *)myusrhp, OCI_HTYPE_SESSION,
		(dvoid *)password, (ub4)strlen((char*)password),
		OCI_ATTR_PASSWORD, myerrhp);
	if (OCISessionBegin ( mysvchp, myerrhp, myusrhp,
		OCI_CRED_RDBMS, OCI_DEFAULT) == OCI_SUCCESS)
	{
		printf("成功建立用户会话!\n");
	}
	else
	{
		printf("建立用户会话失败!\n");
		return -1;
	}
	//在服务器上下文环境中设置用户会话属性
	OCIAttrSet ( (dvoid *)mysvchp, OCI_HTYPE_SVCCTX,
		(dvoid *)myusrhp, (ub4) 0, OCI_ATTR_SESSION, myerrhp);
	//分配语句句柄
	CheckErr(myerrhp, OCIHandleAlloc(myenvhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, 0));
	//准备第一个SQL语句
	CheckErr(myerrhp, OCIStmtPrepare(stmthp, myerrhp, insert1, strlen((char*)insert1),
		OCI_NTV_SYNTAX, OCI_DEFAULT));

	//插入第一条记录
	status = OCIStmtExecute(mysvchp, stmthp, myerrhp, 1, 0, NULL, NULL,
		OCI_DEFAULT);

	if (status && status != OCI_SUCCESS_WITH_INFO)
	{
		OCIHandleFree((dvoid*)myenvhp, OCI_HTYPE_ENV);
		return -1;
	}
	printf("插入第一条记录完成\n");

	//提交结果
	OCITransCommit(mysvchp, myerrhp, (ub4) 0);
	printf("提交第一条记录的插入操作\n");
	//准备第二个SQL语句
	CheckErr(myerrhp, OCIStmtPrepare(stmthp, myerrhp, insert2, strlen((char*)insert1),
		OCI_NTV_SYNTAX, OCI_DEFAULT));

	//插入第二条记录
	status = OCIStmtExecute(mysvchp, stmthp, myerrhp, 1, 0, NULL, NULL,
		OCI_DEFAULT);

	if (status && status != OCI_SUCCESS_WITH_INFO)
	{
		OCIHandleFree((dvoid*)myenvhp, OCI_HTYPE_ENV);
		return -1;
	}
	printf("插入第二条记录完成\n");
	OCITransRollback(mysvchp, myerrhp, (ub4) 0);
	printf("回滚第二条记录的插入操作\n");
	printf("结束会话和数据库连接!\n");
	//结束会话
	OCISessionEnd(mysvchp, myerrhp, myusrhp, OCI_DEFAULT);
	//断开连接
	OCIServerDetach(mysrvhp, myerrhp, OCI_DEFAULT);
	//释放环境句柄
	OCIHandleFree((void*)myenvhp, OCI_HTYPE_ENV);
	
	int nTemp;
	scanf("%d", &nTemp);

	return 0;
}

int CheckErr(OCIError *pErr, sword lStatus)
{
    
    sb4		m_s_nErrCode = 0;
	char	m_s_szErr[512];
    
    switch (lStatus)
    {
    case OCI_SUCCESS:
        strcpy(m_s_szErr,"OCI_SUCCESS");    
        break;
    case OCI_SUCCESS_WITH_INFO:
        strcpy(m_s_szErr, "OCI_SUCCESS_WITH_INFO");
		printf("OCI Error: %s\n", m_s_szErr);
        break;
    case OCI_ERROR:
        OCIErrorGet((dvoid *)pErr, (ub4)1, (text *)NULL, &m_s_nErrCode, 
            (unsigned char*)m_s_szErr, (ub4)sizeof(m_s_szErr), OCI_HTYPE_ERROR);
		printf("OCI Error: %s\n", m_s_szErr);
        break;
    case OCI_NEED_DATA:
        strcpy(m_s_szErr, "OCI_NEED_DATA");
		printf("OCI Error: %s\n", m_s_szErr);
        break;
    case OCI_NO_DATA:
        strcpy(m_s_szErr, "OCI_NO_DATA");
		printf("OCI Error: %s\n", m_s_szErr);
        break;
    case OCI_INVALID_HANDLE:
        strcpy(m_s_szErr, "OCI_INVALID_HANDLE");
		printf("OCI Error: %s\n", m_s_szErr);
        break;
    case OCI_STILL_EXECUTING:
        strcpy(m_s_szErr, "OCI_STILL_EXECUTING");
		printf("OCI Error: %s\n", m_s_szErr);
        break;
    case OCI_CONTINUE:
        strcpy(m_s_szErr, "OCI_CONTINUE");
		printf("OCI Error: %s\n", m_s_szErr);
        break;
    default:
        break;
    }
    if (lStatus != OCI_SUCCESS && lStatus != OCI_SUCCESS_WITH_INFO)
    {
        return 0;  //确实有错误
    } 
    else 
    {
        return 1;  //没有检查到错误
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -