我使用por*c编程对ORACLE数据库进行查询操作,明明数据库中有,但就是SELECT查询不到,也没有其他报错。请教各位大神,到底是什么原因?平台是WINDOWS下VS2013。代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<direct.h>
#include<sqlca.h>
#include<sqlda.h>
#define PATHPAR "..\\..\\parameter.txt"
#define LENLINE 1000
#define NUMID 1000
#define DEBUG/*** 说明段 ***/
EXEC SQL BEGIN DECLARE SECTION;
/*登录变量*/
VARCHAR userid[40]; 
VARCHAR password[40];
VARCHAR db_name[40];
EXEC SQL END DECLARE SECTION;/*** SQL通讯区 ***/
EXEC SQL INCLUDE sqlca;/*** 程序体 ***/
main()
{
void query_all();
/*** 打开并读取参数文件parameter.txt ***/
FILE *fppar;
errno_t errpar;
errpar = fopen_s(&fppar, PATHPAR, "r");
/* 读取parameter.txt里的IP地址,用户名和密码 */
char strline[LENLINE], struse[LENLINE];
int lenstr=0,numline=0;
int i, j;
while (fgets(strline, LENLINE, fppar) != NULL)
{
if (feof(fppar)) break;
lenstr = strlen(strline);  /* get using part of the string */
if (strline[lenstr - 1] == '\n')   strline[lenstr - 1] = '\0';
for (i = 0, j = 0; i < lenstr; i++){if (strline[i] == ':') { j = i; break; }}
if (j != 0)
{
for (i = j + 1; i < lenstr; i++) struse[i - j - 1] = strline[i];
}
else{
printf("input file read error!\n");
exit(0);
}
numline++; /* 读入一行,行数加1 */
/* get information of line */
if (numline == 1)  /* get database */
{
strcpy_s(db_name.arr, LENDAB, struse);
db_name.len = strlen(db_name.arr);
printf("database:%s\n", db_name.arr);
}
else if (numline == 2)  /* get user id */
{
strcpy_s(userid.arr, LENDAB, struse);
userid.len = strlen(userid.arr);
printf("user:%s\n", userid.arr);
}
else if (numline == 3)  /* get password */
{
strcpy_s(password.arr, LENDAB, struse);
password.len = strlen(password.arr);
printf("password:%s\n", password.arr);
}
else {
printf("错误: parameter.txt文件读入出错!\n");
}

}
fclose(fppar); /*** 登录到ORACLE ***/
EXEC SQL WHENEVER SQLERROR GOTO logon_error;  
/* 登录到远程节点的一个非默认数据库 */
EXEC SQL CONNECT :userid IDENTIFIED BY :password USING :db_name;
/*用于登陆错误*/
if(sqlca.sqlcode == 0 ){
printf("连接到ORACLE数据库:%s,用户名:%s。\n",db_name.arr,userid.arr);
    else if(sqlca.sqlcode > 0 ){
    printf("连接到ORACLE数据库:%s,用户名:%s;但存在警告!\nsqlca.sqlcode:%ld, sqlca.sqlerrm.sqlerrmc:%s\n",db_name.arr,userid.arr, sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
    else
printf("sqlca.sqlcode:%ld,sqlca.sqlerrm.sqlerrmc:%s\n", sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);

/*** 查询信息 ***/
query_all();
/** 结束处理 **/
EXEC SQL COMMIT WORK RELEASE;
exit(0);
/* 错误处理 */
logon_error:
printf("\n用户名或密码错误!\n");
printf("\n%.70s\n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK RELEASE;
exit(1);
}
void query_all()
{/*** SQL说明段 ***/
EXEC SQL BEGIN DECLARE SECTION;
char datestart[LENLINE];
char dateend[LENLINE];
int staid[1000];
int pointid[1000];
int tiemid[1000];
int sample[1000];
EXEC SQL END DECLARE SECTION;
/*** SQL通讯区,局部 ***/
    EXEC SQL INCLUDE sqlca;
/*** 查询产品数据 ***/
int n = 0;
EXEC SQL WHENEVER SQLERROR GOTO query_error;
EXEC SQL WHENEVER NOT FOUND GOTO notfound;
#ifdef DEBUG
printf("开始查询\n");
#endif
EXEC SQL SELECT STATIONID
INTO :staid
FROM QZDATA.QZ_DICT_STATIONITEMS
WHERE STATIONID=32044/*ORDER BY 1*/;
n = sqlca.sqlerrd[2];
/*** 输出查询结果 ***/
int i = 0;
for (i = 0; i < n; i++) { printf("%d  \n", staid[i]); }
printf("查询结果输出完毕。\n");
return;
/*** 查询不到 ***/
notfound:
printf("警告:该条件下查询不到。\n");
return; /* ???? */
/*** 错误处理 ***/
query_error:
printf("\n查询出错:%.70s\n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK;
exit(1);
}主函数应该没有问题,主要是query_all函数死活查询不到,什么表什么条件都查询不到,心塞,可是库里明明有啊!请各位大大指导指导
以上代码是在原代码基础上删减的,不然放不下,原代码没有语法问题,这个如果有就是我删的太多了……

解决方案 »

  1.   

    查询语句where条件和数据库的不一致导致查询不出数据
      

  2.   

    先改写成select 1 INTO :staid from dual 看看有没有数据,如果这都没那就肯定是你proc写的有问题了
      

  3.   

    CONNECT :userid IDENTIFIED BY :password USING :db_name;
    用这里面的userid和pwd登陆db_name,然后执行
    SQL SELECT STATIONID
    FROM QZDATA.QZ_DICT_STATIONITEMS
    WHERE STATIONID=32044
    确认是否有数据
      

  4.   

    我登陆成功了,登陆没有报错。
    我不设定任何条件
    EXEC SQL SELECT STATIONID
    INTO :staid
    FROM QZDATA.QZ_DICT_STATIONITEMS;
    也还是查询不到,
    使用SSH连数据库,用同样的语句(不加EXEC SQL)是可以的
    但我也不知道我写的哪儿有问题
      

  5.   

    说错了,是用toad连数据库,查询是可以查到的
      

  6.   

    用toad连接,执行的是SQL SELECT STATIONID 
    FROM QZDATA.QZ_DICT_STATIONITEMS;是这句话吗
      

  7.   

    是的,把SELECT这句复制粘贴过去,可以查询到