다음은 에러를 수정한 소스로서 최소한 내게서는 에러없이 잘 돌아간다. 참고로 하기 바란다.
아울러 너가 보내 준 것과는 몇가지 차이가 있는 점을 설명하마.
1. 나는 libpq/fe.h 파일의 위치가 너와는 다르다. 적당히 고치도록 해라.
2. 너가 보낸 database 에서 table 선언시 준 constraint 문을 모두 없애고 테스트 했다. 혹시 이 소스대로 했는데도 안되거든 그 constraint 를 없애고 다시 테이블 만들어서 테스트 해봐라. 혹시 constraint 구문 때문에 쓸데없는 에러가 있을까 싶어 귀찮음을 피하기 위해서 잠시 그렇게 했다.
참. 소스 중간중간에 들어가 있는 소용없는 prinf 문은 너가 제거하도록 해라.
제대로 에러없이 돌아간다는 것을 확인시켜 주기 위해서 넣어 둔 문장이다.
다음은 수정한 소스문이다.
=====================================================
#include "stdio.h"
#include "/usr/local/pgsql/include/libpq/fe.h"
#include "string.h"
int main()
{
char *pghost, *pgport, *pgoptions, *pgtty, *dbName;
PGconn *Connection;
PGresult *result;
int number_of_lotto;
int nTuples;
char sqlstr[200];
int i;
int level;
int lotto_number;
int t_lotto_number;
int l_point;
char temp[10];
char data1[20],data2[20],data3[20];
char *LOTTO_NAME="즉석복권";
pgoptions=NULL;
pgtty=NULL;
dbName="lotto";
pghost="localhost";
pgport="5432";
Connection=PQsetdb(pghost,pgport,pgoptions,pgtty,dbName);
if(PQstatus(Connection)==CONNECTION_BAD)
{
fprintf(stdout,"connection_to_database_%s_failed\n\n",dbName);
PQfinish(Connection);
exit(1);
}
// strcpy(sqlstr,"declare dcursor cursor for select * from lotto where name='");
// strcat(sqlstr,LOTTO_NAME);
// strcat(sqlstr,"' ");
sprintf(sqlstr,"declare dcursor cursor for select * from %s "
"where name='%s'", dbName, LOTTO_NAME);
result=PQexec(Connection,"BEGIN");
PQclear(result);
result=PQexec(Connection,sqlstr);
PQclear(result);
result=PQexec(Connection,"FETCH forward 10 in dcursor");
strcpy(temp,PQgetvalue(result,0,1));
number_of_lotto=atoi(temp);
result=PQexec(Connection,"END;");
PQclear(result);
printf( "No of lotto : %d\n\n",number_of_lotto );
// strcpy(sqlstr,"update lotto set number_of_lotto_usable=");
// strcat(sqlstr,temp);
// strcat(sqlstr," where name='");
// strcat(sqlstr,LOTTO_NAME);
// strcat(sqlstr,"' ;");
sprintf(sqlstr,"update %s set number_of_lotto_usable=%d "
"where name='%s'", dbName, temp, LOTTO_NAME);
result=PQexec(Connection,sqlstr);
if(PQresultStatus(result)!=PGRES_COMMAND_OK)
{
fprintf(stdout,"command failed \n\n");
fprintf(stdout,"%s",PQerrorMessage(Connection));
PQclear(result);
exit(1);
}
printf ("1. 에러점검 \n\n");
// strcpy(sqlstr,"delete from level where lotto_name='");
// strcat(sqlstr,LOTTO_NAME);
// strcat(sqlstr,"'; ");
sprintf(sqlstr,"delete from level where lotto_name='%s'",LOTTO_NAME);
result=PQexec(Connection,sqlstr);
if(PQresultStatus(result)!=PGRES_COMMAND_OK)
{
fprintf(stdout,"command failed \n\n");
fprintf(stdout,"delete error : %s",PQerrorMessage(Connection));
PQclear(result);
exit(1);
}
PQclear(result);
printf ("2. 에러점검 \n\n");
// 이 아래 부분에서 에러가 납니다.....단순한 select문인데요...... 이유를 알수 없네요.....
// strcpy(sqlstr,"declare ecursor cursor for select * from leveldata where lotto_name='");
// strcat(sqlstr,LOTTO_NAME);
// strcat(sqlstr,"' ");
sprintf(sqlstr,"declare ecursor cursor for select * from leveldata "
"where lotto_name='%s'", LOTTO_NAME);
printf ("sqlstr: %s\n\n",sqlstr );
result=PQexec(Connection,"BEGIN");
PQclear(result);
result=PQexec(Connection,sqlstr);
PQclear(result);
result=PQexec(Connection,"FETCH forward 50 in ecursor");
printf ("PQresultStatus: %d\n\n",PQresultStatus(result));
printf ("PQerrorMessage: %s\n\n",PQerrorMessage(Connection));
printf ("COMMAND_OK: %d TUPLES_OK: %d\n\n",PGRES_COMMAND_OK,PGRES_TUPLES_OK);
// if(PQresultStatus(result)!=PGRES_COMMAND_OK) 이렇게 비교하면 안됩니다.
// 이유는 PGRES_COMMAND_OK 는 명령어가 실행되고 돌아오는 결과값이 없을때
// 나는 결과값이고, 만약 돌아오는 결과값이 있을 경우에는
// PGRES_TUPLES_OK 로 돌아 오기 때문이지요.
// 그러므로 이 문장은 차라리 if (fatal_error) {...} 이런식으로 바뀌어야
// 하지 않을까 싶네요.
// 위의 경우 보면 알겠지만 돌아 온값은 PGRES_TUPLES_OK 값이 돌아 왔으므로
// 명령어는 제대로 실행되고 그 결과 돌아 오는 tuple 들이 있다는 것으로
// 해석해 줘야 합니다.
if (PQresultStatus(result) == PGRES_FATAL_ERROR)
{
fprintf(stdout,"Fatal Error occurred\n\n"); //출력되는 에러 메시지임다~~
fprintf(stdout,"fetch error : %s\n\n",PQerrorMessage(Connection));
PQclear(result);
exit(1);
}
nTuples=PQntuples(result);
printf("nTuples : %d\n\n",nTuples);
for(i=0;i<number_of_lotto&&i<nTuples;i++)
{
strcpy(data1,PQgetvalue(result,i,1));
strcpy(data2,PQgetvalue(result,i,2));
strcpy(data3,PQgetvalue(result,i,3));
// strcpy(sqlstr,"insert into level values ('");
// strcat(sqlstr,LOTTO_NAME);
// strcat(sqlstr,"',");
// strcat(sqlstr,data1);
// strcat(sqlstr,",");
// strcat(sqlstr,data2);
// strcat(sqlstr,",");
// strcat(sqlstr,data2);
// strcat(sqlstr,",");
// strcat(sqlstr,data3);
// strcat(sqlstr,");");
sprintf(sqlstr,"insert into level values ('%s',%s,%s,%s,%s)",
LOTTO_NAME,data1,data2,data2,data3);
printf("%d. sqlstr : %s\n\n",i,sqlstr);
PQexec(Connection,sqlstr);
if(PQresultStatus(result) == PGRES_FATAL_ERROR)
{
fprintf(stdout,"Command Failed / insert error : %s\n\n",
PQerrorMessage(Connection));
PQclear(result);
exit(1);
}
}
result=PQexec(Connection,"END;");
if(PQresultStatus(result)!=PGRES_COMMAND_OK)
{
fprintf(stdout,"command failed \n\n");
fprintf(stdout,"end error : %s",PQerrorMessage(Connection));
PQclear(result);
exit(1);
}
PQclear(result);
PQfinish(Connection);
return 0;
}
=========================================
이상으로 소스 수정 끝이다.
|