성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • WINAPI
  • Boot Code 분석
  • 문자열 나누기
  • ARM Reverse Engineering
  • MFC

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

PostgeSQL

[MFC] 라이브러리 libpq를 이용한 C프로그래밍 (DB연동)

2014. 4. 17. 19:06

1. libpq 라이브러리 사용하기

   - 애플리케이션에서 libpq를 사용하기 위해서는 libpq에서 제공하는 함수를 정의하기 위해 적절한 헤더파일을 포함해야 하고

      이러한 함수들에 대한 코드를 가지고 있는 적절한 라이브러리를 연결해 주어야 한다.

 

- Linux 기준

   - 헤더: 기본값으로 /usr/local/pgsql/include/ 디렉토리의 libpq-fe.h 파일이다.

   - 라이브러리 : 기본값으로 /usr/local/pgsql/lib/ 디렉토리에 있다.


-Window 기준

   - 헤더 : 기본값으로 C:\Program Files\PostgreSQL\9.2\include 디렉토리의 libpq-fe.h 파일

   - 라이브러리 : 기본값으로 C:\Program Files\PostgreSQL\9.2\lib 디렉토리의 libpq.dll

 

- Linux 기준

  - libpq 라이브러리를 사용하여 컴파일 하는 예

     gcc -o test test.c -I /usr/local/pgsql/include -L /usr/local/pgsql/lib -lpq


2. 데이터베이스에 연결하기

   - PGconn *PQconnectdb( const char *conninfo );

     위 함수를 이용하여 데이터베이스에 연결할 수 있다. 위 함수는 데이터베이스에 연결이 되면 데이터베이스 연결에 대한 핸들을

     돌려준다. fopen 함수를 이용하여 파일을 열 때 파일핸들을 리턴해 주는것과 거의 동일하다. 돌려받은 연결 핸들은 앞으로 데이

     터베이스에 여러 작업을 하는데 사용된다.

 

   - PQconnectdb함수는 연결할 데이터베이스를 지정하는 문자열을 인자로 넘겨받는다. 다음은 연결에 사용할 수 있는 일반적인

     옵션을 정리한 것이다.

    

옵션

의미

기본값

Dbname

연결할 데이터베이스 이름

$PGDATABASE

User

연결시 사용할 사용자명

$PGUSER

Password

사용자의 비밀번호

$PGPASSWORD 또는 제공되지 않음

Host

연결할 서버명

$PGHOST 또는 로컬컴퓨터

Hostaddr

연결할 서버의 IP주소

$PGHOSTADDR

port

서버에 연결할 TCP/IP 포트

$PGPORT 또는 5432

 

   - host 옵션은 연결할 서버의 도메인 네임을 사용하고, hostaddr 옵션은 연결할 서버의 ip를 이용하여 접속할 때 사용한다.

 

   - host나 hostaddr 옵션이 지정되지 않았다면 로컬컴퓨터로 접속한다.

 

   - 옵션값에 공백이 포함되어 있거나 빈 문자열 값을 입력하려면 다음과 같이 작은 따옴표로 그 값을 표시해 준다.

      "password = '' user = blue39" ( password를 공백처리 )

  

   - PQconnectdb 함수는 인자로 전달받은 옵션 값을 체크하여 옵션이 지정되지 않았다면 각 옵션에 대응하는 환경변수가 설정

     되어 있는지 체크하여 설정되어 있다면 환경변수의 값을 인자로 취한다. 따라서 PQconnectdb 함수를 빈 문자열로 호출한다면

     모든 옵션은 환경변수를 통해 제공받는다.

 

     ex)PGconn *pConn = PQconnecdb( "host = chan password = 123456 user = blue39 dbname = test" ); - 연결에 사용할

         옵션을 인자로 넘긴다.

     ex)PGconn *pConn = PQconnectdb( "" ); - 환경변수를 인자로 사용한다.


     ex)PGconn *pConn = NULL;

// Make a connection to the database

pConn = PQconnectdb("user=postgres password=yeob dbname=exportmanager hostaddr=127.0.0.1 port=5432); // 로컬연결

  

   - PQconnectdb 함수가 NULL이 아닌 연결 핸들을 리턴했다고 해서 정상적으로 연결이 되었다는 의미는 아니다. 연결이 정상적으

     로 이루어졌는지 체크하기 위해 다음의 함수를 사용한다.

 

   - ConnStatusType PQstatus( const PGconn *conn );

      ConnStatusType은 다음 상수를 포함하는 열거형 변수이다.

      CONNECTION_OK

      CONNECTION_BAD

   

   - 데이터베이스에 연결하고 필요한 작업을 모두 마쳤다면 파일에서와 마찬가지로 데이터베이스 연결 핸들을 종료해 주어야 한다.

     이를 위하여 void PQfinish( PGconn *conn); 함수에 데이터베이스 연결 핸들을 넘겨준다. 

 

3. libpq를 이용하여 SQL실행하기

   - PGresult * PQexec( PGconn *conn, const char *sql_string );

     SQL문을 PQconnectdb()함수를 이용하여 연결한 데이터베이스에서 실행시킨다. 해당 쿼리의 실행 결과값은 결과를 저장하는

     PQresult 구조체를 통해 주고 받는다.


  ex) PGresult *res = PQexec(conn, "CREATE TABLE employee (Fname char(30), Lname char(30))"); 


   - ExecStatusType PQresultStatus( const PGresult * result );

     SQL문의 실행 상태를 알아보기 위해 위 함수를 사용한다. 이 함수는 다음 표와 같은 값을 가지는 상태를 돌려준다.

    

상태 유형

설명

PGRES_EMPTY_QUERY

테이터베이스를 이용할 필요가 없다. 일반적으로 빈 문자열의 결과이다.

PGRES_COMMAND_OK

성공. 명령이 데이터를 돌려주지 않는다.

PGRES_TUPLES_OK

성공. 질의가 0개 이상의 행들을 돌려준다.

PGRES_BAD_RESPONSE

실패. 서버응답을 이해할 수 없다.

PGRES_NONFATAL_ERROR

실패. 치명적이지는 않다. 재시도가 가능하다.

PGRES_FATAL_ERROR

실패. 치명적 오류가 발생하여 재시도가 불가능하다.

 

   - const char *PQresultErrorMessage( const PGresult * result );

     쿼리 실행 후 오류가 발생하면 PQresultErrorMessage를 호출하여 읽을 수 있는 상세한 오류 메시지를 얻을 수 있다.

    

   - void PQclear( PGresult * result );

     연결구조체와 마찬가지로 결과객체를 사용했으면 반드시 자원을 해제해 주어야 한다. 이 과정은 위 함수 PQclear를 통해 이루어

     진다. 결과 객체와 연결 객체는 별도로 취급되어서 연결이 해제된다고 결과객체도 같이 해제되는것은 아니니 주의해야한다.

 

4. 트랜잭션

   - 표준 SQL에서와 마찬가지로 libpq에서도 트랜잭션 처리를 지원한다. 간단하게 PQexec함수의 쿼리문에 BEGIN, COMMIT, 

      ROLLBACK을 포함하는 SQL문을 넘겨 실행하면 된다.


   ex) PGresult *res  = PQexec(conn, "BEGIN");


5. SQL문으로부터 결과 값 가져오기

   - int PQntuples( const PGresult * result );

     PQexec함수로 오류없이 SQL문을 실행하였으면 PGRES_TUPLES_OK 상태코드를 리턴받는다. 그리고나서 현재 결과 집합에

    몇 개의 행이 존재하는지 알아내기 위하여 PQntuples를 호출한다.

 

   - 위 함수의 리턴 값은 결과 행의 전체 행 수 이므로 결과가 0이 될 수도 있다.

 

   - int PQnfields( const PGresult * result );

     특정 튜플(행)의 필드(속성 또는 열)의 개수는 PQnfields를 호출하여 알 수 있다.

 

   - char *PQfname( const Pgresult * result, int index );

     결과 필드들은 0부터 시작되는 순서를 가지며, 필드명은 PQfname을 호출하여 알 수 있다.

 

   - int PQsize( const PGresult * result, int index );

     필드의 크기는 PQsize를 호출하여 알 수 있다. 고정된 크기의 필드에 대해서는 특정열의 크기를 바이트 단위로 돌려주고 가변

     길이 필드라면 -1을 돌려준다.

 

   - char *PQgetvalue( const PGresult * result, int tuple, int field );

     일반적으로 모든 데이터는 서버로부터 문자열 형식으로 전달된다. Pqgetvalue함수를 호출하면 데이터를 문자열 형식으로 얻을

     수 있다.  튜플(행)과 필드(열)의 번호는 0부터 시작한다.


  ex) 

     for (int i = 0; i < PQntuples(res); i++)

    {

cStoringStatusArr[i][j] = PQgetvalue(res, i,j);

cStoringStatusArr[i][j+1] = PQgetvalue(res, i,j+1);

cStoringStatusArr[i][j+2] = PQgetvalue(res, i,j+2);

cStoringStatusArr[i][j+3] = PQgetvalue(res, i,j+3);

cStoringStatusArr[i][j+4] = PQgetvalue(res, i,j+4);

    }

 

   - int PQgetlength( PGresult * result, int tuple, int fueld );

     결과 문자열의 길이를 알고 싶다면 PQgetlength를 호출한다.

[출처] postgreSQL 8.2에서 libpq를 이용한 C프로그래밍 |작성자 꼼탕구리


저작자표시 (새창열림)

'PostgeSQL' 카테고리의 다른 글

[PostgreSQL] Create/Drop/Restore 시 batch-file 만들기(환경변수설정포함)  (0) 2014.05.16
[PostgreSQL] CTID 단편화하기(?)  (0) 2014.05.13
[PostgreSQL] 제약조건, Constraint(NOT NULL, UNIQUE, PRIMARY KEY(기본키), FOREIGN KEY(외래키))  (0) 2014.03.28
[PostgreSQL] 시작날짜 끝날짜 사이 중간값들 구하기  (0) 2014.03.28
[PostgreSQL] interval 활용  (0) 2014.03.28
    'PostgeSQL' 카테고리의 다른 글
    • [PostgreSQL] Create/Drop/Restore 시 batch-file 만들기(환경변수설정포함)
    • [PostgreSQL] CTID 단편화하기(?)
    • [PostgreSQL] 제약조건, Constraint(NOT NULL, UNIQUE, PRIMARY KEY(기본키), FOREIGN KEY(외래키))
    • [PostgreSQL] 시작날짜 끝날짜 사이 중간값들 구하기
    성엽이
    성엽이

    티스토리툴바