64,637
社区成员
发帖
与我相关
我的任务
分享
#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);
//获取类型nType对应的Oracle内部类型表示
//@param : nType, 列类型的码值
//@return : 列类型
char* GetType(ub2 nType);
//数据库服务名
static text* dbname = (text*)"orcl";
//用户及密码
static text* username = (text*)"scott";
static text* password = (text*) "tiger";
//表名
static text* tablename = (text*) "test_tab";
static char colname[64] = "";
static text* insert = (text*)"INSERT INTO test_tab(id,name,age) VALUES(:v1, :v2, :v3)";
static text* delstr = (text*)"Delete from test_tab where id=:v1";
static text* selstr = (text*) "SELECT id, name, age FROM test_tab where id=:v1";
OCIEnv *envhp; // 环境句柄
OCIServer *srvhp; //服务器句柄
OCIError *errhp; //错误句柄
OCISession *usrhp; //用户会话句柄
OCISvcCtx *svchp; //服务上下文句柄
OCIDescribe* dschp; //描述句柄
OCIParam *parmhp = NULL; //参数句柄
OCIParam *collsthp = NULL; //列列句柄
OCIParam *colhp = NULL; //列句柄
OCIBind* bndhp1 = NULL;
OCIBind* bndhp2 = NULL;
OCIBind* bndhp3 = NULL;
int sel()
{
//三个定义句柄,用于定义输出结果
OCIDefine* defhp1;
OCIDefine* defhp2;
OCIDefine* defhp3;
//输出变量
char szId[20];
char szName[20];
char szAge[20];
//输入变量
char szID[20]="11";
OCIStmt *stmthp = NULL; //语句句柄
//分配语句句柄
CheckErr(errhp, OCIHandleAlloc(envhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, 0));
//准备SQL语句
CheckErr(errhp, OCIStmtPrepare(stmthp, errhp, selstr, strlen((char*)selstr),
OCI_NTV_SYNTAX, OCI_DEFAULT));
printf("%s\n", selstr);
////输入变量绑定
/*CheckErr(errhp, OCIBindByPos(stmthp, &bndhp1, errhp, 1, szID,
sizeof(szID), SQLT_STR, NULL, NULL,NULL,0, NULL, OCI_DEFAULT));*/
CheckErr(errhp,OCIBindByName(stmthp, &bndhp1, errhp,(text *) ":v1",(sb4) strlen((char *) ":v1"),
(dvoid *) & szID,(sb4) sizeof(szID),SQLT_STR,(dvoid *) 0, (ub2 *)0,
(ub2 *)0,(ub4) 0, (ub4 *) 0,(ub4) OCI_DEFAULT));
CheckErr(errhp, OCIStmtExecute(svchp, stmthp, errhp,0, 0, NULL, NULL,OCI_DEFAULT));
//定义输出
CheckErr(errhp, OCIDefineByPos(stmthp, &defhp1, errhp, 1, szId, sizeof(szId),
SQLT_STR, 0, 0, 0, OCI_DEFAULT));
CheckErr(errhp, OCIDefineByPos(stmthp, &defhp2, errhp, 2, szName, sizeof(szName),
SQLT_STR, 0, 0, 0, OCI_DEFAULT));
CheckErr(errhp, OCIDefineByPos(stmthp, &defhp3, errhp, 3, szAge, sizeof(szAge),
SQLT_STR, 0, 0, 0, OCI_DEFAULT));
printf("\n查询结果为: \n");
printf("ID NAME AGE \n");
printf("---------------------------------------------------\n");
printf("%d\n",OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT));
//提取结果
while( OCI_NO_DATA != OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT))
{
printf("%-8s%-8s%-8s", szId, szName, szAge);
printf("\n");
}
return 0;
}
int Insert()
{
char szID[20]="10";
char szName[32] = "hexiong";
char szage[20]="20";
OCIStmt *stmthp = NULL; //语句句柄
const ub4 seed = 10000;
//获取类型映射信息
//分配语句句柄
CheckErr(errhp, OCIHandleAlloc(envhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, 0));
//准备SQL语句
CheckErr(errhp, OCIStmtPrepare(stmthp, errhp, insert, strlen((char*)insert),
OCI_NTV_SYNTAX, OCI_DEFAULT));
srand(seed);
printf("%s\n", insert);
//输入变量绑定
CheckErr(errhp, OCIBindByPos(stmthp, &bndhp1, errhp, 1, &szID,
sizeof(szID), SQLT_STR, 0, 0, 0, 0, 0, OCI_DEFAULT));
CheckErr(errhp, OCIBindByPos(stmthp, &bndhp2, errhp, 2, &szName,
sizeof(szName), SQLT_STR, 0, 0, 0, 0, 0, OCI_DEFAULT));
CheckErr(errhp, OCIBindByPos(stmthp, &bndhp3, errhp, 3, &szage,
sizeof(szage), SQLT_STR, 0, 0, 0, 0, 0, OCI_DEFAULT));
CheckErr(errhp, OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL,
OCI_DEFAULT));
//得到已经成功处理的记录行数
int rows_processed = 0;
OCIAttrGet(stmthp, OCI_HTYPE_STMT, &rows_processed, 0, OCI_ATTR_ROW_COUNT, errhp);
printf("已经成功处理记录%d行\n", rows_processed);
return 0;
}
int del()
{
OCIStmt *stmthp = NULL; //语句句柄
sword status;
text textSQL[1024];
////分配语句句柄
CheckErr(errhp, OCIHandleAlloc(envhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, 0));
sprintf((char*)textSQL,"DELETE FROM %s WHERE %s%s :DelFieldVal","test_tab","id","=");
CheckErr(errhp, OCIStmtPrepare(stmthp,errhp,textSQL,strlen((char*)textSQL),OCI_NTV_SYNTAX,OCI_DEFAULT ));
//代码
//7.2,处理SQL的第二步,绑定(binding)
text textColVal[20];//条件字段的数值
sb4 len;
int strlength=2;
sprintf((char*)textColVal,"%s", "11");
textColVal[strlength]='\0';
len=strlen((const char *)textColVal)+1;
//由名称来绑定
CheckErr(errhp, OCIBindByName(stmthp, &bndhp1,errhp, (text *) ":DelFieldVal",-1,(ub1 *) &textColVal, len, SQLT_STR,
0,(ub2 *)0,(ub2*)0,(ub4) 0,(ub4 *) 0, OCI_DEFAULT));
//代码
//7.3,处理SQL的第三步,执行
CheckErr(errhp, OCIStmtExecute(svchp,stmthp,errhp,(ub4)1,0,NULL,NULL,OCI_DEFAULT));
CheckErr(errhp, OCITransCommit(svchp, errhp, (ub4) 0)) ;
//得到已经成功处理的记录行数
int rows_processed = 0;
OCIAttrGet(stmthp, OCI_HTYPE_STMT, &rows_processed, 0, OCI_ATTR_ROW_COUNT, errhp);
printf("已经成功处理记录%d行\n", rows_processed);
return 0;
}
int main()
{
//使用对象模式来创建环境句柄
OCIEnvCreate(&envhp, OCI_OBJECT, (dvoid *)0,0, 0, 0, (size_t) 0, (dvoid **)0);
//分配服务器句柄
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&srvhp,OCI_HTYPE_SERVER, 0, (dvoid **) 0);
//分配错误句柄
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&errhp,OCI_HTYPE_ERROR, 0, (dvoid **) 0);
//创建服务器上下文句柄,"orcl"为建立连接的数据库名
if (OCIServerAttach (srvhp, errhp, (text *)dbname,
strlen ((char*)dbname), OCI_DEFAULT) == OCI_SUCCESS)
printf("\n已经成功连上数据库orcl\n");
else //终止程序
{
printf("\n数据库名字不对,连接数据库失败!\n");
system("PAUSE");
return -1;
}
//分配服务器上下文句柄
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&svchp,
OCI_HTYPE_SVCCTX, 0, (dvoid **) 0);
//设置服务器上下文句柄的服务器句柄属性
OCIAttrSet ((dvoid *)svchp, OCI_HTYPE_SVCCTX,
(dvoid *)srvhp, (ub4) 0, OCI_ATTR_SERVER, errhp);
//分配用户会话句柄
OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&usrhp,
OCI_HTYPE_SESSION, 0, (dvoid **) 0);
//为用户会话句柄设置用户名和密码属性
OCIAttrSet ((dvoid *)usrhp, OCI_HTYPE_SESSION,
(dvoid *)username, (ub4)strlen((char*)username),
OCI_ATTR_USERNAME, errhp);
OCIAttrSet ((dvoid *)usrhp, OCI_HTYPE_SESSION,
(dvoid *)password, (ub4)strlen((char*)password),
OCI_ATTR_PASSWORD, errhp);
//申请描述句柄
OCIHandleAlloc((dvoid*)envhp, (dvoid**)&dschp, OCI_HTYPE_DESCRIBE, 0, (void**)0);
if (OCISessionBegin ( svchp, errhp, usrhp,
OCI_CRED_RDBMS, OCI_DEFAULT) == OCI_SUCCESS)
{
printf("成功建立用户会话!\n");
}
else
{
printf("建立用户会话失败!\n");
system("PAUSE");
return -1;
}
//在服务器上下文环境中设置用户会话属性
OCIAttrSet ( (dvoid *)svchp, OCI_HTYPE_SVCCTX,
(dvoid *)usrhp, (ub4) 0, OCI_ATTR_SESSION, errhp);
sel();
Insert();
del();
printf("结束会话和数据库连接!\n");
//结束会话
OCISessionEnd(svchp, errhp, usrhp, OCI_DEFAULT);
//断开连接
OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
//释放环境句柄
OCIHandleFree((void*)envhp, OCI_HTYPE_ENV);
int nTemp;
scanf("%d", &nTemp);
system("PAUSE");
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; //确实有错误
printf("错误!");
system("PAUSE");
exit(-1);
}
else
{
return 1; //没有检查到错误
}
}
char* GetType(ub2 nType)
{
char* str = colname;
switch(nType)
{
case SQLT_AFC:
case SQLT_VCS:
case SQLT_CHR:
strcpy(str, "VARCHAR2");
break;
case SQLT_DAT:
strcpy(str, "DATE");
break;
case SQLT_INT:
strcpy(str, "INTEGER");
break;
case SQLT_UIN:
strcpy(str, "INTEGER");
break;
case SQLT_FLT:
strcpy(str, "FLOAT");
break;
case SQLT_BLOB:
case SQLT_BIN:
strcpy(str, "BLOB");
break;
case SQLT_NUM:
strcpy(str, "NUMBER");
break;
default:
strcpy(str, "UNSUPPORTED");
break;
}
return str;
}