我使用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函数死活查询不到,什么表什么条件都查询不到,心塞,可是库里明明有啊!请各位大大指导指导
以上代码是在原代码基础上删减的,不然放不下,原代码没有语法问题,这个如果有就是我删的太多了……
#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函数死活查询不到,什么表什么条件都查询不到,心塞,可是库里明明有啊!请各位大大指导指导
以上代码是在原代码基础上删减的,不然放不下,原代码没有语法问题,这个如果有就是我删的太多了……
用这里面的userid和pwd登陆db_name,然后执行
SQL SELECT STATIONID
FROM QZDATA.QZ_DICT_STATIONITEMS
WHERE STATIONID=32044
确认是否有数据
我不设定任何条件
EXEC SQL SELECT STATIONID
INTO :staid
FROM QZDATA.QZ_DICT_STATIONITEMS;
也还是查询不到,
使用SSH连数据库,用同样的语句(不加EXEC SQL)是可以的
但我也不知道我写的哪儿有问题
FROM QZDATA.QZ_DICT_STATIONITEMS;是这句话吗