为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8_20240923_x86_kylin10_64
【操作系统】:Kylin-Server-V10-SP3-2403-Release-20240426-x86_64
【CPU】:Hygon C86 7380 32-core Processor
【问题描述】*:使用DCI接口,OCIStmtFetch返回OCI_NO_DATA,但是用DM管理工具执行sql是有2行数据的,请教下是什么原因导致DCI接口无数据。(编译时候是链接的贵公司提供的libdmoci.so,最后修改时间2022/3/4 13:39)
1、代码如下:
#include "DCI.h"
OCIEnv *m_pEnvHandle; //环境句柄
OCISvcCtx *m_pSvcHandle; //服务句柄
OCIError *m_pErrHandle; //错误句柄
OCIServer *m_pSrvHandle; //服务器句柄
OCISession *m_pAutHandle; //会话句柄
bool queryDMDB(const char dbname,const char username,const char password)
{
/1连接数控*******************************************************************/
if (OCIInitialize((ub4)OCI_THREADED, (dvoid*)0, (dvoid ()(dvoid , size_t))0,
(dvoid ()(dvoid, dvoid*, size_t))0, (void ()(dvoid , dvoid ))0))
{
m_ErrorStr ="OCIInitialize错误";
return false;
}
// 初始化环境 ...
if (OCIEnvInit((OCIEnv)&m_pEnvHandle, OCI_DEFAULT, (size_t)0, (dvoid )0))
{
m_ErrorStr ="OCIEnvInit错误";
return false;
}
if (OCIHandleAlloc((dvoid)m_pEnvHandle, (dvoid*)&m_pErrHandle,OCI_HTYPE_ERROR, (size_t)0, (dvoid**)0))
{
m_ErrorStr = "分配错误句柄失败";
m_pErrHandle = NULL;
return false;
}
if (OCIHandleAlloc((dvoid)m_pEnvHandle, (dvoid**)&m_pSrvHandle,OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0))
{
m_ErrorStr = "分配服务器句柄失败";
m_pSrvHandle = NULL;
return false;
}
if (OCIHandleAlloc((dvoid*)m_pEnvHandle, (dvoid**)&m_pSvcHandle,OCI_HTYPE_SVCCTX, (size_t)0, (dvoid**)0))
{
m_ErrorStr = "分配服务句柄失败";
m_pSvcHandle = NULL;
return false;
}
// 连接服务 ...
if (OCIServerAttach(m_pSrvHandle, m_pErrHandle, (text*)dbname, strlen((char*)dbname), 0))
{
m_ErrorStr = "附加服务器失败";
return false;
}
if (OCIAttrSet((dvoid*)m_pSvcHandle, OCI_HTYPE_SVCCTX, (dvoid*)m_pSrvHandle,
(ub4)0, OCI_ATTR_SERVER, (OCIError*)m_pErrHandle))
{
m_ErrorStr = "设置服务器属性失败";
return false;
}
if (OCIHandleAlloc((dvoid*)m_pEnvHandle, (dvoid**)&m_pAutHandle,
OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0))
{
m_ErrorStr = "分配会话句柄失败";
m_pAutHandle = NULL;
return false;
}
if (OCIAttrSet((dvoid*)m_pAutHandle, OCI_HTYPE_SESSION, (dvoid*)username,
(ub4)strlen(username), OCI_ATTR_USERNAME, m_pErrHandle))
{
m_ErrorStr = "设置用户属性失败";
return false;
}
if (OCIAttrSet((dvoid*)m_pAutHandle, OCI_HTYPE_SESSION, (dvoid*)password,
(ub4)strlen(password), OCI_ATTR_PASSWORD, m_pErrHandle))
{
m_ErrorStr = "设置口令属性失败";
return false;
}
// 开始会话 ...
if (OCISessionBegin(m_pSvcHandle, m_pErrHandle, m_pAutHandle,
OCI_CRED_RDBMS,(ub4)OCI_DEFAULT))
{
m_ErrorStr = "开始会话失败";
return false;
}
if (OCIAttrSet((dvoid*)m_pSvcHandle, (ub4)OCI_HTYPE_SVCCTX,
(dvoid *)m_pAutHandle, (ub4)0,(ub4)OCI_ATTR_SESSION, m_pErrHandle))
{
m_ErrorStr = "设置会话属性失败";
return false;
}
//分配错误句柄
if (OCIHandleAlloc((dvoid*)m_pEnvHandle, (dvoid**)&m_pErrHandle,OCI_HTYPE_ERROR, (size_t)0, (dvoid**)0))
{
m_ErrorStr = "无法分配错误句柄!";
return;
}
//分配陈述句柄
if (OCIHandleAlloc((dvoid*)m_pEnvHandle, (dvoid**)&m_pStmt,OCI_HTYPE_STMT, (size_t)0, (dvoid**)0))
{
m_ErrorStr = "无法分配陈述句柄!";
return;
}
bool m_CachFlag = true;
unsigned int m_CachRows = 4096; //缓冲大小
char strSQL[256]={0};
strcpy(strSQL,"strSql = "Select 1 From TDFKOWNER.TERMINAL_INFO A Where A.terimal_comm_protocol = '5' ");
if (OCIStmtPrepare(m_pStmt, m_pErrHandle, (text*)strSQL, m_Sql.GetLength(), OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT))
{
//获取错误信息
char buffer[512];
int bufferlen = 512;
int ret;
OCIErrorGet(m_pErrHandle, 1, NULL, &ret, (text*)buffer,
bufferlen, OCI_HTYPE_ERROR);
m_ErrorStr = buffer;
return false;
}
ub2 m_SqlType;
//获取语句类型
if (OCIAttrGet(m_pStmt, OCI_HTYPE_STMT, &m_SqlType,0, OCI_ATTR_STMT_TYPE, m_pErrHandle))
{
//获取错误信息
char buffer[512];
int bufferlen = 512;
int ret;
OCIErrorGet(m_pErrHandle, 1, NULL, &ret, (text*)buffer,
bufferlen, OCI_HTYPE_ERROR);
m_ErrorStr = buffer;
return false;
}
//执行
if (OCIStmtExecute(m_pSvcHandle, m_pStmt, m_pErrHandle, (ub4)0, (ub4)1,
(CONST OCISnapshot *)NULL, (OCISnapshot )NULL, OCI_DEFAULT))
{
char buffer[512];
int bufferlen = 512;
int ret;
OCIErrorGet(m_pErrHandle, 1, NULL, &ret, (text)buffer,
bufferlen, OCI_HTYPE_ERROR);
m_ErrorStr = buffer;
return NULL;
}
ub4 nColumnCount;//可以获取到nColumnCount=1
if (OCIAttrGet(m_pStmt,OCI_HTYPE_STMT,&nColumnCount,0,OCI_ATTR_PARAM_COUNT,m_pErrHandle))
{
//获取列数量错误,获取错误信息
char buffer[512];
int bufferlen = 512;
int ret;
OCIErrorGet(m_pErrHandle, 1, NULL, &ret, (text*)buffer,
bufferlen, OCI_HTYPE_ERROR);
m_ErrorStr = buffer;
return false;
}
sword ret;
Juint32 nFetchRows;
ret = OCIStmtFetch(m_pStmt, m_pErrHandle,(ub4)m_CachRows,(ub4)OCI_FETCH_NEXT,(ub4) OCI_DEFAULT);
if (ret == OCI_NO_DATA)
{
//到末尾
printf("到末尾\n");
return false:
}
return true;
}
2、DM工具执行sql
完整的程序我后面会取结果。但是目前运行到这块判断没有数据就不取结果了
根据提供的代码,最后的逻辑中,没有如何输出结果,只有一个打印字符串的printf("到末尾\n");