por*c编程连接oracle数据库成功,但为什么SELECT总是查询不到?急!谢谢!

qiongxi 2016-12-16 04:04:22
我使用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函数死活查询不到,什么表什么条件都查询不到,心塞,可是库里明明有啊!请各位大大指导指导
以上代码是在原代码基础上删减的,不然放不下,原代码没有语法问题,这个如果有就是我删的太多了……
...全文
1103 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
慕容忧洋 2018-01-09
  • 打赏
  • 举报
回复
是11g吗?我也遇到了这个问题。怎么解决?生产连续报错,重发又没问题,明明有数据,但是报错1403。
qiongxi 2016-12-21
  • 打赏
  • 举报
回复
是的,把SELECT这句复制粘贴过去,可以查询到
qiongxi 2016-12-20
  • 打赏
  • 举报
回复
说错了,是用toad连数据库,查询是可以查到的
jdsnhan 2016-12-20
  • 打赏
  • 举报
回复
用toad连接,执行的是 SQL SELECT STATIONID FROM QZDATA.QZ_DICT_STATIONITEMS; 是这句话吗
jdsnhan 2016-12-19
  • 打赏
  • 举报
回复
CONNECT :userid IDENTIFIED BY :password USING :db_name;
用这里面的userid和pwd登陆db_name,然后执行
SQL SELECT STATIONID
FROM QZDATA.QZ_DICT_STATIONITEMS
WHERE STATIONID=32044
确认是否有数据
sxq129601 2016-12-19
  • 打赏
  • 举报
回复
先改写成select 1 INTO :staid from dual 看看有没有数据,如果这都没那就肯定是你proc写的有问题了
qiongxi 2016-12-19
  • 打赏
  • 举报
回复
我登陆成功了,登陆没有报错。 我不设定任何条件 EXEC SQL SELECT STATIONID INTO :staid FROM QZDATA.QZ_DICT_STATIONITEMS; 也还是查询不到, 使用SSH连数据库,用同样的语句(不加EXEC SQL)是可以的 但我也不知道我写的哪儿有问题
H_Gragon 2016-12-16
  • 打赏
  • 举报
回复
查询语句where条件和数据库的不一致导致查询不出数据

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧