我使用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函式死活查詢不到,什么表什么條件都查詢不到,心塞,可是庫里明明有啊!請各位大大指導指導
以上代碼是在原代碼基礎上刪減的,不然放不下,原代碼沒有語法問題,這個如果有就是我刪的太多了……
uj5u.com熱心網友回復:
查詢陳述句where條件和資料庫的不一致導致查詢不出資料uj5u.com熱心網友回復:
先改寫成select 1 INTO :staid from dual 看看有沒有資料,如果這都沒那就肯定是你proc寫的有問題了uj5u.com熱心網友回復:
CONNECT :userid IDENTIFIED BY :password USING :db_name;
用這里面的userid和pwd登陸db_name,然后執行
SQL SELECT STATIONID
FROM QZDATA.QZ_DICT_STATIONITEMS
WHERE STATIONID=32044
確認是否有資料
uj5u.com熱心網友回復:
我登陸成功了,登陸沒有報錯。我不設定任何條件
EXEC SQL SELECT STATIONID
INTO :staid
FROM QZDATA.QZ_DICT_STATIONITEMS;
也還是查詢不到,
使用SSH連資料庫,用同樣的陳述句(不加EXEC SQL)是可以的

但我也不知道我寫的哪兒有問題
uj5u.com熱心網友回復:
說錯了,是用toad連資料庫,查詢是可以查到的uj5u.com熱心網友回復:
用toad連接,執行的是SQL SELECT STATIONID
FROM QZDATA.QZ_DICT_STATIONITEMS;
是這句話嗎
uj5u.com熱心網友回復:
是的,把SELECT這句復制粘貼過去,可以查詢到uj5u.com熱心網友回復:
是11g嗎?我也遇到了這個問題。怎么解決?生產連續報錯,重發又沒問題,明明有資料,但是報錯1403。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/74935.html
標籤:開發
上一篇:Autovue 20.2.3
