为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:银河麒麟v10(基本等同于CentOS 7)
【CPU】:Hygon Dhyana Processor
【问题描述】*:命令行可连接数据库,.c程序连接时,OCISessionBegin报错“comm_inet_server_connect_port cannot get the address information, servername is cndba, port is 5236”,但明明端口已修改为6236了。
附:命令行语句: ./disql SYSDBA/密码@127.0.0.1:6236
代码:
/************************************************************************/
/* DCI编程实例 (较DCI手册示例有改动) */
/************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include "DCI.h"
// 声明句柄
DCIEnv* envhp; /* 环境句柄 */
DCISvcCtx* svchp; /* 服务环境句柄 */
DCIServer* srvhp; /* 服务器句柄 */
DCISession* authp; /* 会话句柄 */
DCIStmt* stmthp; /* 语句句柄 */
DCIDescribe* dschp; /* 描述句柄 */
DCIError* errhp; /* 错误句柄 */
DCIDefine* defhp[3]; /* 定义句柄 */
DCIBind* bidhp[4]; /* 绑定句柄 */
sb2 ind[3]; /* 指示符变量 */
// 绑定select结果集的参数
text szpersonid[11]; /* 存储personid列 */
text szsex[2]; /* 存储sex列 */
text szname[51]; /* 存储name列 */
text szemail[51]; /* 存储mail列 */
text szphone[26]; /* 存储phone列 */
char sql[256]; /* 存储执行的sql语句 */
int main(int argc, char* argv[])
{
char strServerName[50];
char strUserName[50];
char strPassword[50];
int ret;
text errbuf[100];
// 设置服务器,用户名和密码
strcpy(strServerName, "cndba");
strcpy(strUserName, "SYSDBA");
strcpy(strPassword, "SYSDBA");
// 初始化OCI应用环境
OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL);
// 初始化环境句柄
OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0);
// 分配句柄
OCIHandleAlloc(envhp, (dvoid**)&svchp, OCI_HTYPE_SVCCTX, 0, 0); /* 服务器环境句柄 */
OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, 0, 0); /* 服务器句柄 */
OCIHandleAlloc(envhp, (dvoid**)&authp, OCI_HTYPE_SESSION, 0, 0); /* 会话句柄 */
OCIHandleAlloc(envhp, (dvoid**)&errhp, OCI_HTYPE_ERROR, 0, 0); /* 错误句柄 */
OCIHandleAlloc(envhp, (dvoid**)&dschp, OCI_HTYPE_DESCRIBE, 0, 0); /* 描述符句柄 */
// 连接服务器
OCIServerAttach(srvhp, errhp, (text*)strServerName,
(sb4)strlen(strServerName), OCI_DEFAULT);
// 设置用户名和密码
OCIAttrSet(authp, OCI_HTYPE_SESSION, (text*)strUserName,
(ub4)strlen(strUserName), OCI_ATTR_USERNAME, errhp);
OCIAttrSet(authp, OCI_HTYPE_SESSION, (text*)strPassword,
(ub4)strlen(strPassword), OCI_ATTR_PASSWORD, errhp);
// 设置服务器环境句柄属性
OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX,
(dvoid*)srvhp, (ub4)0, OCI_ATTR_SERVER, errhp);
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid*)authp, 0,
OCI_ATTR_SESSION, errhp);
// 创建并开始一个用户会话
OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, 0, 0); /* 语句句柄 */
/************************************************************************/
/* 查询person表 */
/************************************************************************/
strcpy(sql, "select personid, name, phone from sysdba.person");
// 准备SQL语句
OCIStmtPrepare(stmthp, errhp, (text*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 绑定输出列
OCIDefineByPos(stmthp, &defhp[0], errhp, 1, (ub1*)szpersonid,
sizeof(szpersonid), SQLT_STR, &ind[0], 0, 0, OCI_DEFAULT);
OCIDefineByPos(stmthp, &defhp[1], errhp, 2, (ub1*)szname,
sizeof(szname), SQLT_STR, &ind[1], 0, 0, OCI_DEFAULT);
OCIDefineByPos(stmthp, &defhp[2], errhp, 3, (ub1*)szphone,
sizeof(szphone), SQLT_STR, &ind[2], 0, 0, OCI_DEFAULT);
// 执行SQL语句
ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, 0, NULL, NULL, OCI_DEFAULT);
if (ret != 0)
{
OCIErrorGet(errhp, 1, NULL, &ret, (OraText*)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
printf("\n%s\n", errbuf);
}
printf("%-10s%-10s%-10s\n", "PERSONID", "NAME", "PHONE");
while ((OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) != OCI_NO_DATA)
{
printf("%-10s", szpersonid);
printf("%-10s", szname);
printf("%-10s\n", szphone);
}
/************************************************************************/
/* 向person表插入一条数据 */
/************************************************************************/
memset(sql, 0, sizeof(sql));
strcpy(sql, "insert into sysdba.person(sex, name, email, phone) values(:sex,:name,:email,:phone)");
// 准备SQL语句
OCIStmtPrepare(stmthp, errhp, (text*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 设置输入参数
memset(szsex, 0, sizeof(szsex));
memcpy(szsex, "M", strlen("M") + 1);
memset(szname, 0, sizeof(szname));
memcpy(szname, "张三", strlen("张三") + 1);
memset(szemail, 0, sizeof(szemail));
memcpy(szemail, "zhangsan@dameng.com", strlen("zhangsan@dameng.com") + 1);
memset(szphone, 0, sizeof(szphone));
memcpy(szphone, "02712345678", strlen("02712345678") + 1);
// 绑定输入列
const OraText col_sex[] = ":sex";
const OraText col_name[] = ":name";
const OraText col_email[] = ":email";
const OraText col_phone[] = ":phone";
OCIBindByName(stmthp, &bidhp[0], errhp, col_sex, 4, szsex,
strlen((char*)szsex), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
OCIBindByName(stmthp, &bidhp[1], errhp, col_name, 5, szname,
strlen((char*)szname), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
OCIBindByName(stmthp, &bidhp[2], errhp, col_email, 6, szemail,
strlen((char*)szemail), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
OCIBindByName(stmthp, &bidhp[3], errhp, col_phone, 6, szphone,
strlen((char*)szphone), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
// 执行SQL语句
ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0,
(CONST OCISnapshot*) 0, (OCISnapshot*)0, (ub4)OCI_DEFAULT);
if (ret != 0)
{
OCIErrorGet(errhp, 1, NULL, &ret, (OraText*)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
printf("\n%s\n", errbuf);
}
else
{
printf("\n新增了 name = 张三 的记录。\n");
}
// 提交到数据库
OCITransCommit(svchp, errhp, OCI_DEFAULT);
/************************************************************************/
/* 更新person表 */
/************************************************************************/
memset(sql, 0, sizeof(sql));
strcpy(sql, "update sysdba.person set sex='M',name='Liuhuan',email='12345678@qq.com',phone='13399990000' WHERE personid='1'");
// 准备SQL语句
OCIStmtPrepare(stmthp, errhp, (text*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 执行SQL语句
ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0,
(CONST OCISnapshot*)0, (OCISnapshot*)0, (ub4)OCI_DEFAULT);
if (ret != 0)
{
OCIErrorGet(errhp, 1, NULL, &ret, (OraText*)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
printf("\n%s\n", errbuf);
}
else
{
printf("\n更新了 personid = 1 的记录。\n");
}
// 提交到数据库
OCITransCommit(svchp, errhp, OCI_DEFAULT);
/************************************************************************/
/* 删除person表的ID为5的记录,首先要在数据库中存在这条记录 */
/************************************************************************/
memset(sql, 0, sizeof(sql));
strcpy(sql, "delete from sysdba.person WHERE personid=:1");
// 准备SQL语句
OCIStmtPrepare(stmthp, errhp, (text*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 绑定输入参数
memset(szpersonid, 0, sizeof(szpersonid));
memcpy(szpersonid, "5", strlen("5") + 1);
OCIBindByPos(stmthp, &bidhp[0], errhp, 1, szpersonid, strlen((char*)szpersonid),
SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
// 执行SQL语句
ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0,
(CONST OCISnapshot*) 0, (OCISnapshot*)0, (ub4)OCI_DEFAULT);
if (ret != 0)
{
OCIErrorGet(errhp, 1, NULL, &ret, (OraText*)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
printf("\n%s\n", errbuf);
}
else
{
printf("\n删除了 personid = 5 的记录。\n");
}
// 提交到数据库
OCITransCommit(svchp, errhp, OCI_DEFAULT);
/************************************************************************/
/* 再次查询person表 */
/************************************************************************/
strcpy(sql, "select personid, name, phone from sysdba.person");
// 准备SQL语句
OCIStmtPrepare(stmthp, errhp, (text*)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 绑定输出列
OCIDefineByPos(stmthp, &defhp[0], errhp, 1, (ub1*)szpersonid,
sizeof(szpersonid), SQLT_STR, &ind[0], 0, 0, OCI_DEFAULT);
OCIDefineByPos(stmthp, &defhp[1], errhp, 2, (ub1*)szname,
sizeof(szname), SQLT_STR, &ind[1], 0, 0, OCI_DEFAULT);
OCIDefineByPos(stmthp, &defhp[2], errhp, 3, (ub1*)szphone,
sizeof(szphone), SQLT_STR, &ind[2], 0, 0, OCI_DEFAULT);
// 执行SQL语句
ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, 0, NULL, NULL, OCI_DEFAULT);
if (ret != 0)
{
OCIErrorGet(errhp, 1, NULL, &ret, (OraText*)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
printf("\n%s\n", errbuf);
}
printf("\n%-10s%-10s%-10s\n", "PERSONID", "NAME", "PHONE");
while ((OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) != OCI_NO_DATA)
{
printf("%-10s", szpersonid);
printf("%-10s", szname);
printf("%-10s\n", szphone);
}
//结束会话
OCISessionEnd(svchp, errhp, authp, (ub4)0);
//断开与数据库的连接
OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
//释放OCI句柄
OCIHandleFree((dvoid*)dschp, OCI_HTYPE_DESCRIBE);
OCIHandleFree((dvoid*)stmthp, OCI_HTYPE_STMT);
OCIHandleFree((dvoid*)errhp, OCI_HTYPE_ERROR);
OCIHandleFree((dvoid*)authp, OCI_HTYPE_SESSION);
OCIHandleFree((dvoid*)svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid*)srvhp, OCI_HTYPE_SERVER);
system("pause");
return 0;
}