#include "BaseHeader.h"
sql_context ConnectDataBase(CString oracleStr);sql_context ConnectPSDataBase();BOOL DisconnectDataBase(sql_context _disConnection);
BOOL Update2DB(const char *piName, long srcSize, long tezhSize, long modiTime);BOOL GetPictBDParamByZjbh(const char *zjbh1, const char *zjbh2, int *outKV1, int *outKV2);int GetFreeConnect();void FreeConnect(int &iConnect);void DisposeConnect(int iConnect);void DisposeAllConnect(BOOL forceDis);sql_context GetDBConnectPtr(int dbid);void sql_error(char *msg, sqlca m_sqlca);int alloc_descriptors(int size, int max_vname_len, int max_iname_len,SQLDA * bind_dp,SQLDA * select_dp);void process_select_list(CStringArray& AFieldsarray,SQLDA * bind_dp,SQLDA * select_dp);
错误代码如下:
ProcessDBEvent.h:3: error: expected constructor, destructor, or type conversion before '*' token
ProcessDBEvent.h:4: error: expected constructor, destructor, or type conversion before '*' token
ProcessDBEvent.h:5: error: 'sql_context' was not declared in this scope
ProcessDBEvent.h:5: error: '_disConnection' was not declared in this scope
ProcessDBEvent.h:14: error: 'sql_context' does not name a type
ProcessDBEvent.h:15: error: 'sqlca' has not been declared
ProcessDBEvent.h:16: error: 'SQLDA' has not been declared
ProcessDBEvent.h:16: error: 'SQLDA' has not been declared
ProcessDBEvent.h:17: error: 'SQLDA' has not been declared
ProcessDBEvent.h:17: error: 'SQLDA' has not been declared
sql_context ConnectDataBase(CString oracleStr);sql_context ConnectPSDataBase();BOOL DisconnectDataBase(sql_context _disConnection);
BOOL Update2DB(const char *piName, long srcSize, long tezhSize, long modiTime);BOOL GetPictBDParamByZjbh(const char *zjbh1, const char *zjbh2, int *outKV1, int *outKV2);int GetFreeConnect();void FreeConnect(int &iConnect);void DisposeConnect(int iConnect);void DisposeAllConnect(BOOL forceDis);sql_context GetDBConnectPtr(int dbid);void sql_error(char *msg, sqlca m_sqlca);int alloc_descriptors(int size, int max_vname_len, int max_iname_len,SQLDA * bind_dp,SQLDA * select_dp);void process_select_list(CStringArray& AFieldsarray,SQLDA * bind_dp,SQLDA * select_dp);
错误代码如下:
ProcessDBEvent.h:3: error: expected constructor, destructor, or type conversion before '*' token
ProcessDBEvent.h:4: error: expected constructor, destructor, or type conversion before '*' token
ProcessDBEvent.h:5: error: 'sql_context' was not declared in this scope
ProcessDBEvent.h:5: error: '_disConnection' was not declared in this scope
ProcessDBEvent.h:14: error: 'sql_context' does not name a type
ProcessDBEvent.h:15: error: 'sqlca' has not been declared
ProcessDBEvent.h:16: error: 'SQLDA' has not been declared
ProcessDBEvent.h:16: error: 'SQLDA' has not been declared
ProcessDBEvent.h:17: error: 'SQLDA' has not been declared
ProcessDBEvent.h:17: error: 'SQLDA' has not been declared
解决方案 »
- 如何恢复oracle表名
- 单元格计算过后汇总! (Excel or 润乾)
- java和数据库连接的那段知识有木有视频教程?
- 为什么SYSAUX可以offline不能read only?
- 怎样在存储过程中让变量以结果集的方式显示出来?
- 急!80分SOS!! imp .dmp文件的同时,可以truncate 刚imp 的垃圾表吗?
- 求救,请大侠执教,忘记了进入sqlplus的用户名和密码怎么办,oracle中有哪个文件保存这个信息?
- 急问oracle 的agent服务为什么启动不了?
- 急救!
- 为什么执行备份JOB时,MANAGER SERVER服务会断开呢,在线等待
- 一条sql语句 谢谢
- 游标接受数组变量
EXEC SQL INCLUDE oraca;
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE sqlda;
EXEC ORACLE OPTION (ORACA=YES);
ProcessDBEvent.h: In function 'void process_select_list(CStringArray&, SQLDA*, SQLDA*, void*)':
ProcessDBEvent.h:947: error: 'sqlnul' was not declared in this scope
ProcessDBEvent.h:952: error: 'sqlprc' was not declared in this scope
ProcessDBEvent.h: In function 'int alloc_descriptors(int, int, int, SQLDA*, SQLDA*)':
ProcessDBEvent.h:996: error: 'sqlald' was not declared in this scope
ProcessDBEvent.h:1002: error: 'sqlald' was not declared in this scope
ProcessDBEvent.h:1012: error: cannot convert 'short int*' to 'char*' in assignment
ProcessDBEvent.h:1016: error: cannot convert 'short int*' to 'char*' in assignment
ProcessDBEvent.h: In function 'int RunSqlAndGetXML(MystrBuf&, const char*, void*)':
ProcessDBEvent.h:1219: error: 'sqlclu' was not declared in this scope我写了一个测试PRO×C连接oracle的数据库,能通过,也包含上面的函数
不知道这个错误是怎么回事,注,我先proc生成.h文件,然后g++编译出现上边的错误
g++编译的时候,没加别的参数么?
至少应该加些参数。。比如说:
gcc/g++ include=${ORACLE_HOME}/rdbms/demo include=${ORACLE_HOME}/rdbms/public ...
以上是编译的选项,有问题吗?
第一步:
sql_context ConnectDataBase(CString oracleParam)
{
CString errormessage, errorstr;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR ConnStr[100];
sql_context context;
struct sqlca m_sqlca;
EXEC SQL END DECLARE SECTION;
memcpy(ConnStr.arr,oracleParam.c_str(),oracleParam.GetLength());
ConnStr.len = oracleParam.GetLength();
try //建立数据库连接
{
if(strlen(oracleParam)>5)
{
EXEC SQL ENABLE THREADS;
EXEC SQL CONTEXT ALLOCATE :context;
EXEC SQL CONTEXT USE :context;
EXEC SQL CONNECT :ConnStr;
if (SQLCODE < 0)
{
errormessage+=("Failed: ");
errormessage+="OracleString=";
errormessage+=oracleParam;
errorstr.Format("\n创建数据库连接失败,,%d:%s\n",SQLCODE, m_sqlca.sqlerrm.sqlerrmc);
errormessage += errorstr;
WriteLogFile(errormessage);
return NULL;
}
}
return context;
}
catch(...)
{
errormessage+=("Exception: ");
errormessage+="OracleString=";
errormessage+=oracleParam;
WriteLogFile(errormessage);
return NULL;
}
}
建立连接池
第二步:传入sql语句执行
int RunSqlAndGetXML(MystrBuf &opBuf, const char *sqlStr, sql_context inCon)
{
printf("RunSqlAndGetXML_0\n");
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR sqlexec[1024];
// char vc_user[30] = {"hzchanncel/hzchanncel@orcl"};
EXEC SQL END DECLARE SECTION;
bool teOK=false;
CString ErrorStr;
memcpy(sqlexec.arr,sqlStr,strlen(sqlStr));
sqlexec.len = strlen(sqlStr);
// EXEC SQL CONNECT :vc_user; EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE ERRROR: ",inCon);
printf("RunSqlAndGetXML_1\n");
EXEC SQL CONTEXT USE :inCon;
printf("RunSqlAndGetXML_2\n");
printf("%s\t\t%d\n",sqlexec.arr,inCon);
EXEC SQL PREPARE S FROM :sqlexec;
printf("RunSqlAndGetXML_3\n");
EXEC SQL DECLARE C CURSOR FOR S;
printf("RunSqlAndGetXML_4\n");
if( (strncmp(sqlStr,"SELECT",6)) != 0 && (strncmp(sqlStr,"select",6) != 0))
{
EXEC SQL open C;
if(sqlca.sqlcode >= 0)
{
teOK = true;
return 0;
}
else
{
ErrorStr.Format("EXEC SQL Failed:%s",sqlStr);
WriteLogFile(ErrorStr);
return -1;
}
}
printf("RunSqlAndGetXML_5\n"); CString str;
CStringArray fieldsarray;
long i, recCnt=0;
SQLDA * bind_dp;
SQLDA * select_dp;
DWORD dwStart = GetTickCount();
printf("RunSqlAndGetXML_6\n");
if(alloc_descriptors(MAX_ITEMS,MAX_VNAME_LEN,MAX_INAME_LEN,bind_dp,select_dp)!= 0 )
{
return -1;
}
printf("RunSqlAndGetXML_7\n");
process_select_list(fieldsarray,bind_dp,select_dp,inCon);
printf("RunSqlAndGetXML_8\n");
if(fieldsarray.GetSize() <= 0)
return 0;
MyAddString(&opBuf, "<?xml version=\"1.0\" standalone=\"yes\"?>\r\n");
MyAddString(&opBuf, "<DEFAULT>\r\n");
EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop;
printf("RunSqlAndGetXML_9\n");
for(;;)
{
EXEC SQL FETCH C USING DESCRIPTOR select_dp;
MyAddString(&opBuf, "<RecordSetXML>\r\n");
for( i=0;i<select_dp->F;i++)
{
printf("RunSqlAndGetXML_10\n");
if( *select_dp->I[i] < 0)
str.Format("%.*s",(int)select_dp->L[i],select_dp->V[i]);
else
{
str.Format("%.*s",(int)select_dp->L[i],select_dp->V[i]);
}
str.TrimLeft();
str.TrimRight();
MyAddString(&opBuf, "<");
MyAddString(&opBuf, fieldsarray.GetAt(i));
MyAddString(&opBuf, ">");
MyAddString(&opBuf, str);
MyAddString(&opBuf, "</");
MyAddString(&opBuf, fieldsarray.GetAt(i));
MyAddString(&opBuf, ">\r\n");
}
recCnt++;
MyAddString(&opBuf, "</RecordSetXML>\r\n");
}
end_select_loop:
printf("RunSqlAndGetXML_11\n");
DWORD dwEnd = GetTickCount() - dwStart;
CString strTime;
strTime.Format("%s execute %d",sqlStr, dwEnd);
WriteLogFile(strTime);
for( i=0;i<MAX_ITEMS;i++ )
{
if( bind_dp->V[i] != (char *)NULL )
free(bind_dp->V[i]);
free(bind_dp->I[i]);
if( select_dp->V[i] != (char *)NULL )
free(select_dp->V[i]);
free(select_dp->I[i]);
}
sqlclu(bind_dp);
sqlclu(select_dp);
EXEC SQL WHENEVER SQLERROR CONTINUE;
return recCnt;
}执行后发现在EXEC SQL PREPARE S FROM :sqlexec;是出错,错误代码是-3114,提示数据库未连接上,不知何解?