Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

[따라하기] reFind 도구를 이용해 BDE 프로젝트를 FireDAC으로 마이그레이션 따라하기


Recommended Posts

이 문서의 목적: DocWiki에 있는 [DocWiki 번역] BDE 애플리케이션 마이그레이션 따라하기 (FireDAC) 문서가 실제로 따라하기에 다소 불편하게 되어 있어서, 내용과 틀을 유지하면서, 따라하기 쉽게 보강함

중요! 미리 알아둘 점:

  • Hub 페이지: BDE 애플리케이션을 FireDAC으로 이전하는 방법: 이 문서의 상위 문서로써 실습 뿐만 아니라 팁과 대응 요소 등이 잘 정리되어 있다. 
  • 이 문서와 비슷한 문서: [DocWiki 번역] BDE 애플리케이션 마이그레이션 따라하기 (FireDAC): 두 문서 모두 1~ 8단계와 동일하다. 
    • 이 실습의 "1~8 단계"는 필요하면 비교해 보기 좋다.
    • 이 실습의 "9단계" (윈도우 11 스타일 적용하기)는 이 글에만 있다. (기능 뿐 아니라 화면까지 멋지면 마이그레이션 만족도가 더 높아진다)
  • 이 실습을 따라가는 도중에 에러 메시지를 만날 수 있다: 해당 부분에 설명되어 있지 않다면, 맨 뒤에 있는 "예상되는 오류와 처리"를 보고 해소하자. (그래도 해소되지 않으면, 답글을 남겨서 다른 개발자의 도움을 받기 바란다)

이 글의 기대 효과:

  • RAD 스튜디오 설치 시 함께 제공되는 reFind와 변환 규칙 파일(FireDAC_Migrate_BDE.txt)을 통한 자동 변환 방법 학습
  • 아래의 마이그레이션 방법을 직접 경험
    • 데이터 액세스 기술: BDE에서 FireDAC으로
    • 데이터베이스: 파라독스에서 인터베이스(InterBase)로
    • 사용자 화면(UI): 윈도우 95 에서 윈도우 11 화면 스타일로 
    • 델파이 버전: 구버전에서 최신 버전으로

목차


1단계. 실습에서 사용할 구버전 소스 파일을 복사하여 프로젝트 준비

RAD 스튜디오를 설치하면, 이 실습에서 사용할 BDE를 사용하는 소스 전체가 아래 경로에 있는 Demo 폴더에 있다.

 C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Object Pascal\Database\FireDAC\Tool\reFind\BDE2FDMigration

위 경로 중 \22.0\은 RAD 스튜디오 11.0 인 경우임. 이 숫자는 버전에 따라 달라짐.

Directory_reFind_BDE2FDMigration.png
그림. RAD 스튜디오에서 reFind 용으로 제공하는 Sample 파일의 기본 경로와 해당 파일

원본을 손상시키지 않고, 한 곳에 작업할 모든 내용을 모아두기 위해 다음과 같이 한다.

[진행 절차]

  1. 원하는 곳에 원하는 이름 (예: "My_FireDAC_2_BDE")으로 새 폴더를 만든다. 앞으로 모든 작업 파일은 이 새 폴더에 두기로 한다.
  2. 위에서 안내한 Sample 폴더 안에 있는 Demo 폴더 FireDAC_Migrate_BDE.txt 파일을 복사하여, 방금 새로 만든 "My_FireDAC_2_BDE" 폴더 안에 붙여넣는다.
  3. 복사해 넣은 폴더와 파일의 이름을 바꾼다.
    • Demo (폴더) --> My_FireDAC_MastApp (FireDAC을 사용하는 MastApp 프로젝트의 폴더이며 여기의 코드가 변경된다)
    • FireDAC_Migrate_BDE.txt (파일) --> My_FireDAC_Migrate_BDE.txt (이 파일도 조금 수정할 것이다) 

 

2단계. 코드 자동 변환: reFind를 사용하여BDE 컴포넌트를 FireDAC으로 변환

1단계에서 복사한 FireDAC_Migrate_BDE.txt 파일에는 BDE를 FireDAC으로 변환하는 규칙이 정의되어 있다. 아래와 같이 변환 규칙 파일과 reFind(코드의 텍스트 자동 변환 도구)를 사용하면, 코드에 있는 BDE 컴포넌트(와 해당 프로퍼티)가 모두 해당 FireDAC 컴포넌트(와 해당 프로퍼티)로 변경된다.

명령창에서 직접 입력하는 방식으로 reFind를 실행하면 되지만, 타이핑할 내용을 .bat 파일로 만들어서 명령을 실행하는 것이 더 편하고 간단하므로 이 방식으로 설명한다. 

[진행 절차]

  1. "My_FireDAC_2_BDE" 폴더 안에서 마우스 오른쪽 클릭 > 새로 만들기 > 텍스트 문서를 선택한다.
  2. "새 텍스트 문서.txt"가 만들어지면 파일 명을 "Run_FireDAC_Migrate_BDE.bat"로 변경한다. (주의! 파일 확장자도 .txt가 아니라 .bat가 되어야 한다
  3. 메모장을 열고, 방금 만든  "Run_FireDAC_Migrate_BDE.bat" 파일을 메모장으로 드래그 드롭하여 파일 내용을 연다 (아직은 아무 내용도 없다)
  4. 이 파일에 아래 내용을 넣고 저장한다. (내용을 이해하고 싶으면 reFind 설명을 참고)
    refind My_FireDAC_MastApp\*.pas My_FireDAC_MastApp\*.dfm /X:My_FireDAC_Migrate_BDE.txt
    pause
  5. 방금 만든 "Run_FireDAC_Migrate_BDE.bat" 파일을 더블 클릭하여 이 배치파일을 실행한다. 실행한 결과가 아래 그림과 같으면, 아무 키나 눌러서 명령창을 닫는다.
    Run_FireDAC_Migrate_BDE.png
    그림. Run_FireDAC_Migrate_BDE.bat 이 실행된 결과 화면

3단계. FireDAC에서 사용할 데이터베이스 연결 정의 생성

FireDAC에서 사용할 연결 정의를 생성해야 한다. 이 예제에서는 FDExplorer 유틸리티, 즉 'FireDAC Explorer'를 사용하기로 한다.

[진행 절차]

  1. RAD 스튜디오에서 메인 메뉴 > Tools > FireDAC Explorer를 클릭한다.
  2. FireDAC Explorer 창에서 메인 메뉴 > File > New > Connection Definition Ctrl+C를 클릭한다.
  3. FireDAC Explorer 창의 왼쪽에 있는 Object Explorer  트리뷰에 "ConnectionDef1"이라는 새 연결 정의가 생기고, 타이핑하면 바로 이름을 바꿀 수 있도록 이름이 선택된 상태일 텐데, "MASTSQL"이라고 타이핑하여 이 연결 정의의 이름을 지정한다.
  4. FireDAC Explorer 창의 오른쪽 그리드에서는 방금 만든  "MASTSQL" 연결 정의의 프로퍼티를 설정할 수 있다.   연결 정의 파라미터를  아래와 같이 지정한다.
    • DriverID=IB
    • Protocol=TCPIP
    • Server=127.0.0.1
    • DataBase=C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\MASTSQL.GDB *(아래 "주의 " 참조)
    • User_Name=sysdba
    • SQLDialect=3
    • CharacterSet=UTF8
    • ExtendedMetadata=True
  5. FireDAC Explorer 창에서 메인 메뉴 > Edit > Apply를 클릭하여 저장한다.
  6. RAD 스튜디오를 종료하고 다시 시작한다. (그래야 새로 만든 연결 정의가 반영된다)

FireDAC_Explorer.png
그림. FireDAC Explorer를 열고, 인터베이스 데이터 연결을 정의

*주의: 이 예제에서 사용된 소스는 데스트탑 데이터베이스인 파라독스(Paradox)를 사용하고 있었다. 위에 있는 "MASTSQL" 연결 정의의 파라미터  중 DataBase에 그 데이터 파일인 MASTSQL.GDB의 전체 경로를 지정하고 있는데, 이 파일은 해당 파라독스(Paradox)를 엠바카데로에서인터베이스로 이미 전환해 놓은 데이터 파일이다. RAD 스튜디오 11.0를 Sample 까지 모두 설치했다면 위의 전체 경로를 보면 MASTSQL.GDB 파일이 있을 것이다 (설치한 RAD 스튜디오 버전이 다르다면, 경로 중간의 /22.0/ 대신 다른 숫자로 되어 있을 것이다)  참고로,  파라독스의 데이터를 인터베이스로 옮길 때는 Clever Components InterBase DataPump를 사용할 수 있다. 

 

4단계. FireDAC의 필수 컴포넌트 추가: DBMS에 맞는 드라이버와 Wait 커서

Docwiki 원문의 4단계에서는 변환한 소스가 있는 폴더에서 프로젝트 파일인 "mastapp.dproj" 를 두 번 클릭하여 프로젝트 파일을 열고  uses 에 FireDAC.Phys.IB, FireDAC.VCLUI.Wait 를 추가하라고 되어 있다.

원문의 안내 대로 진행해도 좋지만, 이 4단계를 생략해도 된다.

RAD 스튜디오(델파이, C++빌더) 11.0 버전에서는 컴파일 할 때 프로젝트에서 사용하고 있는 데이터베이스 (이 예제에서는 인터베이스)를 감지하여 자동으로 uses에  FireDAC.Phys.IB 유닛과 FireDAC.VCLUI.Wait 유닛을 추가하고 해당 드라이버를 반영하기 때문이다. 게다가 이 유닛들은 프로젝트 소스가 아니어도, 메인 폼이나 데이터 모듈이어도 상관없다.

 

5단계. FireDAC.FDConnection에 연결 설정

Docwiki 원문의 5단계에서는 DataMod.dfm (데이터 모듈의 폼파일)을 열고, 폼 파일 코드에서  TFDConnection 컴포넌트를 찾아서 연결 정의를 타이핑하여 넣으라고 되어 있다. 

원문의 안내 대로 진행해도 좋지만, 아래 방법이 보다 쉽고 정확하다.

[진행 절차]

  1.  RAD 스튜디오 오른쪽의 프로젝트 관리자에서 DataMod.pas를 더블 클릭하여 연다. (오류 처리 방법 보기)
  2. 코드 에디터가 열리고, 해당 소스 코드가 보이면, 화면을 폼 디자이너로 바꾼다 (코드 에디터에서 폼 디자이너로 화면을 바꾸는 방법: 코드 에디터 화면의 맨 아래 오른쪽에 있는 탭에 Code가 선택되어 있을 것이다. 그 옆에 있는 Design 탭을 선택 또는 단축키 F12 사용).
  3. 폼 디자이너에는 DataMod의 컴포넌트들이 보일 텐데, 2단계를 통해서 이미 FireDAC 컴포넌트로 변환된 것을 알 수 있다.
  4. 폼 디자이너에 있는 컴포넌트 중에 "Database" 컴포넌트 (이름이 Database인 FDConnection 컴포넌트)를 한번 클릭하여 선택한다.
  5. RAD 스튜디오 왼쪽의 오브젝트 인스펙터에서 ConnectionDefName 프로퍼티를 찾아서, 그 값에 앞의 3단계에서 만든 "MASTSQL" 연결 정의를 선택하여 지정한다.
  6. 폼 디자이너에서 "Database" 컴포넌트를 더블 클릭하여 FireDAC Connection Editor 창을 연다.
  7.  FireDAC Connection Editor 창에서 Test 버튼을 클릭한다. 로그인 창이 나타나오 이미 3단계에서 지정해둔 연결 정보가 들어가 있을 것이다. OK를 클릭한다. ("Connection established successfully" 라는 메시지가 나오면 성공한 것이다.
    RADStudio_FireDAC_Connection_Editor_1Definition.png
  8. 만약 실패해서 에러 메시지가 표시된다면,
    • password등이 잘못되었다는 오류가 나오면, 앞의 3단계로 돌아가서 연결 정의를 다시 정확히 만들어야 한다.
    • 만약 연결이 거부 된다면, 인터베이스 서버가 동작하는 지를 확인해야 한다 (오류 처리 방법 보기)

 

6단계. 데이터베이스 타입 맵핑 변경

BDE와 FireDAC은 둘다 애플리케이션과 데이터베이스를 서로 연결해 주기 위해 그 사이에 위치하는 계층이다. 이 계층은 데이터베이스 테이블의 컬럼의 데이터 타입을 FireDAC BDE  또는 FireDAC 의 데이터베이스 클라이언트 드라이버에서 지정한 타입으로 가져오고 나서, 이것을 다시 애플리케이션에서 사용할 타입 전환한다. 이때 BDE와 FireDAC의 타입 맵핑이 조금 다르다.

위 도움말에 의하면 오라클 데이터베이스의 NUMBER 타입을 FireDAC의 오라클 클라이언트 드라이버에서는 dtFmtBCD으로 취급한다는 것을 알 수 있다. 

이와 달리 BDE에서는 오라클 데이터베이스의 NUMBER 타입을 dtInt32dtDouble로 취급한다. BDE에서는 DateTime 타입으로 취급하는 것을 FireDAC에서는 DateTimeStamp 타입으로 취급한다는 점도 다르다.

그런데, 이 예제의 기존 소스는 BDE를 사용했었기 때문에, 앞의 2단계에서 BDE 컴포넌트를 모두 FireDAC 컴포넌트로 변경하였다고 해도, 개발자가 작성한 코드는 BDE에서 다루는 데이터 타입에 맞춰져 있을 것이다. 예를 들어, 개발자가 영속 필드를 넣었다면, 이 필드들은 기존에 BDE에서 설정한 데이터 타입을 받도록 되어 있으므로, FireDAC과 BDE에서 서로 다르게 취급하는 데이터타입을 다룰 수 없다. 다행히 FireDAC에는 이런 문제를 유연하게 처리할 수 있도록 데이터 타입 맵핑 규칙을 개발자가 지정할 수 있도록 되어 있다.

우리는 이 단계에서, FireDAC의 유연한 데이터 맵핑을 이용하여, FireDAC의 인터베이스 클라이언트 드라이버에서 지정한 디펄트 데이터의 타입이 기존에 BDE에서 처리하던 타입으로 처리되도록 맵핑 규칙을 넣기로 한다. 

(참고! 이 맵핑 규칙을 넣지 않아도 된다. 하지만, 그 대신, 애플리케이션에서 기존의 BDE 데이터 타입을 다루게 되어 있는 것을 모두 찾아서 FireDAC 데이터 타입을 다루도록 바꿔야 한다. 예를 들면 모든 영속 필드를 찾아서 모두 지운 다음 다시 추가하여 FireDAC 타입을 다루는 필드가 되게 해야 한다. 따라서, 맵핑 규칙을 넣는 것이 훨씬 편하고 유연한 방법이다.)

이제 Docwiki 원문의 6단계에서 있는 절차를 진행할 텐데, 원문의 안내대로 코드 에디터를 열어서 변경해도 좋지만, 우리는 FireDAC Connection Editor를 사용하여 보다 쉽게 진행하겠다.

[진행 절차]

  1. 폼 디자이너에서 "Database" 컴포넌트를 더블 클릭하여 FireDAC Connection Editor 창을 연다.
  2. FireDAC Connection Editor 창에서 Options 탭을 클릭한다.
  3. Options 탭 내용에서 Format Options 아래 Data Mapping Rules 아래에 있는 Ignore inherited rules를 체크한다.
  4. 그리드에서 아래 설정을 한다.
    • SourceDataType = dtFmtBCD
    • TargetDataType = dtInt32
    • PrecMin = 0
    • PrecMax = 10
    • ScaleMin = 0
    • ScaleMax=0
  5. 그리드 바로 아래에 있는 Add Rule을 클릭하고, 그리드에서 아래 설정을 한다.
    • SourceDataType = dtFmtBCD
    • TargetDataType = dtDouble
  6. 다시 한번 그리드 바로 아래에 있는 Add Rule을 클릭하고, 그리드에서 아래 설정을 한다.
    • SourceDataType = dtDateTimeStamp
    • TargetDataType = dtDateTime
  7. FireDAC Connection Editor 창이 아래 그림과 같이 잘 되었다면 OK를 클릭하여 저장한다.
    RADStudio_FireDAC_Connection_Editor_2Options.png
    그림, FireDAC의 데이터 타입 맵핑 설정
  8. 마지막으로, 폼 디자이너에서 "Database" 컴포넌트가 선택된 상태에서, RAD 스튜디오 왼쪽의 오브젝트 인스펙터에서 FormatOptions 프로퍼티를 확장하고 , 하위 프로퍼티인 StrTrim를 False로 지정한다.  (이 프로퍼티의 값을 BDE의 기본값에 맞추기 위함)
     

7단계. 불필요한 코드 제거: 파라독스 관련 코드

FireDAC은 파라독스 또는 DBase 같은데스크탑 DB를 지원하지 않는다. 따라서 파라독스 데스크탑 DB 관련된 모든 코드를 애플리케이션에서 제거해야 한다. 이 애플리케이션에서 Local Data를 처리하는 코드를 모두 지우자 (또는 주석 처리 하자).

(참고: 원하는 코드 블록을 선택하고 Ctrl+/ 단축키를 누르면 선택된 블록의 모든 줄이 주석처리 된다. 이미 주석인 상태였다면 다시 주석이 풀린다)

[진행 절차]

  1. 프로젝트 관리자에서 DataMod.pas를 더블 클릭하고, 코드 에디터를 열어서 TMastData.UseLocalData 메서드 삭제
    • Interface 부분에서 선언 삭제
    • Implementation 부분에서 구현 삭제
  2. 프로젝트 관리자에서 Main.pas를 더블 클릭하고, 코드 에디터를 열어서 TMainForm.ViewLocalClick 핸들러 메서드 삭제
    • Interface 부분에서 선언 삭제
    • Implementation 부분에서 구현 삭제
  3. 단축키 F12를 눌러서, Main.pas를 연 코드 에디터폼 디자이너로 전환한 후 스트럭처 뷰에서 아래 그림과 같이 Mainform - MainMenu - View - Local Data를 선택한 후, 오른쪽 클릭 > Edit > Delete (또는 키보드 Delete 키)를 이용하여 메뉴에서 Local Data를 아예 제거한다. (주의! 경고도 없이 제거되고, 되돌리기 어려우므로, 스크럭처 뷰에서 삭제하려는 오브젝트가 정확히 선택되어 있는 지를 먼저 확인해야 한다)
    RADStudio_LocalData.png

8단계. 인터베이스에 맞게 관련 코드 정비

이제 데이터베이스를 코드에서도 연결할 때에도 새 인터베이스에 연결 할 수 있도록 코드를 변경한다.

[진행 절차]

  1. 프로젝트 관리자에서 Main.pas를 더블 클릭하고, 코드 에디터를 열어서 TMainForm.ViewRemoteClick 메서드 변경
    • (Local Interbase)"라는 문자열을 찾아서 "(InterBase)"로 변경한다.
  2. 여전히 Main.pas가 코드 에디터를 열린 상태에서, TMainForm.ViewMenuClick 핸들러 메서드 삭제
    • Interface 부분에서 선언 삭제
    • Implementation 부분에서 구현 삭제
  3. 단축키 F12를 눌러서, Main.pas를 연 코드 에디터폼 디자이너로 전환한 후 스트럭처 뷰에서 아래 그림과 같이 Mainform - MainMenu - View를 선택한 후, 오브젝트 인스펙터에서 Events 탭을 선택하고 OnClick 이벤트에 연결된 "ViewMenuClick"을 지운다. (로컬 데이터와 원격 데이터를 구분하지 않으므로 더이상 필요없다)RADStudio_ViewMenuClick.png
  4. 프로젝트 관리자에서 DataMod.pas를 더블 클릭하고, 코드 에디터를 열어서 TMastData.DataDirectory 메서드 삭제
    • Interface 부분에서 선언 삭제
    • Implementation 부분에서 구현 삭제
  5. 여전히 DataMod.pas가 코드 에디터에 열린 상태에서, TMastData.UseRemoteData 메서드의 코드를 아래와 같이 변경한다.
    procedure TMastData.UseRemoteData;
    var
      Params: TStringList;
    begin
      { ConnectionDef 있는지 촥인한다. 없으면, 추가한다 }
      if not FDManager.IsConnectionDef('MASTSQL') then
      begin
        Params := TStringList.create;
        try
          Params.Values['Protocol'] := 'TCPIP';
          Params.Values['Server'] := '127.0.0.1';
          Params.Values['DataBase'] := 'C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\MASTSQL.GDB'; // 실제로 MastApp.GDB (인터베이스 데이터 파일)이 있는 전체 경로
          Params.Values['User_Name'] := 'sysdba';
          Params.Values['SQLDialect'] := '3';
          Params.Values['CharacterSet'] := 'UTF8';
          Params.Values['ExtendedMetadata'] := 'True';
          FDManager.AddConnectionDef('MASTSQL', 'IB', Params);
        finally
          Params.Free;
        end;
      end;
      SetDatabaseAlias('MASTSQL'); //역자주: 원문에는 MastApp.SetDatabaseConnectionDef('MASTSQL');로 잘못 기재되어 있어서 정정함
    end;
  6. DocWiki에서는 CustByLastInvQuery에 있는 SQL문에서 키워드인 DESCENDING을 DESC 로 변경하라고 되어 있지만, 지금은 DESCENDING 키워드도 작동하므로, 굳이 바꾸지 않아도 된다.

DocWiki 원문에는 이 8단계까지만 설명되어 있다. 하지만, 실행하려고 하면 몇가지 오류가 생길 것이다. 

  1. RAD 스튜디오에서 메인 메뉴 > Run > Run (또는 단축키 F9)를 사용하여 마이그레이션이 완료된 애플리케이션을 빌드하고 실행한다.
  2. 아마 컴파일이 실패하거나, 실행 중에 오류가 발생될 것이다.
  3. 이 실습 중에 이슈를 만나면 "예상되는 오류와 처리 방법"에 있는 설명을 참고하여 해소하자.

 

9단계. 윈도우 11 스타일 적용

사용자는 애플리케이션이 바깥으로 보이는 모습에 민감하게 반응하는 경향이 있다. 클릭 몇번으로 애플리케이션의 모습을 현대식 UI로 바꿀 수 있다면, 하지 않을 이유가 없다. 이제 최신 윈도우 11 다크 스타일을 적용하자.

[진행 절차]

  1. RAD 스튜디오에서 메인 메뉴 > Project> Options를 클릭한다.
  2. Project Options 창에서 Application > Appearance를 선택하고 아래 그림과 같이 Custom StylesDefault Style 모두 "Windows11 Modern Dark"를 선택한다. (만약 이 스타일이 없다면 겟잇 패키지 매니저를 이용하여 받고 나서 진행한다)
    RADStudio_Windows11Style.png
  3. RAD 스튜디오에서 메인 메뉴 > Run > Run (또는 단축키 F9)를 사용하여 마이그레이션이 완료된 애플리케이션을 빌드하고 실행한다.
  4. BDE와 파라독스를 사용하던 델파이 7으로 되어있든 애플리케이션이 이제 FireDAC과 인터베이스 그리고 델파이 11.0 알렉산드리아로 완전히 옮겨졌다.
    MigratedAppWithWin10Style.png

 

예상되는 오류와 처리 방법

당연하지만, 프로젝트는 저마다 다르기 때문에 모두에게 적용되는 규칙 만으로 변환 할 수는 없다. 이 예제에서 발생되는 오류와 이것을 방지 또는 해소하는 방법을 적용하자. 마이그레이션 할 때 생기는 오류에 대응하는 경험을 할 수 있다.

[FireDAC][Comp][Clnt]-340. Driver ID is not defined. Set TFDConnection.DriverName or add DriverID to your connection definition

  • 의미: TFDConnection에 연결 정의가 지정되지 않았으니 지정하시오. 
  • 발생: 이 오류는 5단계의 가장 첫 진행을 하기위해 프로젝트 관리자에서 DataMod.pas 파일을 더블 클릭해서 열려고 할 때 생길 것이다.
  • 이유/조치: 5단계가 바로 연결 설정이므로 5단계를 마치고 나면 해소된다. 

[진행 절차]

  1. 걱정하지 말자. 이 메시지 창이 더이상 나타나지 않을 때가지 X버튼이나 엔터 키를 여러번 눌러서 창을 닫는다.

 

The EditUpdateError method referenced by Parts.OnupdateError has an incompatible parameter list. Remove the reference?

The EditUpdateError method referenced by Cust.OnupdateError has an incompatible parameter list. Remove the reference?

처럼 Parts.OnupdateError  대신 Cust.OnupdateError에서도 같은 메시지가 표시될 것이다.

  • 의미: EditUpdateError 메소드는 Parts.OnupdateError  (또는 Cust.OnupdateError) 이벤트를 처리하는 핸들러 메소드로 참조되고 있는데, 이벤트에서 전달하는 파라미터 목록이 서로 달라서 작동하지 않으니,   Parts.OnupdateError  (또는 Cust.OnupdateError) 이벤트에서 EditUpdateError 메소드를 이벤트 핸들러로 참조하지 않도록 제거할까요?
  • 발생: Run > Run (또는 단축키 F9)로 실행할 때 표시될 것이다.
  • 이유/조치: 위 의미에서 설명한 바와 같다. BDE와 FireDAC에서 데이터 업데이트 오류 처리 이벤트는 "OnUpdateError"로 동일하지만, 이 이벤트에서 전달하는 파라미터는 서로 다르기 때문이다. 일단 No (참조를 제거하지 않음)를 선택하여 그대로 남겨둔다. 그리고 파라미터를 일치시키는 작업을 진행한다.

2단계에서 reFind와 변환 규칙 파일(FireDAC_Migrate_BDE.txt)를 통해 자동 변환하였지만, 아래와 같이 완벽하게 변환되지 않았다.

예제에서 BDE를 자동 변환한 결과(파라미터) FireDAC의 기본 파라미터
DataSet: TDataSet;
E: EDatabaseError;

UpdateKind: TFDUpdateRequest;
var UpdateAction: TFDErrorAction
ASender: TDataSet;
AException: EFDException;
ARow: TFDDatSRow;
ARequest: TFDUpdateRequest;
var AAction: TFDErrorAction

잘 보면,

  • EDatabaseError 타입이 EFDException 타입으로 변환되지 않았다.
  • ARow: TFDDatSRow; 파라미터는 아예 생성되지 않았다 (reFind는 찾아/바꾸기 도구이므로 이런 한계가 있다)

이제 코드에서 이 부분을 수작업으로 수정하자.

[진행 절차]

  1. 코드 에디터에서 DataMod.pas 파일을 열고 EditUpdateError 이벤드 핸들러 메소드의 파라미터를 아래와 같이 변경한다.

    [변경 전]
    (DataSet: TDataSet; E: EDatabaseError;
      UpdateKind: TFDUpdateRequest; var UpdateAction: TFDErrorAction);

    [변경 후]
    (DataSet: TDataSet; E: EFDException;
    ARow: TFDDatSRow; UpdateKind: TFDUpdateRequest; var UpdateAction: TFDErrorAction);

  2. Interface 부분에서 EditUpdateError 선언의 파라미터 부분을 변경
  3. Implementation 부분에서 TMastData.EditUpdateError 구현의 파라미터 부분을 변경
  4. (원한다면, 다시 변환할 때 자동 처리되도록) 변환 규칙 파일을 보강한다. (ARow: TFDDatSRow; 파라미터를 넣는 것은 조금 부담되지만, 적어도 EDatabaseErrorEFDException로 바꾸는 규칙을 넣을 수는 있다)
    • My_FireDAC_Migrate_BDE.txt(변환 규칙 파일)을 열면, 맨 아래에 #migrate 가 모여있다.
    • 그곳에 아래와 같이 한줄 추가하고 저장한다. (찾아서 바꾸라는 규칙)
       #migrate EDatabaseError -> EFDException

 

[dcc32 Fatal Error] EDOrders.pas(21): F2613 Unit 'DBLookup' not found.

  • 의미: RAD 스튜디오에 'DBLookup' 유닛이 없다.
  • 발생: Run > Run (또는 단축키 F9)로 실행할 때  컴파일이 실패하면서 메시지 창에 표시될 것이다.
  • 이유/조치: FireDAC에서 이 유닛을 사용하지 않기 때문이다.  우리도 uses 절에서 DBLookup을 제거하자.

[진행 절차]

  1. 오류 메시지 창에서 OK를 클릭하면, 해당 오류가 있는 코드가 열린다.
  2. uses 절에 DBLookup에 빨간색 밑줄이 있을 것이다. DBLookup을 지운다. 
  3. 다시 단축키 F9를 눌러 실행(Run) 한다. 그러면 DBLookup가 uses에서 사용되는 다른 파일이 열리고 마찬가지고 빨간색 밑줄이 보인다. 이  DBLookup 역시 지운다.  
  4. (원한다면, 다시 변환할 때 자동 처리되도록) 변환 규칙 파일을 보강한다.
    • My_FireDAC_Migrate_BDE.txt(변환 규칙 파일)을 열면, 맨 위에 #unuse 가 모여있다.
    • 그곳에 아래와 같이 한줄 추가하고 저장한다. (uses에서 DBLookup을 제거하라는 규칙)
       #migrate EDatabaseError -> EFDException

 

Project mastapp.exe raised exception class EIniFileException with message 'Unable to write to RPTSMITH.CON' [Break]

  • 의미: "RPTSMITH.CON"에 쓰기를 할 수 없어서 IniFileException이 발생했다.
  • 발생: 리포팅 도구에서 사용하는 "RPTSMITH.CON" 파일이 쓰기가 금지된 폴더에 있기 때문이다.
  • 이유/조치: "RPTSMITH.CON" 파일의 위치를 쓰기가 허용되는 폴더로 변경한다.

[진행 절차]

  1. 메시지 창에서 Break 버튼을 클릭하면, 이슈가 발생하는 코드가 표시된다 (아래 코드이다).
    RSCon.WriteInteger(MASTSQLSection, TypeKey, SQLTypeVal);
  2. 이 코드를 잘 보면 TMainForm.UpdateRSConnect 메소드 안에 있을 텐데, 여기에는 "RPTSMITH.CON" 파일의 전체 경로가 상수(const)로 정의 되어 있다. 이 부분을 변경한다.
    • [변경전]
      procedure TMainForm.UpdateRSConnect(const Dbpath: string);
      const
        TiniFilename = 'RPTSMITH.CON';   {ReportSmith connections file}
      ...
    • [변경후]
      procedure TMainForm.UpdateRSConnect(const Dbpath: string);
      const
        TiniFilename = 'D:\RPTSMITH.CON';   {D 드라이브가 아니어도 쓰기 가능한 위치를 잡으면 된다: ReportSmith connections file}
      ...

Project mastapp.exe raised exception class EIBNativeException with message '[FireDAC][Phys][IB]Dynamic SQL Error
SQL error code = -206
Column unknown
A.FULLNAME'.

  • 의미:  "[FireDAC][Phys][IB]" 드라이버에서 동적 SQL을 실행하는 도중 오류 발생. "A.FULLNAME"이라는 컬럼을 알 수 없음
  • 발생: 리포팅 도구에서 사용하는 "RPTSMITH.CON" 파일이 쓰기가 금지된 폴더에 있기 때문이다.
  • 이유/조치: DataMod.pas 내의 Orders (TFDTable) 컴퍼넌트에는 "SalesPerson"이라는 영속 필드가 있다. 이 필드는 계산되는 필드라서 실제로 필드가 없는데, BDE 방식으로 lookup 찾기를 하려고 해서 오류가 발생한다. 이 필드를 계산 필드로 지정하자. 

[진행 절차]

  1. 폼 디자이너에서 DataMod.pas를 열고, "Orders" 컴포넌트를 찾아서 (아마 가장 위 왼쪽에 있을 것이다) 더블 클릭한다.
  2. 필드 에디터에 목록이 표시되면, 맨 밑에 있는 "salesperson" 필드를 한번 클릭하여 선택한다.
  3. 오브젝트 인스펙터에서 Properties 탭을 선택하고, FieldKind 프로퍼티를 찾는다.
  4. fkLookup이 지정되어 있을 텐데, fkCalculated로 변경한다.

 

[FireDAC][Phys][IB] Unable to complete network request host "127.0.0.1/3050". Failed to establish a connection.

  • 의미:  "[FireDAC][Phys][IB]" 드라이버가 대상 컴퓨터에서 연결하려고 했으나, 거부되어서 연결하지 못했다.
  • 발생: 서버가 작동하지 않거나 원격 연결을 거부하면 발생한다.
  • 이유/조치: 로컬 IP이고와 3050은 인터베이스 기본 PORT로 현재 모두 정확하므로, 인터베이스 서버가 동작하고 있는 지를 확인하자. 

[진행 절차]

  1. 윈도우 버튼 (모니터 가장 아래줄의 가장 왼쪽 아이콘) > 시작 > 프로그램 > Embarcadero InterBase [버전] > InterBase Server Manager를 실행한다.
  2. InterBase Server Manager 창에서 인터베이스 서버가 Stopped 상태로 표시된다면, Start 버튼을 클릭하여 서버를 시작한다.

 

참고한 자료

 

 

 

 

 

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.