Postgresql 9.3.25 문서 | ||||
---|---|---|---|---|
메이저 토토 사이트 : 문서 : 9.3 : 큰 개체 | 젠 토토 : 문서 : 9.3 : ECPG- C에 포함 된 SQL | 33 장ECPG- 내장SQLin c | 다음 |
ECPG는 C ++ 애플리케이션에 대한 제한된 지원이 있습니다. 이 섹션 일부 경고를 설명합니다.
theECPG사전 처리기가 입력을합니다 C (또는 C와 같은) 및 내장 된 SQL 명령으로 작성된 파일, 임베디드 SQL 명령을 C 언어 청크로 변환하고 마침내 A 생성.C파일. 헤더 C 언어가 사용하는 라이브러리 기능의 파일 선언 그 청크ECPG생성 |extern "c"...아래에서 사용될 때 블록 C ++이므로 C ++에서 원활하게 작동해야합니다.
일반적으로ECPG사전 처리기는 C 만 이해합니다. 스페셜을 처리하지 않습니다 C ++ 언어의 구문 및 예약 단어. 그래서 일부 내장 복잡한 C ++ 사설 토토 프로그램 코드로 작성된 SQL 코드 C ++에 특정한 기능이 올바르게 전처리되지 않거나 예상대로 작동하지 않을 수 있습니다.
C ++ 사설 토토 프로그램에서 내장 된 SQL 코드를 사용하는 안전한 방법은 다음과 같습니다. C ++ 애플리케이션 코드 인 C 모듈에 ECPG 호출을 숨기고 데이터베이스에 액세스하기 위해 전화를 걸고이를 연결합니다. 나머지 C ++ 코드. 보다섹션 33.13.2그것에 대해.
theECPG사전 처리기는 다음을 이해합니다 C의 변수 범위는 C 언어에서는 다소 간단합니다. 변수의 범위는 코드 블록을 기반으로하기 때문입니다. ~ 안에 그러나 C ++, 클래스 멤버 변수는 선언 된 위치와 다른 코드 블록이므로ECPG사전 처리기는의 범위를 이해하지 못합니다 클래스 멤버 변수.
예를 들어 다음 경우ECPG사전 처리기는 어떤 선언도 찾을 수 없습니다 변수dbnamein테스트메소드, 오류가 발생합니다.
클래스 testcpp Exec SQL 시작 선언 섹션; char dbname [1024]; Exec SQL END DELLARE SECTION; 공공의: testcpp (); void test (); ~ testcpp (); ; testcpp :: testcpp () EXEC SQL TESTDB1에 연결; Exec SQL 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec SQL 커밋; void test :: test () exec SQL select current_database ()에 : dbname; printf ( "current_database = %s \ n", dbname); testcpp :: ~ testcpp () Exec SQL 모든 분리;
이 코드는 다음과 같은 오류가 발생합니다.
ecpg test_cpp.pgctest_cpp.pgc : 28 : 오류 : 변수 "dbname"이 선언되지 않았습니다
이 범위 문제를 피하려면테스트로컬 변수를 중간체로 사용하도록 방법을 수정할 수 있습니다. 저장. 그러나이 접근법은 해결 방법이 좋지 않습니다. 왜냐하면 코드를 확장하고 성능을 줄입니다.
void testcpp :: test () Exec SQL 시작 선언 섹션; Char TMP [1024]; Exec SQL END DELLARE SECTION; exec SQL select current_database ()에 : tmp; strlcpy (dbname, tmp, sizeof (tmp)); printf ( "current_database = %s \ n", dbname);
이러한 기술적 한계를 이해하면ECPGC ++의 사전 처리기, 당신은 링크 단계에서 C 객체 및 C ++ 객체를 연결하는 결론 C ++ 사설 토토 프로그램이 ECPG 기능을 사용할 수 있도록하는 것이 더 좋습니다. C ++ 코드로 일부 임베디드 SQL 명령을 직접 작성하는 것보다 직접. 이것 섹션은 일부 임베디드 SQL 명령을 간단한 예제가있는 C ++ 사설 토토 프로그램 코드. 이 예에서 사설 토토 프로그램은 C ++에서 구현되며 C 및 ECPG는 Postgresql Server에 연결하십시오.
세 가지 종류의 파일을 생성해야합니다 : C 파일 (*.pgc), 헤더 파일 및 C ++ 파일 :
C에 내장 된 SQL 명령을 실행하기위한 서브 라우틴 모듈test_mod.c사전 처리기의
#include "test_mod.h" #include <stdio.h 무효의 db_connect () EXEC SQL TESTDB1에 연결; Exec SQL 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec SQL 커밋; 무효의 db_test () Exec SQL 시작 선언 섹션; char dbname [1024]; Exec SQL END DELLARE SECTION; exec SQL select current_database ()에 : dbname; printf ( "current_database = %s \ n", dbname); 무효의 db_disconnect () Exec SQL 모든 분리;
C 모듈의 함수 선언이있는 헤더 파일 (test_mod.pgc). 에 포함되어 있습니다.test_cpp.cpp. 이 파일에는가 있어야합니다.extern "c"선언 주위의 블록, C ++ 모듈에서 링크되기 때문에.
#ifdef __cplusplus extern "c" #endif void db_connect (); void db_test (); void db_disconnect (); #ifdef __cplusplus
를 포함한 사설 토토 프로그램의 기본 코드Main
루틴, 그리고이 예에서는 c ++입니다
수업.
#include "test_mod.h" 클래스 testcpp 공공의: testcpp (); void test (); ~ testcpp (); ; testcpp :: testcpp () db_connect (); 무효의 testcpp :: test () db_test (); testcpp :: ~ testcpp () db_disconnect (); int 메인 (void) testcpp *t = new testcpp (); t- test (); 반환 0;
사설 토토 프로그램을 작성하려면 다음과 같이 진행하십시오. 전환하다test_mod.pgcintest_mod.c실행ECPG및 생성test_mod.o컴파일test_mod.cC 컴파일러와 함께 :
ecpg -o test_mod.c test_mod.pgc cc -c test_mod.c -o test_mod.o
다음, 생성test_cpp.o컴파일test_cpp.cppC ++ 컴파일러와 함께 :
C ++ -C Test_cpp.cpp -o test_cpp.o
마지막 으로이 객체 파일을 연결하십시오.test_cpp.oandtest_mod.o, C ++를 사용하여 하나의 실행 파일로 컴파일러 드라이버 :
c ++ test_cpp.o test_mod.o -lecpg -o test_cpp