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

이 사이트 검색

검색 태그: 'firedac'.

  • 태그로 검색

    태그 사이를 쉼표(,)로 구분하세요.
  • 작성자로 검색

콘텐츠 유형


게시판

  • 엠바카데로 (Embarcadero) 개발도구: 델파이 (Delphi), C++빌더 (C++Builder), RAD 스튜디오 (RAD Studio)
    • [기술 Q&A 게시판] 델파이, C++빌더, RAD 스튜디오
    • [설치/등록 Q&A 게시판] 델파이, C++빌더, RAD 스튜디오
    • [기술 기고 게시판] 델파이, C++빌더, RAD 스튜디오
    • [포트폴리오 게시판] 내가 참여한 프로젝트/프로그램 소개
    • [구인 게시판] 개발자 채용/프로젝트 의뢰
  • 엠바카데로 (Embarcadero) DBMS: 인터베이스 (InterBase)
    • [기술 Q&A 게시판] 인터베이스
    • [설치/등록 Q&A 게시판] 인터베이스
    • [기술 기고 게시판] 인터베이스
  • 비주얼 스튜디오 (Visual Studio) 관련 도구
    • [기술 Q&A 게시판] 비주얼 어시스트
    • [설치/등록 Q&A 게시판] 비주얼 어시스트
    • [기술 기고 게시판] 비주얼 어시스트
  • 구록 (Gurock) 테스트도구: 테스트레일 (TestRail)
    • [기술 Q&A 게시판] 테스트레일
    • [설치/등록 Q&A 게시판] 테스트레일
    • [기술 기고 게시판] 테스트레일
  • 아이데라 (Idera) 데이터 도구: 아쿠아 데이터 스튜디오 (Aqua Data Studio), ER/Studio 등
    • ER스튜디오 (ER/Studio)
    • 아쿠아 데이터 스튜디오 (Aqua Data Studio)
  • API레이어 (Apilayer) 개발 도구: API레이어 (Apilayer)
    • [Q&A 게시판] API레이어 (Apilayer)
  • 엠바카데로 (Embarcadero) 라이선스 서버: ELC (Enterprise License Center)
    • [게시판] ELC (Enterprise License Center) 라이선스 서버
  • 이 사이트 이용 관련
    • [게시판] 이 사이트 관련 이용 팁과 Q&A

Categories

  • 이달의 기술자료: 엠바카데로
  • 비디오 세미나
    • UX Summit
    • DelphiCon
    • CodeRage
    • 데브기어 세미나
    • Skill Sprint
  • 기술백서(PDF)

Categories

  • 시작하기
  • 설치/등록/라이선스
  • 튜토리얼
  • 도서

Categories

  • RAD 스튜디오 역사관
  • 11 알렉산드리아
  • 10.4 시드니
  • 10.3 리오
  • 10.2 도쿄
  • 10.1 베를린
  • 10.0 시애틀
  • XE8~XE
  • 2010~6.0

...에서 결과 찾기

검색어 일치 조건


최초 작성일

  • Start

    End


최종 변경일

  • Start

    End


개수로 필터링...

가입

  • Start

    End


Group


자주 쓰는 도구

  1. Docwiki에 있는 "Getting Started (FireDAC)"을 번역한 글 (최종 번역일: 2022년 8월 3일) << 위로 가기: FireDAC 주제 주제 설명 FireDAC으로 데이터베이스 애플리케이션을 만들기 첫걸음 델파이와 FireDAC을 사용하여 VCL 기반의 윈도우 애플리케이션 만들기를 처음으로 해 볼 수 있도록 안내한다. 튜토리얼: FireDAC을 데스크탑 플랫폼 용 멀티-디바이스 애플리케이션에서 사용하기 델파이와 FireDAC을 사용하여 파이어몽키(FMX) 기반의 고해상도 맥OS 애플리케이션 만들기를 처음으로 해 볼 수 있도록 안내한다. 모바일 튜토리얼: FireDAC을 모바일 애플리케이션에서 사용하기 (iOS, Android) 델파이와 FireDAC을 사용하여 파이어몽키(FMX) 기반의 iOS 또는 안드로이드 애플리케이션 만들기를 처음으로 해 볼 수 있도록 안내한다. 연결 설정하기 (FireDAC) FireDAC에서 데이터베이스 연결을 정의하는 절차를 안내한다. 이 글에서는 마이크로소프트 SQL 서버에서 제공하는 Northwind 데모 데이터베이스를 사용하기 위한 연결 정의를 생성한다. 패스트리포트(FastReport)를 사용하여 리포트 만들기 (FireDAC) 패스트리포트(FastReport)와 파이어닥(FireDAC)을 사용하여 리포트를 만들기를 처음으로 해 볼 수 있도록 안내한다. Demo Databases FireDAC 데모 데이터베이스를 설치하는 방법을 설명한다. Demo Applications FireDAC 데모 애플리케이션을 사용하는 방법을 설명한다. 기타 참고 (See Also) Overview (FireDAC)
  2. Docwiki에 있는 "Tutorial: Using FireDAC from a Multi-Device Application on Desktop Platforms"을 번역한 글: 번역일: 2022년 8월 3일 위로 가기: Database and LiveBindings Tutorials 목차 1 FireDAC을 사용하여 데이터베이스에 연결하기 2 사용자 화면 (UI)를 디자인하고 구성하기 3 라이브바인딩스(LiveBindings) 마법사 사용하기 3.1 라이브바인딩스(LiveBindings) 컴포넌트 추가하기 3.2 그리드(Grid) 컴포넌트 추가하기 4 애플리케이션 런타임 준비 작업 5 애플리케이션을 맥OS로 배포하기 5.1 InterBase ToGO를 맥OS로 배포하기 5.2 맥OS 장비에 있는 로컬 데이터베이스에 연결되도록 코드를 변경하기 6 개발한 애플리케이션을 윈도우 컴퓨터와 맥OS 컴퓨터에서 실행하기 7 기타 참고 (See Also) 이 튜토리얼은 윈도우 컴퓨터와 맥OS 컴퓨터에서 관리하는 로컬 데이터베이스 (InterBase ToGo 데이터베이스 엔진 사용)에 있는 데이터를 조회하는 애플리케이션을 만들기 위해 FireDAC 프레임워크를 사용하는 기본 절차를 설명한다. 참고: 이 튜토리얼을 따라하려면 IBToGo 라이선스가 필요하다. 평가판 사용자라면, 평가판 사용 기간 중에 IBToGo 테스트 배포 라이선스 역시 사용할 수 있으므로 맥OS에 이 데이터베이스를 배포할 수 있다. 평가판용 배포 라이선스를 활성화하는 방법은 InterBase ToGo Deployment에 설명되어 있다. 1 FireDAC을 사용하여 데이터베이스에 연결하기 FireDAC은 데이터 연결을 일원화할 수 있도록 제공되는 유니버설한 데이터 액세스 컴포넌트(들) 세트이다. 이것은 데이터베이스를 사용하는 멀티-디바이스 애플리케이션을 델파이와 C++빌더 개발환경에서 만들 때에도 사용된다. FireDAC의 아키텍처는 강력하고 공통 기반으로 되어 있어서, 델파이 또는 C++빌더에서 InterBase, SQLite, MySQL, SQL Server, Oracle, PostgreSQL, IBM DB2, SQL Anywhere, Access, Firebird, Informix, 등등에 고속으로 직접 접근을 할 수 있다. FireDAC에 있는 엠바카데로 인터베이스(InterBase)용 네이티브 드라이버는 인터베이스 서버, 데스크탑, 디벨로버, 투고(ToGo), IBLite 에디션은 인터베이스 6.0 버전 이상을 지원한다. 윈도우에서 작동하고 있는 Interbase ToGo에서 관리하는 데이터를 조회하려면, 해당 작업을 하는 컴퓨터에 다음과 같은 x86 또는 x64 클라이언트 소프크웨어가 설치되어 있어야 한다. IBTOGO.DLL 라이브러리는 x86 애플리케이션에서 임베디드 데이터베이스인 InterBase ToGo 또는 IBLite를 사용하는 데이터베이스를 다룰 수 있다. IBTOGO64.DLL 라이브러리는 x64 애플리케이션에서 임베디드 데이터베이스인 InterBase ToGo 또는 IBLite를 사용하는 데이터베이스를 다룰 수 있다. 맥OS에서 작동하고 있는 Interbase ToGo에서 관리하는 데이터를 조회하려면, libibtogo.dylib x86 embedded InterBase가 있어야 한다. 2 사용자 화면 (UI)를 디자인하고 구성하기 새 프로젝트를 하나 만들자. 이때 Multi-Device Application을 선택한다. 폼(form) 위에 TFDConnection 컴포넌트를 하나 올려 놓는다. 올려놓은 TFDConnection 컴포넌트를 오른쪽 클릭하고 Connection Editor를 선택한다. FireDAC의 Connection Editor 안에서, 이 TFDConnection의 파라미터(들)을 다음과 같이 지정한다 Driver ID 프로퍼티에는 IB를 지정한다. Database 파라미터에는 다음과 같이 지정한다: C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\EMPLOYEE.GDB (데이터베이스가 있는 위치) User_name 파라미터에는 sysdba를 지정한다. Password 파라미터에는 masterkey를 지정한다. Test 버튼을 클릭하여 해당 연결 정보로 성공적으로 연결되는 지를 확인한다. OK를 클릭하여 FireDAC Connection Editor를 종료한다. 오브젝트 인스펙터 (Object Inspector) 안에서 TFDConnection를 선택하고, 이 오브젝트의 프로퍼티(들)을 아래와 같이 지정한다. LoginPrompt 프로퍼티를 False로 지정하여, 사용자에게 데이터베이스 로그인을 요구하는 창이 나타나지 않도록 한다. Connected 프로퍼티를 True로 지정한다. 3 라이브바인딩스(LiveBindings) 마법사 사용하기 라이브바인딩스(LiveBindings) 마법사를 사용하여 라이브바인딩스 컴포넌트(TBindSourceDB, TBindingsList), TFDQuery, Grid 컴포넌트를 추가한다 3.1 라이브바인딩스(LiveBindings) 컴포넌트 추가하기 View > LiveBindings Designer를 선택하여 LiveBindings Designer를 연다. LiveBindings Wizard 를 선택한다. binding task에서 Create a data source를 선택하고 Next 버튼을 클릭한다. Data source 페이지에서 FireDAC을 선택하고 Next 버튼을 클릭한다. Command Type을 Query로 변경한다. Command Text 프로퍼티에서 select * from employee를 지정한다. Test Command 버튼을 클릭한다. Next 버튼을 클릭한다. Add data source navigator를 선택한다. Finish 버튼을 클릭한다. 위 작업을 마치자 마자 TBindSourceDB 컴포넌트, TBindNavigator 컴포넌트, TFDQuery 컴포넌트가 폼(form) 위에 추가된다. 3.2 그리드(Grid) 컴포넌트 추가하기 LiveBindings Wizard 를 다시 연다. binding task에서 Link a grid with a data source를 선택한다. Next 버튼을 클릭한다. TSringGrid를 선택한다. Next 버튼을 클릭한다. BindSourceDB1을 선택한다. Finish 버튼을 클릭하여 LiveBindings 마법사를 종료한다. 위와 같이 했다면, 바인딩 다이어그램의 모습이 다음과 같아야 한다. 4 애플리케이션 런타임 준비 작업 FireDAC의 아키텍처는 서로 헐겁게-짝지어지는(loosely-coupled) 여러 계층으로 구성되고 (multilayered) 각 층마다 담당하는 서비스가 있다. 서비스 API는 COM 인터페이스로 정의되어 있어서 다른 계층에서 요청을 보낼 때 해당 인터페이스 팩토리(interface factory)를 사용한다. FireDAC이 올바로 작동되도록 하려면, 반드시 IFDGUIxWaitCursor 인터페이스와 IFDPhysDriver 인터페이스에 대한 구현을 연결해야만 한다. NavigatorBindSourceDB1을 선택하고 Align 프로퍼티에 Top을 지정한다. StringGridBindSourceDB1을 선택하고 Align 프로퍼티에 Client를 지정한다. TFDGUIxWaitCursor 와 TFDPhysSQLiteDriverLink 를 폼(form)위에 놓아둔다. 5 애플리케이션을 맥OS로 배포하기 앞에서 당신이 사용한 InterBase는 개발 장비인 데스크탑에 있는 것이다. 즉, 사용하는 InterBase의 실제 위치가 당신의 로컬 하드 디스크 드라이브 (예: C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\EMPLOYEES.GDB)에 있다. 당신의 애플리케이션을 맥OS로 배포하려면, 해당 데이터베이스 파일도 맥OS의 파일 시스템 안에 복사해야 한다 (예, /Users/<user>/EMPLOYEE.GDB). 또한 Interbase ToGo 파일(들) 역시 반드시 맥OS에 배포되어야 한다. 5.1 InterBase ToGO를 맥OS로 배포하기 Project > Deployment를 선택하여 배포 관리자 (Deployment Manager)를 연다. 배포 관리자의 윗부분에 있는 target platforms 드롭-다운 목록에서 All-Configurations - macOS platform를 선택한다. Add Featured Files 를 선택한다. Interbase ToGo 데이터 모듈을 선택하고 OK를 선택하여 Featured Files 대화창을 종료한다. 그 전에 엠바카데로로부터 ToGo 라이선스 파일을 받아두었어야 한다. 이 라이선스 파일의 이름은 reg_nnnnnnn.txt 과 같은 형태이며, nnnnnnn는 자동 생성된 숫자이다. 받아둔 라이선스 파일을 사용하여 reg_ibtogo.txt (C:\Users\Public\Documents\Embarcadero\InterBase\redist\InterBase2020 경로에 있음) 파일을 덮어써놓은 경우에는 해당 라이선스 파일을 선택하기만 하면 된다. 받아둔 라이선스 파일 이름을 그대로 사용한 경우에는, Add Files를 선택하고, 애플리케이션과 함께 배포되어야 하는 파일 목록 안에 이 라이선스 파일도 추가한다. 5.2 맥OS 장비에 있는 로컬 데이터베이스에 연결되도록 코드를 변경하기 앞에서 설명한 바와 같이, TFDConnection 컴포넌트는 지금 개발 장비인 윈도우 컴퓨터 안에 있는 데이터베이스를 연결하고 있다. 따라서 데이터베이스에 연결하기 전에 연결할 데이터베이스의 위치를 바꿔주어야 한다. 다음과 같이 한다. 폼 디자이너 (Form Designer)에서 FDConnection1 컴포넌트를 선택한다. 오브젝트 인스펙터 (Object Inspector)에서 BeforeConnect 이벤트를 더블-클릭한다. 이벤트 핸들러에 아래 코드를 추가한다. 델파이: procedure TForm9.FDConnection1BeforeConnect(Sender: TObject); begin {$IFDEF MACOS} FDConnection1.Params.Values['Database']:= '$(DOC)/EMPLOYEE.GDB'; {$ENDIF} end; C++빌더: void __fastcall TForm9::FDConnection1BeforeConnect(TObject *Sender) { #ifdef __MACOS__ FDConnection1->Params->Values["Database"] = "$(DOC)/EMPLOYEE.GDB"; #endif } 알아둘 점: $(DOC)은 경로 변수 (path variable)이다. 경로 변수를 이용하면 경로 표현식 작성을 간편하게 할 수 있다. $(DOC)는 맥OS에서는 사용자의 홈 디렉토리 (/Users/<user>)를 가리킨다. 6 개발한 애플리케이션을 윈도우 컴퓨터와 맥OS 컴퓨터에서 실행하기 이제 애플리케이션을 실행할 준비가 끝났다. 이제 배포된 애플리케이션에서도 개발환경(IDE)에서와 마찬가지로 데이터를 조회할 수 있다. 또한 TBindNavigator 컴포넌트를 사용하여 원하는 데이터로 가서 레코드를 변경할 수도 있다. 애플리케이션을 실행하려면, 프로젝트 창 (Projects Window)에서 원하는 타겟 플랫폼을 선택한다. 다음 명령 중 하나를 실행한다. Run > Run Run > Run Without Debugging 7 기타 참고 (See Also) Connect to InterBase IBLite and IBToGo Licensing in RAD Studio Preparing a FireDAC Application for Run Time LiveBindings in RAD Studio 모바일 튜토리얼: FireDAC을 모바일 애플리케이션에서 사용하기 (iOS, Android)
  3. Docwiki에 있는 "Tutorial: Using FireDAC from a Multi-Device Application on Desktop Platforms"을 번역한 글: 번역일: 2022년 8월 3일 위로 가기: Database and LiveBindings Tutorials 목차 1 FireDAC을 사용하여 데이터베이스에 연결하기 2 사용자 화면 (UI)를 디자인하고 구성하기 3 라이브바인딩스(LiveBindings) 마법사 사용하기 3.1 라이브바인딩스(LiveBindings) 컴포넌트 추가하기 3.2 그리드(Grid) 컴포넌트 추가하기 4 애플리케이션 런타임 준비 작업 5 애플리케이션을 맥OS로 배포하기 5.1 InterBase ToGO를 맥OS로 배포하기 5.2 맥OS 장비에 있는 로컬 데이터베이스에 연결되도록 코드를 변경하기 6 개발한 애플리케이션을 윈도우 컴퓨터와 맥OS 컴퓨터에서 실행하기 7 기타 참고 (See Also) 이 튜토리얼은 윈도우 컴퓨터와 맥OS 컴퓨터에서 관리하는 로컬 데이터베이스 (InterBase ToGo 데이터베이스 엔진 사용)에 있는 데이터를 조회하는 애플리케이션을 만들기 위해 FireDAC 프레임워크를 사용하는 기본 절차를 설명한다. 참고: 이 튜토리얼을 따라하려면 IBToGo 라이선스가 필요하다. 평가판 사용자라면, 평가판 사용 기간 중에 IBToGo 테스트 배포 라이선스 역시 사용할 수 있으므로 맥OS에 이 데이터베이스를 배포할 수 있다. 평가판용 배포 라이선스를 활성화하는 방법은 InterBase ToGo Deployment에 설명되어 있다. 1 FireDAC을 사용하여 데이터베이스에 연결하기 FireDAC은 데이터 연결을 일원화할 수 있도록 제공되는 유니버설한 데이터 액세스 컴포넌트(들) 세트이다. 이것은 데이터베이스를 사용하는 멀티-디바이스 애플리케이션을 델파이와 C++빌더 개발환경에서 만들 때에도 사용된다. FireDAC의 아키텍처는 강력하고 공통 기반으로 되어 있어서, 델파이 또는 C++빌더에서 InterBase, SQLite, MySQL, SQL Server, Oracle, PostgreSQL, IBM DB2, SQL Anywhere, Access, Firebird, Informix, 등등에 고속으로 직접 접근을 할 수 있다. FireDAC에 있는 엠바카데로 인터베이스(InterBase)용 네이티브 드라이버는 인터베이스 서버, 데스크탑, 디벨로버, 투고(ToGo), IBLite 에디션은 인터베이스 6.0 버전 이상을 지원한다. 윈도우에서 작동하고 있는 Interbase ToGo에서 관리하는 데이터를 조회하려면, 해당 작업을 하는 컴퓨터에 다음과 같은 x86 또는 x64 클라이언트 소프크웨어가 설치되어 있어야 한다. IBTOGO.DLL 라이브러리는 x86 애플리케이션에서 임베디드 데이터베이스인 InterBase ToGo 또는 IBLite를 사용하는 데이터베이스를 다룰 수 있다. IBTOGO64.DLL 라이브러리는 x64 애플리케이션에서 임베디드 데이터베이스인 InterBase ToGo 또는 IBLite를 사용하는 데이터베이스를 다룰 수 있다. 맥OS에서 작동하고 있는 Interbase ToGo에서 관리하는 데이터를 조회하려면, libibtogo.dylib x86 embedded InterBase가 있어야 한다. 2 사용자 화면 (UI)를 디자인하고 구성하기 새 프로젝트를 하나 만들자. 이때 Multi-Device Application을 선택한다. 폼(form) 위에 TFDConnection 컴포넌트를 하나 올려 놓는다. 올려놓은 TFDConnection 컴포넌트를 오른쪽 클릭하고 Connection Editor를 선택한다. FireDAC의 Connection Editor 안에서, 이 TFDConnection의 파라미터(들)을 다음과 같이 지정한다 Driver ID 프로퍼티에는 IB를 지정한다. Database 파라미터에는 다음과 같이 지정한다: C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\EMPLOYEE.GDB (데이터베이스가 있는 위치) User_name 파라미터에는 sysdba를 지정한다. Password 파라미터에는 masterkey를 지정한다. Test 버튼을 클릭하여 해당 연결 정보로 성공적으로 연결되는 지를 확인한다. OK를 클릭하여 FireDAC Connection Editor를 종료한다. 오브젝트 인스펙터 (Object Inspector) 안에서 TFDConnection를 선택하고, 이 오브젝트의 프로퍼티(들)을 아래와 같이 지정한다. LoginPrompt 프로퍼티를 False로 지정하여, 사용자에게 데이터베이스 로그인을 요구하는 창이 나타나지 않도록 한다. Connected 프로퍼티를 True로 지정한다. 3 라이브바인딩스(LiveBindings) 마법사 사용하기 라이브바인딩스(LiveBindings) 마법사를 사용하여 라이브바인딩스 컴포넌트(TBindSourceDB, TBindingsList), TFDQuery, Grid 컴포넌트를 추가한다 3.1 라이브바인딩스(LiveBindings) 컴포넌트 추가하기 View > LiveBindings Designer를 선택하여 LiveBindings Designer를 연다. LiveBindings Wizard 를 선택한다. binding task에서 Create a data source를 선택하고 Next 버튼을 클릭한다. Data source 페이지에서 FireDAC을 선택하고 Next 버튼을 클릭한다. Command Type을 Query로 변경한다. Command Text 프로퍼티에서 select * from employee를 지정한다. Test Command 버튼을 클릭한다. Next 버튼을 클릭한다. Add data source navigator를 선택한다. Finish 버튼을 클릭한다. 위 작업을 마치자 마자 TBindSourceDB 컴포넌트, TBindNavigator 컴포넌트, TFDQuery 컴포넌트가 폼(form) 위에 추가된다. 3.2 그리드(Grid) 컴포넌트 추가하기 LiveBindings Wizard 를 다시 연다. binding task에서 Link a grid with a data source를 선택한다. Next 버튼을 클릭한다. TSringGrid를 선택한다. Next 버튼을 클릭한다. BindSourceDB1을 선택한다. Finish 버튼을 클릭하여 LiveBindings 마법사를 종료한다. 위와 같이 했다면, 바인딩 다이어그램의 모습이 다음과 같아야 한다. 4 애플리케이션 런타임 준비 작업 FireDAC의 아키텍처는 서로 헐겁게-짝지어지는(loosely-coupled) 여러 계층으로 구성되고 (multilayered) 각 층마다 담당하는 서비스가 있다. 서비스 API는 COM 인터페이스로 정의되어 있어서 다른 계층에서 요청을 보낼 때 해당 인터페이스 팩토리(interface factory)를 사용한다. FireDAC이 올바로 작동되도록 하려면, 반드시 IFDGUIxWaitCursor 인터페이스와 IFDPhysDriver 인터페이스에 대한 구현을 연결해야만 한다. NavigatorBindSourceDB1을 선택하고 Align 프로퍼티에 Top을 지정한다. StringGridBindSourceDB1을 선택하고 Align 프로퍼티에 Client를 지정한다. TFDGUIxWaitCursor 와 TFDPhysSQLiteDriverLink 를 폼(form)위에 놓아둔다. 5 애플리케이션을 맥OS로 배포하기 앞에서 당신이 사용한 InterBase는 개발 장비인 데스크탑에 있는 것이다. 즉, 사용하는 InterBase의 실제 위치가 당신의 로컬 하드 디스크 드라이브 (예: C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\EMPLOYEES.GDB)에 있다. 당신의 애플리케이션을 맥OS로 배포하려면, 해당 데이터베이스 파일도 맥OS의 파일 시스템 안에 복사해야 한다 (예, /Users/<user>/EMPLOYEE.GDB). 또한 Interbase ToGo 파일(들) 역시 반드시 맥OS에 배포되어야 한다. 5.1 InterBase ToGO를 맥OS로 배포하기 Project > Deployment를 선택하여 배포 관리자 (Deployment Manager)를 연다. 배포 관리자의 윗부분에 있는 target platforms 드롭-다운 목록에서 All-Configurations - macOS platform를 선택한다. Add Featured Files 를 선택한다. Interbase ToGo 데이터 모듈을 선택하고 OK를 선택하여 Featured Files 대화창을 종료한다. 그 전에 엠바카데로로부터 ToGo 라이선스 파일을 받아두었어야 한다. 이 라이선스 파일의 이름은 reg_nnnnnnn.txt 과 같은 형태이며, nnnnnnn는 자동 생성된 숫자이다. 받아둔 라이선스 파일을 사용하여 reg_ibtogo.txt (C:\Users\Public\Documents\Embarcadero\InterBase\redist\InterBase2020 경로에 있음) 파일을 덮어써놓은 경우에는 해당 라이선스 파일을 선택하기만 하면 된다. 받아둔 라이선스 파일 이름을 그대로 사용한 경우에는, Add Files를 선택하고, 애플리케이션과 함께 배포되어야 하는 파일 목록 안에 이 라이선스 파일도 추가한다. 5.2 맥OS 장비에 있는 로컬 데이터베이스에 연결되도록 코드를 변경하기 앞에서 설명한 바와 같이, TFDConnection 컴포넌트는 지금 개발 장비인 윈도우 컴퓨터 안에 있는 데이터베이스를 연결하고 있다. 따라서 데이터베이스에 연결하기 전에 연결할 데이터베이스의 위치를 바꿔주어야 한다. 다음과 같이 한다. 폼 디자이너 (Form Designer)에서 FDConnection1 컴포넌트를 선택한다. 오브젝트 인스펙터 (Object Inspector)에서 BeforeConnect 이벤트를 더블-클릭한다. 이벤트 핸들러에 아래 코드를 추가한다. 델파이: procedure TForm9.FDConnection1BeforeConnect(Sender: TObject); begin {$IFDEF MACOS} FDConnection1.Params.Values['Database']:= '$(DOC)/EMPLOYEE.GDB'; {$ENDIF} end; C++빌더: void __fastcall TForm9::FDConnection1BeforeConnect(TObject *Sender) { #ifdef __MACOS__ FDConnection1->Params->Values["Database"] = "$(DOC)/EMPLOYEE.GDB"; #endif } 알아둘 점: $(DOC)은 경로 변수 (path variable)이다. 경로 변수를 이용하면 경로 표현식 작성을 간편하게 할 수 있다. $(DOC)는 맥OS에서는 사용자의 홈 디렉토리 (/Users/<user>)를 가리킨다. 6 개발한 애플리케이션을 윈도우 컴퓨터와 맥OS 컴퓨터에서 실행하기 이제 애플리케이션을 실행할 준비가 끝났다. 이제 배포된 애플리케이션에서도 개발환경(IDE)에서와 마찬가지로 데이터를 조회할 수 있다. 또한 TBindNavigator 컴포넌트를 사용하여 원하는 데이터로 가서 레코드를 변경할 수도 있다. 애플리케이션을 실행하려면, 프로젝트 창 (Projects Window)에서 원하는 타겟 플랫폼을 선택한다. 다음 명령 중 하나를 실행한다. Run > Run Run > Run Without Debugging 7 기타 참고 (See Also) Connect to InterBase IBLite and IBToGo Licensing in RAD Studio Preparing a FireDAC Application for Run Time LiveBindings in RAD Studio 모바일 튜토리얼: FireDAC을 모바일 애플리케이션에서 사용하기 (iOS, Android) View full 엠바카데로 개발도구 가이드
  4. Docwiki에 있는 "Creating Reports with FastReport (FireDAC)"를 번역한 글 (최종 번역일: 2022년 8월 2일) << 위로 가기: 시작하기 (FireDAC) 패스트리포트(FastReport)와 파이어닥(FireDAC)을 사용하여 리포트를 만들어 본 적이 없는 사용자가 처음 해 볼 수 있도록 안내하는 글이다. 목차 1 시작하기 2 데이터셋을 리포트에 추가히기 3 데이터셋 사용하기 4 기타 참고 (See Also) 1 시작하기 리포트를 처음으로 만들어 보려면, 폼(form) 안에 아래에 나열한 컴포넌트(들)을 놓아두어야 한다. TFDConnection TFDGUIxWaitCursor TFDPhysXXXXDriverLink. 이 예제에서는, TFDPhysIBDriverLink를 사용한다. 툴 팔레트 안에 있는 FastReport 5.0 카테고리 탭을 펼쳐서 아래 2개를 추가 TfrxDBDataset TfrxReport 위에 나열된 컴포넌트(들)을 추가하는 것과 별개로, "리포트"에 표시할 데이터를 위한 데이터셋 컴포넌트(들)도 추가해야 한다. 예를 들면, TFDTable, TFDQuery, TFDStoredProc...이 있으며, 이 예제에서 우리는 TFDQuery를 추가하기로 한다. 리포트에 표시하고 싶은 각 데이터셋마다 TfrxDBDataset을 하나씩 추가한다. 추가한 TfrxDBDataset의 DataSet 프로퍼티에는 알맞은 데이터셋을 지정한다. 윗쪽에 있는 컴포넌트 3개는 DBMS에 연결(connection)을 위해 필요한 것들이다. TFDQuery 등 데이터셋을 리포트를 연결하려면 TfrxDBDataset을 사용한다. 데이터셋 갯수만큼 TfrxDBDataset가 있어야 한다. TfrxReport는 리포트를 생성하기 위해 필요하다. 연결(connection)이 1개보다 더 많이 필요하거나, 서로 다른 DBMS들에 연결해야 한다면, 필요한 연결 만큼 TFDConnection 컴포넌트를 올려 놓는다. TFDPhysXXXXDriverLink는 리포트에서 연결하는 DBMS에 맞는 것을 폼(또는 데이터 모듈)에 올려놓아야 한다. 올려놓은 데이터셋의 Connection 프로퍼티에는 알맞은 TFDConnection을 지정한다. 2 데이터셋을 리포트에 추가히기 이제 리포트를 편집해보자. frxReport1을 더블-클릭하면 TfrxReport 컴포넌트 에디터가 열린다. 이 리포트 에디터는 다음과 같이 구성되어 있다. 왼쪽에는 툴 팔레트 창과 페이지 3개 (Code, Data, Page1)로 이루어진 창이 있다. 가장 오른쪽에는 Data Tree가 있는데, 여기는 탭이 4개 (Data, Variables, Functions, Classes) 있다. 연결한 DBMS에서 데이터를 가져와서 리포트에 표현하려면, 가져온 데이터셋을 Data Tree에 추가해야 한다. 다음과 같이 한다. 왼쪽 창에서 Data 페이지를 선택한다. Report > Data 를 선택하여 Select Report Datasets 창을 연다. Data Tree에 추가하고 싶은 데이터셋을 선택한다. OK를 클릭한다. 이제 Data Tree의 Data 탭 아래에 해당 데이터셋의 정보가 보인다. 우리는 이 예제에서 C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data 안에 있는 데이터베이스 파일인 EMPLOYEE.GDB를 사용하기 한다 (RAD 스튜디오, 델파이, C++빌더를 설치하면 생기는 파일과 그 경로이다). 그리고 데이터셋으로는 TFDQuery에 Select * from employee; 라는 SQL 구문을 지정하고 사용하기로 한다. 이 TFDQuery 데이터셋을 Data Tree에 추가하고 나면, employee 테이블의 모든 필드(들)을 사용할 수 있게 된다. 3 데이터셋 사용하기 페스트리포트 에디터의 왼쪽 창에서 Page1 탭을 선택한다. 앞에서 추가한 데이터셋(들)은 모두 Data Tree 안에 들어 있으므로 바로 사용할 수 있다. 해당 데이터셋 노드를 펼치고 표현하려는 필드(들)을 드래그하여 해당 페이지 화면에서 원하는 위치에 올려 놓는다. 패스트 리포트(Fast Report) 미리보기 화면 4 기타 참고 (See Also) Overview (FireDAC) FireDAC FastReport
  5. Docwiki에 있는 "Creating Reports with FastReport (FireDAC)"를 번역한 글 (최종 번역일: 2022년 8월 2일) << 위로 가기: 시작하기 (FireDAC) 패스트리포트(FastReport)와 파이어닥(FireDAC)을 사용하여 리포트를 만들어 본 적이 없는 사용자가 처음 해 볼 수 있도록 안내하는 글이다. 목차 1 시작하기 2 데이터셋을 리포트에 추가히기 3 데이터셋 사용하기 4 기타 참고 (See Also) 1 시작하기 리포트를 처음으로 만들어 보려면, 폼(form) 안에 아래에 나열한 컴포넌트(들)을 놓아두어야 한다. TFDConnection TFDGUIxWaitCursor TFDPhysXXXXDriverLink. 이 예제에서는, TFDPhysIBDriverLink를 사용한다. 툴 팔레트 안에 있는 FastReport 5.0 카테고리 탭을 펼쳐서 아래 2개를 추가 TfrxDBDataset TfrxReport 위에 나열된 컴포넌트(들)을 추가하는 것과 별개로, "리포트"에 표시할 데이터를 위한 데이터셋 컴포넌트(들)도 추가해야 한다. 예를 들면, TFDTable, TFDQuery, TFDStoredProc...이 있으며, 이 예제에서 우리는 TFDQuery를 추가하기로 한다. 리포트에 표시하고 싶은 각 데이터셋마다 TfrxDBDataset을 하나씩 추가한다. 추가한 TfrxDBDataset의 DataSet 프로퍼티에는 알맞은 데이터셋을 지정한다. 윗쪽에 있는 컴포넌트 3개는 DBMS에 연결(connection)을 위해 필요한 것들이다. TFDQuery 등 데이터셋을 리포트를 연결하려면 TfrxDBDataset을 사용한다. 데이터셋 갯수만큼 TfrxDBDataset가 있어야 한다. TfrxReport는 리포트를 생성하기 위해 필요하다. 연결(connection)이 1개보다 더 많이 필요하거나, 서로 다른 DBMS들에 연결해야 한다면, 필요한 연결 만큼 TFDConnection 컴포넌트를 올려 놓는다. TFDPhysXXXXDriverLink는 리포트에서 연결하는 DBMS에 맞는 것을 폼(또는 데이터 모듈)에 올려놓아야 한다. 올려놓은 데이터셋의 Connection 프로퍼티에는 알맞은 TFDConnection을 지정한다. 2 데이터셋을 리포트에 추가히기 이제 리포트를 편집해보자. frxReport1을 더블-클릭하면 TfrxReport 컴포넌트 에디터가 열린다. 이 리포트 에디터는 다음과 같이 구성되어 있다. 왼쪽에는 툴 팔레트 창과 페이지 3개 (Code, Data, Page1)로 이루어진 창이 있다. 가장 오른쪽에는 Data Tree가 있는데, 여기는 탭이 4개 (Data, Variables, Functions, Classes) 있다. 연결한 DBMS에서 데이터를 가져와서 리포트에 표현하려면, 가져온 데이터셋을 Data Tree에 추가해야 한다. 다음과 같이 한다. 왼쪽 창에서 Data 페이지를 선택한다. Report > Data 를 선택하여 Select Report Datasets 창을 연다. Data Tree에 추가하고 싶은 데이터셋을 선택한다. OK를 클릭한다. 이제 Data Tree의 Data 탭 아래에 해당 데이터셋의 정보가 보인다. 우리는 이 예제에서 C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data 안에 있는 데이터베이스 파일인 EMPLOYEE.GDB를 사용하기 한다 (RAD 스튜디오, 델파이, C++빌더를 설치하면 생기는 파일과 그 경로이다). 그리고 데이터셋으로는 TFDQuery에 Select * from employee; 라는 SQL 구문을 지정하고 사용하기로 한다. 이 TFDQuery 데이터셋을 Data Tree에 추가하고 나면, employee 테이블의 모든 필드(들)을 사용할 수 있게 된다. 3 데이터셋 사용하기 페스트리포트 에디터의 왼쪽 창에서 Page1 탭을 선택한다. 앞에서 추가한 데이터셋(들)은 모두 Data Tree 안에 들어 있으므로 바로 사용할 수 있다. 해당 데이터셋 노드를 펼치고 표현하려는 필드(들)을 드래그하여 해당 페이지 화면에서 원하는 위치에 올려 놓는다. 패스트 리포트(Fast Report) 미리보기 화면 4 기타 참고 (See Also) Overview (FireDAC) FireDAC FastReport View full 엠바카데로 개발도구 가이드
  6. Docwiki에 있는 "First Steps to Use FireDAC"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: 시작하기 (FireDAC) 목차 1 도입 (Introduction) 2 데이터베이스에 연결을 설정하기 (Establishing the Connection to the Database) 3 데이터베이스에서 행을 선택하여 가져오기 (Selecting Rows from the Database) 4 애플리케이션이 실행되도록 준비하기 (Preparing the Application for Run Time) 5 요약 (Summary) 6 기타 자료 (See Also) 1 도입 (Introduction) 이 튜토리얼에는 크게 세가지 영역이 있다: 데이터베이스에 연결 설정하기: 델파이를 사용하여 데이터베이스에 연결되는 애플리케이션을 만드는 방법 데이터베이스에서 행을 선택하여 가져오기: 개발 화면에서 데이터를 가져와서 그리드(grid)에 표현하기 애플리케이션이 실행되도록 준비하기: 데이터베이스 애플리케이션을 표준 실행 파일로 만들어 실행하기 위해 필요한 절차 사용된 화면은 RAD 스튜디오 2007이다, 따라서 RAD 스튜디오 최신 버전에서는 조금 다를 수도 있다. 2 데이터베이스에 연결을 설정하기 (Establishing the Connection to the Database) 이 글에서는, MS-SQL 서버의 Northwind 데모 데이터베이스와 미리 정의된 연결 정의(connection definition) - MSSQL_Demo를 사용한다. 새 "VCL Forms Application Delphi for Win32"를 생성하고 시작하자. 첫째, TFDConnection 컴포넌트를 폼 위에 끌어 놓는다. 이 컴포넌트는 RAD 스튜디오 툴 팔레트 (Tool Palette) 안에 "FireDAC" 섹션 안에 들어있다. 이 컴포넌트는 데이터베이스 연결을 설정하고 제어한다. 그 다음, TFDConnection 컴포넌트의 ConnectionDefName 프로퍼티에서 드롭다운 목록을 펼친 후 MSSQL_Demo를 선택한다. 그러면 이 연결(connection) 컴포넌트는 해당 연결 정의(connection definition)를 사용할 것이다. 연결 정의에는 연결 정보가 미리 정의되어 있으므로, 이것을 사용하면 (서버 이름, 기본 데이터베이스 지정 등) 연결 파라미터를 추가로 입력할 필요가 없다. Connected 프로퍼티를 True로 지정하면, FireDAC이 로그인 대화창(Login Dialog)을 표시한다: 여기에 사용자 로그인 정보를 입력한다. 기본 설정이라면, 로그인 시도를 3번까지 할 수 있다. 모두 실패하면, 로그인 단계가 실패로 판정되고 에러 메시지가 표시된다. OK 버튼을 클릭하여 데이터베이스에 연결을 설정한다. DBMS에서 사용자 세션을 지원한다면, 이 때 DBMS 안에 사용자 세션이 생성된다. 연결 설정을 성공한 후에는, Connected 프로퍼티는 True로 설정된 그대로 유지된다. 그렇지 않으면 False로 재설정되고 FireDAC은 해당 에러 메시지를 표시한다. 3 데이터베이스에서 행을 선택하여 가져오기 (Selecting Rows from the Database) 이제 TFDQuery 컴포넌트를 툴 팔레트의 "FireDAC" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. 이 컴포넌트는 SQL 명령(command)을 수행하는고 데이터베이스에서 행(row)를 담아 오고, 변경된 데이터를 다시 데이터베이스로 전송(post)하는 역할을 담당한다. TFDQuery 컴포넌트의 Connection 프로퍼티를 앞에서 올려둔 FDConnection1으로 지정하여 이 쿼리가 해당 데이터베이스 연결을 사용하도록 한다. 참고: 만약 폼(form) 또는 데이터 모듈(datamodule)에 이미 TFDConnection 컴포넌트가 하나 이상 놓여져 있다면, TFDQuery 컴포넌트가 놓여질 때 가장 먼저 놓여진 연결이 자동으로 그 TFDQuery 컴포넌트의 Connection 프로퍼티에 지정된다. SQL 프로퍼티를 클릭하여 에디터 창을 열고 그 안에 아래 SQL 명령문을 넣는다: SELECT * FROM Orders OK 버튼을 클릭하여 에디터 창을 닫는다. 그러면 해당 SQL 명령문이 TFDQuery 컴포넌트의 SQL 프로퍼티에 지정된다. 그 다음, 델파이의 표준 TDataSource 컴포넌트를 툴 팔레트의 "Data Access" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. TDataSource 컴포넌트의 DataSet 프로퍼티를 앞에서 놓아둔 FDQuery1로 지정한다. 이제 TDBGrid 컨트롤을 툴 팔레트의 "Data Controls" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. 그리고, 이 TDBGrid의 DataSource 프로퍼티를 앞에서 놓아둔 DataSource1으로 지정한다. 마지막으로, FDQuery1의 Active 프로퍼티를 True로 지정한다. 그러면 해당 SQL 명령(command)이 DBMS로 전달되어서, 명령이 실행되고 결과 세트( result set)가 반환된다. 이 데이터는 DBGrid1 컨트롤에 표현된다. 4 애플리케이션이 실행되도록 준비하기 (Preparing the Application for Run Time) 이 애플리케이션이 실행되려면 다음과 같은 작업이 필요하다: TFDPhysMSSQLDriverLink 컴포넌트를 툴 팔레트의 "FireDAC Links" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. TFDGUIxWaitCursor 컴포넌트를 툴 팔레트의 "FireDAC UI" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. 이제 애플리케이션이 실행될 준비가 되었다. 위 컴포넌트 2개는 이 데이터베이스 애플리케이션에서 필요한 유닛들이 당신의 애플리케이션 실행파일(executable) 안에서 링크(link)될 수 있도록 한다. 실전에서는 이 컴포넌트들을 주 데이터 모듈(data module)안에 놓아 두는 것이 전형적이다. 5 요약 (Summary) 이 튜토리얼은 델파이에서 FireDAC을 이용하여 간단한 클라이언트-서버 애플리케이션을 만드는 방법을 보여준다. FireDAC의 연결(connection) 컴포넌트와 쿼리(query) 컴포넌트를 사용하여 코드를 한 줄도 쓰지 않고 데이터베이스에 연결을 설정하고 행(row)을 클라이언트로 담아와서 표현해보았다. 연결 정의에 대한 자세한 내용은 "연결 설정하기"를 참고하라. 또한 FireDAC\Samples\Getting Started 폴더에는 다른 DBMS 데모 애플리케이션들이 들어있으니 참고하기 바란다. 6 기타 자료 (See Also) Overview (FireDAC) 연결 설정하기 (FireDAC) 모바일 튜토리얼: FireDAC을 모바일 애플리케이션에서 사용하기 (iOS, Android)
  7. Docwiki에 있는 "Mobile Tutorial: Using FireDAC in Mobile Applications (iOS and Android)"을 번역한 글: 번역일: 2022년 8월 3일 위로 가기: Mobile Tutorials: Mobile Application Development (iOS and Android) 목차 1 FireDAC을 사용하여 데이터베이스에 연결하기 2 사용자 화면 (UI)를 디자인하고 구성하기 3 라이브바인딩스(LiveBindings) 마법사 사용하기 3.1 라이브바인딩스(LiveBindings) 컴포넌트 추가하기 3.2 리스트뷰(ListView) 컴포넌트 추가하기 4 라이브바인딩스(LiveBindings) 디자이너 사용하기 5 애플리케이션 런타임 준비작업 6 모바일 앱에 데이터베이스를 배포하기 위한 지정 6.1 Deployment Manager (배포 관리자) 안에서 데이터베이스 파일을 추가하고 지정하기 7 모바일 장비에서 로컬 데이터베이스에 연결되도록 코드를 변경하기 7.1 모바일 장비에서 SQLite 데이터베이스 위치 명시하기 8 개발한 애플리케이션을 시뮬레이터 또는 모바일 장비에서 실행하기 9 기타 참고 (See Also) 이 튜토리얼은 SQLite을 모바일 장비의 로컬 데이터베이스 저장소로 사용하도록 할 때 FireDAC 프레임워크를 사용하는 기본 절차를 설명한다. iOS 안드로이드 1 FireDAC을 사용하여 데이터베이스에 연결하기 FireDAC은 데이터 연결을 일원화할 수 있도록 제공되는 유니버설한 데이터 액세스 컴포넌트(들) 세트이다. 이것은 데이터베이스를 사용하는 멀티-디바이스 애플리케이션을 델파이와 C++빌더 개발환경에서 만들 때에도 사용된다. FireDAC의 아키텍처는 강력하고 공통 기반으로 되어 있어서, 델파이 또는 C++빌더에서 InterBase, SQLite, MySQL, SQL Server, Oracle, PostgreSQL, IBM DB2, SQL Anywhere, Access, Firebird, Informix, 등등에 고속으로 직접 접근을 할 수 있다. FireDAC에 있는 SQLite용 네이티브 드라이버는 SQLite 3.0 버전 이상을 지원한다. 델파이 애플리케이션에서 FireDAC을 통해 SQLite를 사용하는 것에 대한 자세한 내용은 "Using SQLite with FireDAC" 에 설명되어 있다. 애플리케이션이 SQLite를 안에 넣어서 사용하려면 배포 시스템 안에 sqlite3.dll 파일이 반드시 있어야 한다. 이 파일이 없다면 http://www.sqlite.org/download.html 에서 sqlite3.dll 파일을 다운로드 하여 시스템 경로 (예: 64-비트 윈도우에서는 C:\Windows\SysWOW64)에 저장한다. 2 사용자 화면 (UI)를 디자인하고 구성하기 새 프로젝트를 하나 만들자. 이때 Multi-Device Application을 선택한다. 폼(form) 위에 TFDConnection 컴포넌트를 하나 올려 놓는다. 올려놓은 TFDConnection 컴포넌트를 오른쪽 클릭하고 Connection Editor를 선택한다. FireDAC의 Connection Editor 안에서, 이 TFDConnection의 파라미터(들)을 다음과 같이 지정한다 Driver ID 프로퍼티에는 SQLite를 지정한다. Database 파라미터에는 다음과 같이 지정한다: C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\Employees.s3db (데이터베이스가 있는 위치). 파일 열기 대화 창에서 Open을 클릭한다 (파일 열기 창에서 Employees.s3db를 보려면 파일 열기 대화 창의 옵션을 All Files (*.*)로 지정해야 한다). Test 버튼을 클릭하여 해당 연결 정보로 성공적으로 연결되는 지를 확인한다. OK를 클릭하여 FireDAC Connection Editor를 종료한다. 오브젝트 인스펙터 (Object Inspector) 안에서 TFDConnection를 선택하고, 이 오브젝트의 프로퍼티(들)을 아래와 같이 지정한다. LoginPrompt 프로퍼티를 False로 지정하여, 사용자에게 데이터베이스 로그인을 요구하는 창이 나타나지 않도록 한다. Connected 프로퍼티를 True로 지정한다. 3 라이브바인딩스(LiveBindings) 마법사 사용하기 라이브바인딩스(LiveBindings) 마법사를 사용하여 라이브바인딩스 컴포넌트(TBindSourceDB, TBindingsList), TFDQuery, TListView 컴포넌트를 추가한다 3.1 라이브바인딩스(LiveBindings) 컴포넌트 추가하기 View > LiveBindings Designer를 선택하여 LiveBindings Designer를 연다. LiveBindings Wizard 를 선택한다. binding task에서 Create a data source를 선택한다. Next 버튼을 클릭한다. FireDAC 클래스 이름을 선택한다. Next 버튼을 클릭한다. Command Type을 Query로 변경한다. Command Text 프로퍼티에서 select Name, Department, Seniority from Employee order by Department를 지정한다. Test Command 버튼을 클릭한다. Next 버튼을 클릭한다. Finish 버튼을 클릭한다. 위 작업을 마치자 마자 TBindSourceDB 컴포넌트와 TFDQuery 컴포넌트가 폼(form) 위에 추가된다. 3.2 리스트뷰(ListView) 컴포넌트 추가하기 LiveBindings Wizard 를 다시 연다. binding task에서 Link a control with a field를 선택한다. Next 버튼을 클릭한다. TListView를 선택한다. Next 버튼을 클릭한다. BindSourceDB1을 선택한다. Next 버튼을 클릭한다. Field Name에서 Name을 선택한다. Next 버튼을 클릭한다. Finish 버튼을 클릭하여 LiveBindings 마법사를 종료한다. 4 라이브바인딩스(LiveBindings) 디자이너 사용하기 라이브바인딩스 디자이너 (LiveBindings Designer)를 사용하여 TBindSourceDB와 TListView 사이에 새 연결(들)을 추가해보자. TListView 에서 ItemHeader.Text를 선택한다. BindSourceDB1 컴포넌트의 구성원 중 Department에 바인딩한다. 드래그를 하면 된다(연결선이 생긴다). TListView 에서 Item.Text를 선택한다. BindSourceDB1 컴포넌트의 구성원 중 Name에 바인딩한다. 드래그를 하면 된다(연결선이 생긴다). 오브젝트 인스펙터 (Object Inspector) 안에서 TListView를 선택하고 이 오브젝트의 프로퍼티를 다음과 같이 지정한다. ItemAppearance 프로퍼티를 ImageListItemRightButton으로 지정한다. 그 결과, 라이브바인딩스 디자이너에서 보면, TListView에 새 구성원으로 Item.ButtonText가 추가된 것을 알 수 있다. Align 프로퍼티를 Client로 지정한다. 라이브바인딩스 디자이너 안에 있는 TListView의 구성원 중 Item.ButtonText를 선택한다. BindSourceDB1 컴포넌트의 구성원 중 Seniority에 바인딩한다. 드래그를 하면 된다(연결선이 생긴다). 5 애플리케이션 런타임 준비 작업 FireDAC의 아키텍처는 서로 헐겁게-짝지어지는(loosely-coupled) 여러 계층으로 구성되고 (multilayered) 각 층마다 담당하는 서비스가 있다. 서비스 API는 COM 인터페이스로 정의되어 있어서 다른 계층에서 요청을 보낼 때 해당 인터페이스 팩토리(interface factory)를 사용한다. FireDAC이 올바로 작동되도록 하려면, 반드시 IFDGUIxWaitCursor 인터페이스와 IFDPhysDriver 인터페이스에 대한 구현을 연결해야만 한다. 우리는 그렇게 하기 위해면, TFDGUIxWaitCursor 와 TFDPhysSQLiteDriverLink 를 폼(form)위에 놓아둔다. 6 모바일 앱에 데이터베이스를 배포하기 위한 지정 앞에서 당신이 사용한 SQLite는 개발 장비인 데스크탑에 있는 것이다. 즉, 사용하는 SQLite의 실제 위치가 당신의 로컬 하드 디스크 드라이브 (예: C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\Employees.s3db)에 있다. 모바일 장비에서는, 애플리케이션이 샌드-박스 처리가 된다. 따라서 당신이 읽고 쓸 수 있는 데이터는 (iOS 장비에서는) Documents 폴더, (안드로이드 장비에서는) internal 저장소 안에 있는 당신의 애플리케이션 폴더 아래에 있는 것들 뿐인 경우가 전형적이다. 모바일 장비에 있는 로컬 데이터베이스에 연결하러면, 다음과 같은 조치를 해야한다. 데이터베이스를 모바일 장비로 배포 (해당 데이터페이스 파일을 연결하도록) 구성을 변경: (iOS 장비에서는) Documents 폴더, (안드로이드 장비에서는) internal 저장소 안에 위치한 모바일 로컬 데이터베이스를 가리키도록 변경 6.1 Deployment Manager (배포 관리자) 안에서 데이터베이스 파일을 추가하고 지정하기 모바일 상에서 당신의 애플리케이션이 실행되도록 하기에 앞서, 먼저 당신의 데이터베이스 파일 (Employees.s3db)이 모바일로 배포되도록 지정해야 한다. Project > Deployment를 선택하여 배포 관리자 (Deployment Manager)를 연다. Add Files를 선택하고, 해당 데이터베이스 파일(예, C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\Employees.s3db)을 선택한다. Employees.s3db를 선택하고, Remote Path를 (iOS 용 이라면) StartUp\Documents\로, (안드로이드 용 이라면) assets\internal\로 변경한다. Remote Path 지정: iOS 용 인 경우 Remote Path 지정: 안드로이드 용 인 경우 해당 플랫폼 지정을 선택한다 (Employees.s3db가 있는 행의 Platforms 값에 있는 [...]를 더블-클릭 한다) Employees.s3db의 플랫폼으로 iOSSimulator, iOSDevice32, iOSDevice64 (또는 Android)가 보이는 지 확인한다. 만약 Win32가 보인다면, Win32를 제거한다 (데이터베이스 파일을 일부러 Win32 플랫폼으로 복사하지 않아도 된다) All-Configurations - iOS Device - 32 bit platform, All-Configurations - iOS Device - 64 bit를 선택하거나 또는 All-Configurations - Android 플랫폼을 선택하고, employees.s3db 파일이 StartUp\Documents\ 또는 assets\internal\로 배포되도록 설정되어 있는지를 확인한다. 앞에서 구성한데로, 애플리케이션을 모바일 장비에서 실행하면, 해당 데이터베이스 파일(employees.s3db)은 당신의 애플리케이션 샌드박스 영역 안에 있는 (iOS 용 이라면) StartUp\Documents\ 또는 (안드로이드 용 이라면) assets\internal\로 배포된다. 7 모바일 장비에서 로컬 데이터베이스에 연결되도록 코드를 변경하기 이제 애플리케이션에서 아주 간단한 기능 구현이 완료되었고, 애플리케이션이 사용하는 데이터베이스 파일이 개발 장비인 윈도우 컴퓨터 안에 생성되었다. 이 데이터베이스 파일은 모바일 장비에 있지 않기 때문에 이 상태에서는 모바일 앱이 이 데이터베이스를 사용할 수 없다. 따라서 당신이 이 데이터 파일을 모바일 장비로 복사하거나 또는 모바일 장비에 이 파일을 만들어 넣어야 한다. 7.1 모바일 장비에서 SQLite 데이터베이스 위치 명시하기 폼 디자이너 (Form Designer)에서 FDConnection1 컴포넌트를 선택한다. 오브젝트 인스펙터 (Object Inspector)에서 BeforeConnect 이벤트를 더블-클릭한다. 이벤트 핸들러에 아래 코드를 추가한다. 델파이: procedure TForm1.FDConnection1BeforeConnect(Sender: TObject); begin FDConnection1.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'Employees.s3db'); end; 레코드(record) 타입인 TPath는 System.IOUtils 유닛 안에 선언되어 있다. 따라서 TPath를 사용하는 유닛은 uses 절에 System.IOUtils 유닛을 추가해야 한다. C++ (모바일 용은 iOS 앱 개발만 지원): void __fastcall TForm1::FDConnection1BeforeConnect(TObject *Sender) { FDConnection1->Params->Values["ColumnMetadataSupported"] = "False"; FDConnection1->Params->Values["Database"] = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetDocumentsPath(), "Employees.s3db"); } 레코드(record) 타입인 TPath는 System.IOUtils 유닛 안에 선언되어 있다. 따라서 당신은 헤더 유닛에 #include <System.IOUtils.hpp>을 추가해야 한다. 8 개발한 애플리케이션을 시뮬레이터 또는 모바일 장비에서 실행하기 이제 애플리케이션을 실행할 준비가 끝났다. (Run > Run을 선택한다) iOS 안드로이드 9 기타 참고 (See Also) Connect to SQLite (FireDAC) Preparing a FireDAC Application for Run Time LiveBindings in RAD Studio Mobile Tutorial: Using InterBase ToGo with dbExpress (iOS and Android) Mobile Tutorial: Connecting to an Enterprise Database from a Mobile Client (iOS and Android) 튜토리얼: FireDAC을 데스크탑 플랫폼 용 멀티-디바이스 애플리케이션에서 사용하기
  8. Docwiki에 있는 "Mobile Tutorial: Using FireDAC in Mobile Applications (iOS and Android)"을 번역한 글: 번역일: 2022년 8월 3일 위로 가기: Mobile Tutorials: Mobile Application Development (iOS and Android) 목차 1 FireDAC을 사용하여 데이터베이스에 연결하기 2 사용자 화면 (UI)를 디자인하고 구성하기 3 라이브바인딩스(LiveBindings) 마법사 사용하기 3.1 라이브바인딩스(LiveBindings) 컴포넌트 추가하기 3.2 리스트뷰(ListView) 컴포넌트 추가하기 4 라이브바인딩스(LiveBindings) 디자이너 사용하기 5 애플리케이션 런타임 준비작업 6 모바일 앱에 데이터베이스를 배포하기 위한 지정 6.1 Deployment Manager (배포 관리자) 안에서 데이터베이스 파일을 추가하고 지정하기 7 모바일 장비에서 로컬 데이터베이스에 연결되도록 코드를 변경하기 7.1 모바일 장비에서 SQLite 데이터베이스 위치 명시하기 8 개발한 애플리케이션을 시뮬레이터 또는 모바일 장비에서 실행하기 9 기타 참고 (See Also) 이 튜토리얼은 SQLite을 모바일 장비의 로컬 데이터베이스 저장소로 사용하도록 할 때 FireDAC 프레임워크를 사용하는 기본 절차를 설명한다. iOS 안드로이드 1 FireDAC을 사용하여 데이터베이스에 연결하기 FireDAC은 데이터 연결을 일원화할 수 있도록 제공되는 유니버설한 데이터 액세스 컴포넌트(들) 세트이다. 이것은 데이터베이스를 사용하는 멀티-디바이스 애플리케이션을 델파이와 C++빌더 개발환경에서 만들 때에도 사용된다. FireDAC의 아키텍처는 강력하고 공통 기반으로 되어 있어서, 델파이 또는 C++빌더에서 InterBase, SQLite, MySQL, SQL Server, Oracle, PostgreSQL, IBM DB2, SQL Anywhere, Access, Firebird, Informix, 등등에 고속으로 직접 접근을 할 수 있다. FireDAC에 있는 SQLite용 네이티브 드라이버는 SQLite 3.0 버전 이상을 지원한다. 델파이 애플리케이션에서 FireDAC을 통해 SQLite를 사용하는 것에 대한 자세한 내용은 "Using SQLite with FireDAC" 에 설명되어 있다. 애플리케이션이 SQLite를 안에 넣어서 사용하려면 배포 시스템 안에 sqlite3.dll 파일이 반드시 있어야 한다. 이 파일이 없다면 http://www.sqlite.org/download.html 에서 sqlite3.dll 파일을 다운로드 하여 시스템 경로 (예: 64-비트 윈도우에서는 C:\Windows\SysWOW64)에 저장한다. 2 사용자 화면 (UI)를 디자인하고 구성하기 새 프로젝트를 하나 만들자. 이때 Multi-Device Application을 선택한다. 폼(form) 위에 TFDConnection 컴포넌트를 하나 올려 놓는다. 올려놓은 TFDConnection 컴포넌트를 오른쪽 클릭하고 Connection Editor를 선택한다. FireDAC의 Connection Editor 안에서, 이 TFDConnection의 파라미터(들)을 다음과 같이 지정한다 Driver ID 프로퍼티에는 SQLite를 지정한다. Database 파라미터에는 다음과 같이 지정한다: C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\Employees.s3db (데이터베이스가 있는 위치). 파일 열기 대화 창에서 Open을 클릭한다 (파일 열기 창에서 Employees.s3db를 보려면 파일 열기 대화 창의 옵션을 All Files (*.*)로 지정해야 한다). Test 버튼을 클릭하여 해당 연결 정보로 성공적으로 연결되는 지를 확인한다. OK를 클릭하여 FireDAC Connection Editor를 종료한다. 오브젝트 인스펙터 (Object Inspector) 안에서 TFDConnection를 선택하고, 이 오브젝트의 프로퍼티(들)을 아래와 같이 지정한다. LoginPrompt 프로퍼티를 False로 지정하여, 사용자에게 데이터베이스 로그인을 요구하는 창이 나타나지 않도록 한다. Connected 프로퍼티를 True로 지정한다. 3 라이브바인딩스(LiveBindings) 마법사 사용하기 라이브바인딩스(LiveBindings) 마법사를 사용하여 라이브바인딩스 컴포넌트(TBindSourceDB, TBindingsList), TFDQuery, TListView 컴포넌트를 추가한다 3.1 라이브바인딩스(LiveBindings) 컴포넌트 추가하기 View > LiveBindings Designer를 선택하여 LiveBindings Designer를 연다. LiveBindings Wizard 를 선택한다. binding task에서 Create a data source를 선택한다. Next 버튼을 클릭한다. FireDAC 클래스 이름을 선택한다. Next 버튼을 클릭한다. Command Type을 Query로 변경한다. Command Text 프로퍼티에서 select Name, Department, Seniority from Employee order by Department를 지정한다. Test Command 버튼을 클릭한다. Next 버튼을 클릭한다. Finish 버튼을 클릭한다. 위 작업을 마치자 마자 TBindSourceDB 컴포넌트와 TFDQuery 컴포넌트가 폼(form) 위에 추가된다. 3.2 리스트뷰(ListView) 컴포넌트 추가하기 LiveBindings Wizard 를 다시 연다. binding task에서 Link a control with a field를 선택한다. Next 버튼을 클릭한다. TListView를 선택한다. Next 버튼을 클릭한다. BindSourceDB1을 선택한다. Next 버튼을 클릭한다. Field Name에서 Name을 선택한다. Next 버튼을 클릭한다. Finish 버튼을 클릭하여 LiveBindings 마법사를 종료한다. 4 라이브바인딩스(LiveBindings) 디자이너 사용하기 라이브바인딩스 디자이너 (LiveBindings Designer)를 사용하여 TBindSourceDB와 TListView 사이에 새 연결(들)을 추가해보자. TListView 에서 ItemHeader.Text를 선택한다. BindSourceDB1 컴포넌트의 구성원 중 Department에 바인딩한다. 드래그를 하면 된다(연결선이 생긴다). TListView 에서 Item.Text를 선택한다. BindSourceDB1 컴포넌트의 구성원 중 Name에 바인딩한다. 드래그를 하면 된다(연결선이 생긴다). 오브젝트 인스펙터 (Object Inspector) 안에서 TListView를 선택하고 이 오브젝트의 프로퍼티를 다음과 같이 지정한다. ItemAppearance 프로퍼티를 ImageListItemRightButton으로 지정한다. 그 결과, 라이브바인딩스 디자이너에서 보면, TListView에 새 구성원으로 Item.ButtonText가 추가된 것을 알 수 있다. Align 프로퍼티를 Client로 지정한다. 라이브바인딩스 디자이너 안에 있는 TListView의 구성원 중 Item.ButtonText를 선택한다. BindSourceDB1 컴포넌트의 구성원 중 Seniority에 바인딩한다. 드래그를 하면 된다(연결선이 생긴다). 5 애플리케이션 런타임 준비 작업 FireDAC의 아키텍처는 서로 헐겁게-짝지어지는(loosely-coupled) 여러 계층으로 구성되고 (multilayered) 각 층마다 담당하는 서비스가 있다. 서비스 API는 COM 인터페이스로 정의되어 있어서 다른 계층에서 요청을 보낼 때 해당 인터페이스 팩토리(interface factory)를 사용한다. FireDAC이 올바로 작동되도록 하려면, 반드시 IFDGUIxWaitCursor 인터페이스와 IFDPhysDriver 인터페이스에 대한 구현을 연결해야만 한다. 우리는 그렇게 하기 위해면, TFDGUIxWaitCursor 와 TFDPhysSQLiteDriverLink 를 폼(form)위에 놓아둔다. 6 모바일 앱에 데이터베이스를 배포하기 위한 지정 앞에서 당신이 사용한 SQLite는 개발 장비인 데스크탑에 있는 것이다. 즉, 사용하는 SQLite의 실제 위치가 당신의 로컬 하드 디스크 드라이브 (예: C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\Employees.s3db)에 있다. 모바일 장비에서는, 애플리케이션이 샌드-박스 처리가 된다. 따라서 당신이 읽고 쓸 수 있는 데이터는 (iOS 장비에서는) Documents 폴더, (안드로이드 장비에서는) internal 저장소 안에 있는 당신의 애플리케이션 폴더 아래에 있는 것들 뿐인 경우가 전형적이다. 모바일 장비에 있는 로컬 데이터베이스에 연결하러면, 다음과 같은 조치를 해야한다. 데이터베이스를 모바일 장비로 배포 (해당 데이터페이스 파일을 연결하도록) 구성을 변경: (iOS 장비에서는) Documents 폴더, (안드로이드 장비에서는) internal 저장소 안에 위치한 모바일 로컬 데이터베이스를 가리키도록 변경 6.1 Deployment Manager (배포 관리자) 안에서 데이터베이스 파일을 추가하고 지정하기 모바일 상에서 당신의 애플리케이션이 실행되도록 하기에 앞서, 먼저 당신의 데이터베이스 파일 (Employees.s3db)이 모바일로 배포되도록 지정해야 한다. Project > Deployment를 선택하여 배포 관리자 (Deployment Manager)를 연다. Add Files를 선택하고, 해당 데이터베이스 파일(예, C:\Users\Public\Documents\Embarcadero\Studio\22.0\Samples\Data\Employees.s3db)을 선택한다. Employees.s3db를 선택하고, Remote Path를 (iOS 용 이라면) StartUp\Documents\로, (안드로이드 용 이라면) assets\internal\로 변경한다. Remote Path 지정: iOS 용 인 경우 Remote Path 지정: 안드로이드 용 인 경우 해당 플랫폼 지정을 선택한다 (Employees.s3db가 있는 행의 Platforms 값에 있는 [...]를 더블-클릭 한다) Employees.s3db의 플랫폼으로 iOSSimulator, iOSDevice32, iOSDevice64 (또는 Android)가 보이는 지 확인한다. 만약 Win32가 보인다면, Win32를 제거한다 (데이터베이스 파일을 일부러 Win32 플랫폼으로 복사하지 않아도 된다) All-Configurations - iOS Device - 32 bit platform, All-Configurations - iOS Device - 64 bit를 선택하거나 또는 All-Configurations - Android 플랫폼을 선택하고, employees.s3db 파일이 StartUp\Documents\ 또는 assets\internal\로 배포되도록 설정되어 있는지를 확인한다. 앞에서 구성한데로, 애플리케이션을 모바일 장비에서 실행하면, 해당 데이터베이스 파일(employees.s3db)은 당신의 애플리케이션 샌드박스 영역 안에 있는 (iOS 용 이라면) StartUp\Documents\ 또는 (안드로이드 용 이라면) assets\internal\로 배포된다. 7 모바일 장비에서 로컬 데이터베이스에 연결되도록 코드를 변경하기 이제 애플리케이션에서 아주 간단한 기능 구현이 완료되었고, 애플리케이션이 사용하는 데이터베이스 파일이 개발 장비인 윈도우 컴퓨터 안에 생성되었다. 이 데이터베이스 파일은 모바일 장비에 있지 않기 때문에 이 상태에서는 모바일 앱이 이 데이터베이스를 사용할 수 없다. 따라서 당신이 이 데이터 파일을 모바일 장비로 복사하거나 또는 모바일 장비에 이 파일을 만들어 넣어야 한다. 7.1 모바일 장비에서 SQLite 데이터베이스 위치 명시하기 폼 디자이너 (Form Designer)에서 FDConnection1 컴포넌트를 선택한다. 오브젝트 인스펙터 (Object Inspector)에서 BeforeConnect 이벤트를 더블-클릭한다. 이벤트 핸들러에 아래 코드를 추가한다. 델파이: procedure TForm1.FDConnection1BeforeConnect(Sender: TObject); begin FDConnection1.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, 'Employees.s3db'); end; 레코드(record) 타입인 TPath는 System.IOUtils 유닛 안에 선언되어 있다. 따라서 TPath를 사용하는 유닛은 uses 절에 System.IOUtils 유닛을 추가해야 한다. C++ (모바일 용은 iOS 앱 개발만 지원): void __fastcall TForm1::FDConnection1BeforeConnect(TObject *Sender) { FDConnection1->Params->Values["ColumnMetadataSupported"] = "False"; FDConnection1->Params->Values["Database"] = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetDocumentsPath(), "Employees.s3db"); } 레코드(record) 타입인 TPath는 System.IOUtils 유닛 안에 선언되어 있다. 따라서 당신은 헤더 유닛에 #include <System.IOUtils.hpp>을 추가해야 한다. 8 개발한 애플리케이션을 시뮬레이터 또는 모바일 장비에서 실행하기 이제 애플리케이션을 실행할 준비가 끝났다. (Run > Run을 선택한다) iOS 안드로이드 9 기타 참고 (See Also) Connect to SQLite (FireDAC) Preparing a FireDAC Application for Run Time LiveBindings in RAD Studio Mobile Tutorial: Using InterBase ToGo with dbExpress (iOS and Android) Mobile Tutorial: Connecting to an Enterprise Database from a Mobile Client (iOS and Android) 튜토리얼: FireDAC을 데스크탑 플랫폼 용 멀티-디바이스 애플리케이션에서 사용하기 View full 엠바카데로 개발도구 가이드
  9. Docwiki에 있는 "FDExplorer"를 번역한 글 (최종 번역일: 2022년 8월 2일) << 위로 가기: Utilities (FireDAC) 목차 1 개요 2 기본(default) 파라미터 다루기 3 연결 정의 파일(들) 다루기 4 연결 정의(들) 다루기 5 연결 정의(들) 편집하기 6 데이터베이스 내용 둘러보기(Browsing the Database Contents) 7 데이터베이스에 대고 쿼리 실행하기 8 기타 참고 (See Also) 1 개요 FDExplorer (파이어닥 익스플로러)는 데이터베이스 연결을 계층형으로 둘러보는 도구로써 데이터 편집 기능과 SQL 스크립트 실행 기능도 들어있다. FDExplorer는 BDE 엔진에 있던 BDE Database Explorer와도 비교된다. FDExplorer는 독립 실행 프로그램이며, RAD 스튜디오 IDE 안에서 Tools > FireDAC Explorer 메뉴를 이용해 실행할 수 있다. FDExplorer를 사용하여 할 수 있는 작업 FireDAC의 기본(default) 파라미터 관리 연결 정의 (connection definition) 파일 생성, 편집, 적재, 저장 연결 정의 (connection definition) 생성, 편집, 적재, 저장 테이블, 인덱스, PK (프라이머리 키), SP (저장 프로시저), 트리거, 등 데이터베이스-고유한 스키마 오브젝트 탐색 테이블 안에 있는 데이터 조회, 추가, 변경 SQL 스크립트 생성, 편집, 적재, 저장, 실행 기능을 이용하여 데이터베이스 조회(query), 변경(alter), 테스트, 배포 알아둘 점: FDAdministrator로도 연결 정의 (connection definition)를 관리할 수 있다. FDAdministrator는 BDE의 BDE Admin과 비교된다. FDAdministrator는 실제로 FDExplorer 인데, SQL 명령 실행과 데이터 편집 기능이 빠진 버전이다. FDAdministrator를 제작한 의도는 개발한 애플리케이션을 배포할 때 함께 배포할 수 있게 하기 위함이다. 2 기본(default) 파라미터 다루기 FireDAC의 기본(default) 파라미터(들)을 관리하려면 트리뷰에서 Connection definitions 항목을 선택한다. Connection definition file : 연결 정의 (connection definition) 파일의 기본(default) 이름 Driver configuration file : 드라이버 구성 (driver configuration) 파일의 기본(default) 이름 명시된 값이 개발 장비에서 사용할 기본 값이라면, 바로 아래에 있는 체크 박스가 선택된다. 이 파라미터 값들을 편집하고 체크 박스를 선택하면, 변경한 새 값(들)이 저장된다. 이 값(들)은 레지스트리 키 HKCU\Embarcadero\FireDAC에 저장된다. 3 연결 정의 파일(들) 다루기 FDExplorer를 실행하면, 기본(default) 연결 정의 (connection definition) 파일에 있는 연결 정의(들)이 표시된다. 여기에서 원하는 버튼 또는 메뉴를 사용하여 작업할 수 있다. New ConnDef File : 빈 연결 정의 (connection definition) 파일 하나를 새로 만들기 Open ConnDef File : 기존 연결 정의 (connection definition) 파일을 열기 4 연결 정의(들) 다루기 현재 열려있는 연결 정의 (connection definition) 파일에 있는 연결 정의(들)을 관리하려면, Objects Explorer 창에 있는 이 툴바 버튼(들)을 사용한다. Connection Definition (Ctrl+N): 빈 연결 정의 (connection definition) 하나를 새로 만들기 Delete the current object (Ctrl+Del): 현재 선택된 연결 정의를 영구 삭제하기 Open current object (또는 트리뷰의 + 표시를 클릭): 현재 선택된 연결 정의를 활성화하여 연결하기 Close current object: 현재 연결된 데이터베이스 연결을 닫기 Rename current object (Ctrl+M): 현재 선택된 연결 정의의 이름 변경 Save changes to current object (Ctrl+A): 현재 선택된 연결 정의에서 변경된 사항들을 영구 저장하기 Cancel changes to current object (Ctrl+백스페이스): 현재 선택된 연결 정의에서 변경된 사항들을 영구 취소하기 5 연결 정의(들) 편집하기 연결 정의 (connection definition)를 편집하려면, 트리뷰에서 원하는 것을 선택한다. 그리고 나서 오른쪽에 있는 Connection Definition Editor에서 편집할 수 있다. 이 에디터에는 다음과 같이 탭이 3개 있다. Definition: 주요 연결 파라미터(들)을 편집하는 곳. 먼저, 맨 위에 있는 드롭-다운 목록에서 알맞은 Driver ID를 선택한다. 그러면, 선택한 드라이버에 해당하는 파라미터(들)이 나타나서 편집할 수 있게 된다. 파라미터(들)에 대한 보다 자세한 정보는 FireDAC Database Connectivity에 설명되어 있다. 편집 작업을 마치고 난 후에, 왼쪽에 있는 트리뷰에서 해당 연결 정의 (connection definition)를 다시한번 클릭한다. 이제 해당 연결 정의가 변경되었다. 하지만, 아직 연결 정의 (connection definition) 파일에 저장되지는 않았다. Ctrl+A를 눌러서 저장하자. Advanced: 연결의 고급(advanced) 옵션(들)을 편집하는 곳 Info: 현재 선택된 연결 정의에 관련된 모든 정보를 보여주는 곳. 파라미터(들) 전체 세트, FireDAC 버전 정보 등도 여기에서 볼 수 있다. 해당 연결을 통해 데이터베이스에 연결이 된 상태라면, 이 페이지에는 연결된 데이터베이스 서버와 데이터베이스 클라이언트에 대한 추가 정보들이 보여진다. 알아둘 점: FireDAC 기술 지원 팀에서 정보를 제공해야 하는 경우 이 Info 페이지를 사용하라. 또한, Connection 메뉴에서는 아래와 같은 명령(들)을 사용할 수 있다. Run Wizard (Ctrl+W): connection definition wizard를 실행한다. 사용하는 드라이버에서 기능을 제공하는 경우에만 해당됨. 현재 마이크로소프트 SQL 서버, 마이크로소프트 액세스(Access), IBM DB2, Sybase SQL Anywhere, 기능이 해당되는 ODBC 브릿지 드라이버(들)만 해당된다. Test (Ctrl+T): 트리뷰에서 해당 연결 정의 노드를 열지 않고도, DBMS에 잘 연결되는 지 테스트한다. Make BDE Compatible (Ctrl+B): BDE와 호환되는 데이터 타입 맵핑 스키마를 현재 연결 정의에 적용한다. Import BDE Aliases: BDE 별칭(alias)을 현재 연결 정의로 가져오기 할 수 있다. Help Topics (F1): 선택한 DriverID에 해당되는 드라이버 파라미터(들)에 대해 설명하는 도움말이 열린다. 6 데이터베이스 내용 둘러보기(Browsing the Database Contents) 데이터베이스에만 고유한 스키마 오브젝트 즉, 테이블, 인덱스, PK (프라이머리 키), SP (저장 프로시저), 트리거, 시퀀스 등등을 탐색하려면, 트리뷰에서 해당 연결 정의 노드를 선택하여 연다. 그리고 나면, 선택된 데이터베이스 구조를 하나씩 안으로 타고 들어갈 수 있다. 이때 탐색하게 되는 오브젝트(들)은 선택한 DBMS에 해당되는 것들이다. 해당 오브젝트의 메타데이터를 보고 싶으면, 트리뷰에서 오브젝트를 선택하고 나서 오른쪽 창에서 Info 탭을 선택하여 해당 창을 본다. 테이블에 현재 들어있는 데이터를 조회, 추가, 편집하려면, 트리뷰에서 해당 테이블(table) 또는 뷰(view)를 선택하고 오른쪽 창에서 Data 탭을 선택하여 해당 창을 본다. View > Blob Viewer 를 사용하거나, 오른쪽 창에 있는 DB 그리드 안에 해당 셀을 더블-클릭하면 해당 BLOB 필드의 내용(텍스트, 바이너리 데이터, 이미지, HTML, 등등)을 볼 수 있다. 7 데이터베이스에 대고 쿼리 실행하기 데이터베이스 조회(query), 변경(alter), 테스트, 배포를 하기 위해 SQL 스크립트 창을 이용할 수도 있다. 트리뷰에서 알맞은 연결 정의를 선택하여 열고, 아래 버튼 또는 메인 메뉴 항목을 사용한다. New SQL Script: 빈 SQL 스크립트 하나를 새로 만들기 Open SQL Script: 기존 SQL 스크립트를 열기 Run Script (F9): SQL 스크립트 하나를 통째로 처음부터 끝까지 실행하기 Run Command (F7): SQL 스크립트 데이터 안에서 현재 커서의 위치가 놓여있는 곳 바로 뒤에 있는 명령을 실행하기 Skip Command (Shift+F7): SQL 스크립트 데이터 안에서 현재 커서의 위치가 놓여있는 곳 바로 뒤에 있는 명령을 건너뛰기 제어 명령(command)을 실행하는 스크립트 지원 목록과 설명은 FDExecutor에 있다. 또는 F1을 누르면 된다. 8 기타 참고 (See Also) FDExecutor FDAdministrator Database Connectivity 연결을 정의하기 (FireDAC)
  10. Docwiki에 있는 "Setting up Connections (FireDAC)"을 번역한 글 (번역일: 2022년 7월 28일) << 위로 가기: [DocWiki 번역] 시작하기 (FireDAC) FireDAC에서 데이터베이스 연결을 정의하는 절차를 안내한다. FireDAC은 다중-데이터베이스 연결 엔진으로써 각 DBMS 별 드라이버를 제공한다. 이 글에서는 마이크로소프트 SQL 서버에서 제공하는 Northwind 데모 데이터베이스를 사용하기 위한 연결 정의를 생성한다. 목차 1 개요 2 FireDAC 연결 정의란 무엇인가? 3 FDExplorer 유틸리티 사용하기 4 TFDConnection 디자인 타임 에디터 사용하기 5 연결 활성화하기 6 기타 참조 (See Also) 6.1 예제 1 개요 이 글에서 설명하는 내용: FireDAC 연결 정의 (Connection Definition)란 무엇인가? FireDAC 연결 정의를 사용하여 해당 DBMS 연결 파라미터를 명시할 수 있다. FDExplorer 유틸리티 사용하기: FDExplorer (파이어닥 익스플로러)를 사용하면, 시스템-전반에서 사용할 수 있는 연결 파라미터 세트(들)을 생성하여 중앙에 저장되는 파일 하나 안에 저장할 수 있다. TFDConnection 디자인 타임 에디터 사용하기: TFDConnection의 디자인 타임 에디터를 사용하면, 디자인-타임 즉 개발 화면에서 연결 파라미터(들)을 지정할 수 있다. 2 FireDAC 연결 정의란 무엇인가? FireDAC 컴포넌트(들)은 "연결 정의"라는 개념을 사용하여, (실행 할 때와 개발할 때 모두) FireDAC 드라이버 층에 필요로 하는 Server, Database, User_Name 등 모든 연결 파라미터(들)을 제공한다. "연결을 정의하기 (FireDAC)"에는 기술적인 내용 (예: 실행 중에 델파이 코드를 사용하여 연결 정의를 생성하는 방법)이 자세히 설명되어 있다. 개발 화면에서 FireDAC "연결 정의"를 명시하는 기본적인 방법은 두가지이다. 공유하는 중앙화된 영속 연결 정의를 생성하기 위해 FDExplorer를 사용하기 이렇게 생성한 연결 정의는 TFDConnection.ConnectionDefName에 할당할 수 있다. BDE를 알고 있는 고객이라면, FDExplorer가 BDE Administrator와 비슷한 도구라고 이해하면 된다. 임시 연결 정의를 생성하기 위해 개발 화면에서 TFDConnection의 디자인 타임 에디터를 사용하기 델파이 개발 화면에서 TFDConnection.Params 프로퍼티에 값을 할당한다. ADO를 알고 있는 고객이라면, connection string builder와 비슷하다고 이해하면 된다. 3 FDExplorer 유틸리티 사용하기 FDExplorer 유틸리티는 "중앙화된 영속 연결 (persistent connection) 정의"를 관리할 때 중심이 되는 도구이다. "FDExplorer"에는 이 도구 사용법이 보다 자세히 설명되어 있다. FDExplorer를 실행하려면, IDE에서 Tools > FireDAC > Explorer를 선택한다. 그리고 나서 키보드에서 Ctrl+N을 누르면 새 연결 정의 하나가 생성된다. DriverID 파라미터 값에는 사용할 드라이버를 명시한다. DriverID를 MSSQL로 지정하면, 해당 드라이버에 즉 MSSQL에 알맞은 파라미터(들)이 표시된다. 마이크로소프트 SQL 서버에 연결할 때 필요한 주요 파라미터는 다음과 같다. 파라미터 설명 Server 해당 SQL 서버를 식별할 수 있는 서버 실별자. 만약 호스트에 기본(default) 서버가 하나 밖에 없다면, 이 값은 호스트 주소이다. Database 기본(default) 데이터베이스의 이름 OSAuthent Yes로 지정되면, FireDAC은 윈도우 인증을 사용한다. (기본값인) No로 지정되면, MS SQL 서버 인증이 사용된다. User_Name 로그인 유저 네임, OSAuthent=No인 경우에 사용됨. Password 로그인 패스워드, OSAuthent=No인 경우에 사용됨. MetaDefSchema 기본(default) 스키마 이름. 만약 MetaDefSchema과 같은 이름이 오브젝트 이름에 있으면 개발 코드에서는 이 스키마 이름을 제외한다. 아래 그림은 FDExplorer에서 연결 정의를 지정하는 화면이다. Ctrl+A를 눌러서 해당 연결 정의를 FireDAC 연결 정의 파일에 저장한다. 새로 만들어진 연결 (위 그림에서는 "ConnectionDef1")을 테스트하려면, 트리뷰에서 해당 항목 (위 그림에서는 "ConnectionDef1") 옆에 있는 "+"를 클릭한다. 그러면 로그인 대화창이 표시된다. 로그인에 성공하면 트리뷰의 해당 항목이 확장되면서 연결된 데이터베이스의 오브젝트들을 찾아 갈 수 있게 된다. 알아둘 점: 델파이 IDE를 실행한 상태에서 그 안에서 FDExplorer를 열어서 "영속 연결" 정의를 새로 만든 경우에, 해당 연결은 FireDAC 개발 환경에서 바로 볼 수 없다. 영속 연결 정의 목록을 새로고침 해야 하는데, 그러려면, 델파이 IDE를 다시 시작해야 한다. 우리가 델파이 IDE 안에서 사용할 연결 정의가 준비되었다. 이제부터 이 연결 정의를 사용하려면, TFDConnection.ConnectionDefName 프로퍼티에 해당 연결 정의의 이름을 지정하기만 하면 된다. 4 TFDConnection 디자인 타임 에디터 사용하기 FireDAC의 TFDConnection 컴포넌트는 디자인-타임 에디터가 제공된다. 여기에서는 "임시 연결" 파라미터(들)을 관리할 수 있다. 개발 화면에 올려 둔 TFDConnection 컴포넌트 중 무엇이든 하나를 더블-클릭한다. 그러면 해당 커넥션 에디터 대화창이 표시된다. 이 커넥션 에디터에는 FDExplorer와 유사한 기능이 있다. 앞에서와 마찬가지로, 다음 사항들을 지정하는 것부터 시작해야 한다. Driver ID: 임시 연결 정의를 아예 새로 만든다 (이 글에서도 그렇게 할 것이다) Connection Definition Name: 이미 존재하는 "영속 연결"의 파라미터를 덮어쓰는 "임시 연결"을 하나 새로 만든다. 앞에서와 마찬가지로, 앞에서 지정했던 파라미터(들)을 채워넣어야 한다. 이 대화창에서 제공하는 기능은 다음과 같다. Test 버튼: 연결 정의를 테스트한다. Wizard 버튼: 해당 DBMS에 알맞은 연결 정의 마법사가 있다면 해당 마법사를 부른다. Revert to default 버튼: 파라미터(들)을 기본(default) 값으로 재설정한다. Help 버튼: 현재 드라이버의 파라미터를 설명하는 도움말 페이지로 간다 Info 버튼: 해당 DBMS에 연결을 시고하고 해당 연결에 대한 정보를 확보한다. SQL Script 페이지: 해당 연결에서 SQL 스크립트 명령을 실행할 수 있다. 커넥션 에디터에서 OK 버튼을 누르고 나면, 지정한 연결 파라미터(들)일 해당 TFDConnection.Params 프로퍼티 안에 적재되고, TFDConnection.DriverName 프로퍼티에도 에디터에서 선택한 값이 지정된다. 5 연결 활성화하기 "영속 연결 정의"의 이름을 TFDConnection.ConnectionDefName에 할당한 후, 또는 "임시 연결 정의" 파라미터(들)을 TFDConnection.Params에 채워 넣은 후에는, TFDConnection.Connected 프로퍼티를 True로 지정하라. 지정한 파라미터(들)이 모두 알맞다면, 연결이 구축된다. 6 기타 참조 (See Also) Overview (FireDAC) 모바일 튜토리얼: 모바일 애플리케이션 ()에서 FireDAC을 사용하기 6.1 예제 FireDAC Connection Definitions sample
  11. 리자토 페르난도 (Rizzato Fernando)의 "Using FireDAC Connection Pooling with RAD Server" 를 번역했습니다. (원문 작성: 2022년 7월 19일, 최종 번역: 2022년 7월 20일) 연결 풀링 (connection pooling)이란? 연결 풀 (connection pool)이란 데이터베이스 연결(들)을 모아두어서 데이터베이스에 대한 요청(request)이 발생하면 재사용될 수 있도록 하는 캐시(cache)이다. 연결 풀 (connection pool)은 데이터베이스에서 명령을 수행하도록 할 때 그 성능 향상시키는 목적으로 사용된다. 사용자들이 각자 데이터베이스 연결을 열고(open) 유지하는 것은, 특히 데이터-중심 애플리케이션인 경우, 비용이 크고 자원(resource)가 낭비된다. 연결 풀링인 환경에서는, 연결이 한번 생성되면, 연결 풀 안에 위치하고 다시 사용될 수 있으므로 새 연결을 반드시 다시 만들어야 할 필요가 없어진다. 개발자는 연결 풀 하나에서 생성할 수 있는 최대 연결 수량을 정의할 수 있으므로, 필요한 데이터베이스 라이선스의 수량을 줄일 수 있다는 점에서도 관심을 가질 만하다. 이런 환경에서는, 연결 풀이 한도에 도달한 상태에서 새 요청이 도착하면, 연결 풀 안에 있는 연결들 중에서 아무것도 풀려서 사용할 수 있게 되지 않은 채 사전에 지정된 제한 시간에 도달하는 경우 해당 요청은 처리되지 못한다. 데이터베이스 연결이 제한 적인 연결 풀링에서는 사용자 수와 애플리케이션 아키텍처를 기반으로 해당 연결 풀에게 가장 이상적인 최대 연결 갯수를 지정하는 것이 중요한 열쇠이다. FireDAC 연결 풀링 (connection pooling)의 작동 방식 FireDAC에서 연결 풀링 (connection pooling)이 작동하는 방식은 상당히 쉬워서, 사용하는 연결의 프로퍼티(property) 하나만 설정하면 작동한다 (Pooled=True). 물론, 연결 풀링은 멀티-쓰레드 애플리케이션에서 더욱 빛난다. 짧은 작업(task) 여러개가 (거의) 동시에 실행되고, 각 작업마다 데이터베이스 연결이 있어야 하기 때문이다. 연결 풀링 기능을 사용할 때는, 해당 연결이 이미 만들어져 있고, 자신을 사용할 작업을 기다리고 있기 때문에, 작업 수행 시간이 훨씬 더 빠르고 자원 소모는 더 적다. 조금 더 수준 높게 활용하려면, "Pooled" 파라미터 뿐만 아니라, 아래 3 가지 파라미터까지도 고려해 볼 수 있다. 파라미터 설명 예시 POOL_CleanupTimeout POOL_ExpireTimeout 시간이 넘도록 사용되지 않는 연결을 FireDAC이 제거할 때까지의 시간이다. 기본값은 30000 밀리초 (30초)이다. 3600000 POOL_ExpireTimeout 연결이 사용되지 않은 채 여기에 지정한 시간 (밀리초)을 넘기면 연결 풀에서 지워지고 파괴될 수 있다. 기본값은 90000 밀리초 (90초)이다. 600000 POOL_MaximumItems 연결 풀 안에 들어갈 최대 연결 수량. 지정된 최대 수량보다 애플리케이션이 더 많은 연결이 필요하게 되는 시점이 되면 예외(exception)이 발생된다. 기본값은 50이다. 100 FireDAC에서는 (FireDAC의 .ini 파일 안에 저장되는) "영속(Persistent)" 연결, (애플리케이션의 해당 메모리에서만 사용할 수 있는) "프라이빗(Private)" 연결, (저장되지 않고, 이름도 없어서 FDManager가 관리하지 않는) "임시(Temporary)" 연결이 있다. 연결을 정의하고 설정하는 방법은 (연결 풀을 사용하든 않하든) 아래 도움말에 자세히 설명되어 있다. [DocWiki 번역] 연결을 정의하기 (FireDAC) Multithreading (FireDAC) FireDAC 연결 풀링 (connection pooling)을 RAD 서버 (EMS)에서 사용하기 진정한 백엔드 애플리케이션이라면, RAD 서버도 마찬가지로, 애플리케이션이 커가면서 늘어날 호출을 처리할 수 있는 풀링(pooling) 작동 방식은 거의 필수이다. 지금 보여 줄 예제에서는 FDManager를 통해 연결을 정의하는 "프라이빗(Private) 연결을 사용한다. 물론, FireDAC의 .ini 파일에 정의된 연결 역시 재사용할 수 있다. 더 나아가 FDManager를 통해 해당 .ini 파일을 적재하고 여기에 연결 풀링 파라미터를 추가할 수도 있다. 이렇게 연결 풀링은 서버 애플리케이션에만 적용되도록 할 수 있는데, 데스크탑 애플리케이션에서는 그다지 쓸 일이 없기 때문이다. 이 데모 앱은 RAD Server Wizard (https://docwiki.embarcadero.com/RADStudio/en/Creating_a_RAD_Server_Package) 를 사용하여 만들었으며, 최근에 추가된 EMSDataSetResource(https://docwiki.embarcadero.com/RADStudio/en/Using_RAD_Server_Components 그리고 https://blogs.embarcadero.com/using-emsdatasetresource-component-with-rad-server/)를 사용했다. 하지만, 직접 정의한 RAD 서버의 엔트포인트에도 똑같이 적용된다. 꼭 알아야 할 중요한 점은 애플리케이션 인스턴스 하나에는 FDManager 인스턴스가 하나만 존재할 수 있다는 점이다. 따라서 FDManager의 인스턴스는 해당 EMS 리소스의 initialization 구역 안에서 생성되어야 한다. 데모 프로젝트를 대상으로 부하(stress) 테스트 이 비디오는 연결 풀링 작동 방식을 설명하고, 이어서 JMeter를 사용하여 100 사용자의 부하를 테스트한다. 비디오 보기: https://blogs.embarcadero.com/using-firedac-connection-pooling-with-rad-server/#Running_a_stress_test_with_our_demo_project 추가 팁, RAD 서버 애플리케이션이 여러 패키지로 구성된 경우에도 풀링 메커니즘을 사용할 수 있다. FDManager에 의해 연결 풀링 구성을 정의하도록는 RAD 서버 리소스를 하나 생성하고 배포 환경에서 이 리소스가 가장 첫 번째 리소스로 적재( load)되도록 하기만 하면 된다.
  12. 이 문서의 목적: 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단계. 실습에서 사용할 구버전 소스 파일을 복사하여 프로젝트 준비 2단계. 코드 자동 변환: reFind를 사용하여BDE 컴포넌트를 FireDAC으로 변환 3단계. FireDAC에서 사용할 데이터베이스 연결 정의 생성 4단계. FireDAC의 필수 컴포넌트 추가: DBMS에 맞는 드라이버와 Wait 커서 5단계. FireDAC.FDConnection에 연결 설정 6단계. 데이터베이스 타입 맵핑 변경 7단계. 불필요한 코드 제거: 파라독스 관련 코드 8단계. 인터베이스에 맞게 관련 코드 정비 9단계. 윈도우 11 스타일 적용 예상되는 오류와 처리 방법 [FireDAC][Comp][Clnt]-340. Driver ID is not defined. Set TFDConnection.DriverName or add DriverID to your connection definition The EditUpdateError method referenced by Parts.OnupdateError has an incompatible parameter list. Remove the reference? [dcc32 Fatal Error] EDOrders.pas(21): F2613 Unit 'DBLookup' not found. Project mastapp.exe raised exception class EIniFileException with message 'Unable to write to RPTSMITH.CON' [Break] Project mastapp.exe raised exception class EIBNativeException with message '[FireDAC][Phys][IB]Dynamic SQL ErrorSQL error code = -206Column unknownA.FULLNAME'. [FireDAC][Phys][IB] Unable to complete network request host "127.0.0.1/3050". Failed to establish a connection. 참고한 자료 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 인 경우임. 이 숫자는 버전에 따라 달라짐. 그림. RAD 스튜디오에서 reFind 용으로 제공하는 Sample 파일의 기본 경로와 해당 파일 원본을 손상시키지 않고, 한 곳에 작업할 모든 내용을 모아두기 위해 다음과 같이 한다. [진행 절차] 원하는 곳에 원하는 이름 (예: "My_FireDAC_2_BDE")으로 새 폴더를 만든다. 앞으로 모든 작업 파일은 이 새 폴더에 두기로 한다. 위에서 안내한 Sample 폴더 안에 있는 Demo 폴더와 FireDAC_Migrate_BDE.txt 파일을 복사하여, 방금 새로 만든 "My_FireDAC_2_BDE" 폴더 안에 붙여넣는다. 복사해 넣은 폴더와 파일의 이름을 바꾼다. 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 파일로 만들어서 명령을 실행하는 것이 더 편하고 간단하므로 이 방식으로 설명한다. [진행 절차] "My_FireDAC_2_BDE" 폴더 안에서 마우스 오른쪽 클릭 > 새로 만들기 > 텍스트 문서를 선택한다. "새 텍스트 문서.txt"가 만들어지면 파일 명을 "Run_FireDAC_Migrate_BDE.bat"로 변경한다. (주의! 파일 확장자도 .txt가 아니라 .bat가 되어야 한다 메모장을 열고, 방금 만든 "Run_FireDAC_Migrate_BDE.bat" 파일을 메모장으로 드래그 드롭하여 파일 내용을 연다 (아직은 아무 내용도 없다) 이 파일에 아래 내용을 넣고 저장한다. (내용을 이해하고 싶으면 reFind 설명을 참고) refind My_FireDAC_MastApp\*.pas My_FireDAC_MastApp\*.dfm /X:My_FireDAC_Migrate_BDE.txt pause 방금 만든 "Run_FireDAC_Migrate_BDE.bat" 파일을 더블 클릭하여 이 배치파일을 실행한다. 실행한 결과가 아래 그림과 같으면, 아무 키나 눌러서 명령창을 닫는다. 그림. Run_FireDAC_Migrate_BDE.bat 이 실행된 결과 화면 3단계. FireDAC에서 사용할 데이터베이스 연결 정의 생성 FireDAC에서 사용할 연결 정의를 생성해야 한다. 이 예제에서는 FDExplorer 유틸리티, 즉 'FireDAC Explorer'를 사용하기로 한다. [진행 절차] RAD 스튜디오에서 메인 메뉴 > Tools > FireDAC Explorer를 클릭한다. FireDAC Explorer 창에서 메인 메뉴 > File > New > Connection Definition Ctrl+C를 클릭한다. FireDAC Explorer 창의 왼쪽에 있는 Object Explorer 트리뷰에 "ConnectionDef1"이라는 새 연결 정의가 생기고, 타이핑하면 바로 이름을 바꿀 수 있도록 이름이 선택된 상태일 텐데, "MASTSQL"이라고 타이핑하여 이 연결 정의의 이름을 지정한다. 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 FireDAC Explorer 창에서 메인 메뉴 > Edit > Apply를 클릭하여 저장한다. RAD 스튜디오를 종료하고 다시 시작한다. (그래야 새로 만든 연결 정의가 반영된다) 그림. 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 컴포넌트를 찾아서 연결 정의를 타이핑하여 넣으라고 되어 있다. 원문의 안내 대로 진행해도 좋지만, 아래 방법이 보다 쉽고 정확하다. [진행 절차] RAD 스튜디오 오른쪽의 프로젝트 관리자에서 DataMod.pas를 더블 클릭하여 연다. (오류 처리 방법 보기) 코드 에디터가 열리고, 해당 소스 코드가 보이면, 화면을 폼 디자이너로 바꾼다 (코드 에디터에서 폼 디자이너로 화면을 바꾸는 방법: 코드 에디터 화면의 맨 아래 오른쪽에 있는 탭에 Code가 선택되어 있을 것이다. 그 옆에 있는 Design 탭을 선택 또는 단축키 F12 사용). 폼 디자이너에는 DataMod의 컴포넌트들이 보일 텐데, 2단계를 통해서 이미 FireDAC 컴포넌트로 변환된 것을 알 수 있다. 폼 디자이너에 있는 컴포넌트 중에 "Database" 컴포넌트 (이름이 Database인 FDConnection 컴포넌트)를 한번 클릭하여 선택한다. RAD 스튜디오 왼쪽의 오브젝트 인스펙터에서 ConnectionDefName 프로퍼티를 찾아서, 그 값에 앞의 3단계에서 만든 "MASTSQL" 연결 정의를 선택하여 지정한다. 폼 디자이너에서 "Database" 컴포넌트를 더블 클릭하여 FireDAC Connection Editor 창을 연다. FireDAC Connection Editor 창에서 Test 버튼을 클릭한다. 로그인 창이 나타나오 이미 3단계에서 지정해둔 연결 정보가 들어가 있을 것이다. OK를 클릭한다. ("Connection established successfully" 라는 메시지가 나오면 성공한 것이다. 만약 실패해서 에러 메시지가 표시된다면, password등이 잘못되었다는 오류가 나오면, 앞의 3단계로 돌아가서 연결 정의를 다시 정확히 만들어야 한다. 만약 연결이 거부 된다면, 인터베이스 서버가 동작하는 지를 확인해야 한다 (오류 처리 방법 보기) 6단계. 데이터베이스 타입 맵핑 변경 BDE와 FireDAC은 둘다 애플리케이션과 데이터베이스를 서로 연결해 주기 위해 그 사이에 위치하는 계층이다. 이 계층은 데이터베이스 테이블의 컬럼의 데이터 타입을 FireDAC BDE 또는 FireDAC 의 데이터베이스 클라이언트 드라이버에서 지정한 타입으로 가져오고 나서, 이것을 다시 애플리케이션에서 사용할 타입 전환한다. 이때 BDE와 FireDAC의 타입 맵핑이 조금 다르다. FireDAC의 타입 맵핑에 대한 도움말: [DocWiki 번역] 데이터 타입 맵핑 (FireDAC) 위 도움말에 의하면 오라클 데이터베이스의 NUMBER 타입을 FireDAC의 오라클 클라이언트 드라이버에서는 dtFmtBCD으로 취급한다는 것을 알 수 있다. 이와 달리 BDE에서는 오라클 데이터베이스의 NUMBER 타입을 dtInt32나 dtDouble로 취급한다. BDE에서는 DateTime 타입으로 취급하는 것을 FireDAC에서는 DateTimeStamp 타입으로 취급한다는 점도 다르다. 그런데, 이 예제의 기존 소스는 BDE를 사용했었기 때문에, 앞의 2단계에서 BDE 컴포넌트를 모두 FireDAC 컴포넌트로 변경하였다고 해도, 개발자가 작성한 코드는 BDE에서 다루는 데이터 타입에 맞춰져 있을 것이다. 예를 들어, 개발자가 영속 필드를 넣었다면, 이 필드들은 기존에 BDE에서 설정한 데이터 타입을 받도록 되어 있으므로, FireDAC과 BDE에서 서로 다르게 취급하는 데이터타입을 다룰 수 없다. 다행히 FireDAC에는 이런 문제를 유연하게 처리할 수 있도록 데이터 타입 맵핑 규칙을 개발자가 지정할 수 있도록 되어 있다. 우리는 이 단계에서, FireDAC의 유연한 데이터 맵핑을 이용하여, FireDAC의 인터베이스 클라이언트 드라이버에서 지정한 디펄트 데이터의 타입이 기존에 BDE에서 처리하던 타입으로 처리되도록 맵핑 규칙을 넣기로 한다. (참고! 이 맵핑 규칙을 넣지 않아도 된다. 하지만, 그 대신, 애플리케이션에서 기존의 BDE 데이터 타입을 다루게 되어 있는 것을 모두 찾아서 FireDAC 데이터 타입을 다루도록 바꿔야 한다. 예를 들면 모든 영속 필드를 찾아서 모두 지운 다음 다시 추가하여 FireDAC 타입을 다루는 필드가 되게 해야 한다. 따라서, 맵핑 규칙을 넣는 것이 훨씬 편하고 유연한 방법이다.) 이제 Docwiki 원문의 6단계에서 있는 절차를 진행할 텐데, 원문의 안내대로 코드 에디터를 열어서 변경해도 좋지만, 우리는 FireDAC Connection Editor를 사용하여 보다 쉽게 진행하겠다. [진행 절차] 폼 디자이너에서 "Database" 컴포넌트를 더블 클릭하여 FireDAC Connection Editor 창을 연다. FireDAC Connection Editor 창에서 Options 탭을 클릭한다. Options 탭 내용에서 Format Options 아래 Data Mapping Rules 아래에 있는 Ignore inherited rules를 체크한다. 그리드에서 아래 설정을 한다. SourceDataType = dtFmtBCD TargetDataType = dtInt32 PrecMin = 0 PrecMax = 10 ScaleMin = 0 ScaleMax=0 그리드 바로 아래에 있는 Add Rule을 클릭하고, 그리드에서 아래 설정을 한다. SourceDataType = dtFmtBCD TargetDataType = dtDouble 다시 한번 그리드 바로 아래에 있는 Add Rule을 클릭하고, 그리드에서 아래 설정을 한다. SourceDataType = dtDateTimeStamp TargetDataType = dtDateTime FireDAC Connection Editor 창이 아래 그림과 같이 잘 되었다면 OK를 클릭하여 저장한다. 그림, FireDAC의 데이터 타입 맵핑 설정 마지막으로, 폼 디자이너에서 "Database" 컴포넌트가 선택된 상태에서, RAD 스튜디오 왼쪽의 오브젝트 인스펙터에서 FormatOptions 프로퍼티를 확장하고 , 하위 프로퍼티인 StrTrim를 False로 지정한다. (이 프로퍼티의 값을 BDE의 기본값에 맞추기 위함) 7단계. 불필요한 코드 제거: 파라독스 관련 코드 FireDAC은 파라독스 또는 DBase 같은데스크탑 DB를 지원하지 않는다. 따라서 파라독스 데스크탑 DB 관련된 모든 코드를 애플리케이션에서 제거해야 한다. 이 애플리케이션에서 Local Data를 처리하는 코드를 모두 지우자 (또는 주석 처리 하자). (참고: 원하는 코드 블록을 선택하고 Ctrl+/ 단축키를 누르면 선택된 블록의 모든 줄이 주석처리 된다. 이미 주석인 상태였다면 다시 주석이 풀린다) [진행 절차] 프로젝트 관리자에서 DataMod.pas를 더블 클릭하고, 코드 에디터를 열어서 TMastData.UseLocalData 메서드 삭제 Interface 부분에서 선언 삭제 Implementation 부분에서 구현 삭제 프로젝트 관리자에서 Main.pas를 더블 클릭하고, 코드 에디터를 열어서 TMainForm.ViewLocalClick 핸들러 메서드 삭제 Interface 부분에서 선언 삭제 Implementation 부분에서 구현 삭제 단축키 F12를 눌러서, Main.pas를 연 코드 에디터를 폼 디자이너로 전환한 후 스트럭처 뷰에서 아래 그림과 같이 Mainform - MainMenu - View - Local Data를 선택한 후, 오른쪽 클릭 > Edit > Delete (또는 키보드 Delete 키)를 이용하여 메뉴에서 Local Data를 아예 제거한다. (주의! 경고도 없이 제거되고, 되돌리기 어려우므로, 스크럭처 뷰에서 삭제하려는 오브젝트가 정확히 선택되어 있는 지를 먼저 확인해야 한다) 8단계. 인터베이스에 맞게 관련 코드 정비 이제 데이터베이스를 코드에서도 연결할 때에도 새 인터베이스에 연결 할 수 있도록 코드를 변경한다. [진행 절차] 프로젝트 관리자에서 Main.pas를 더블 클릭하고, 코드 에디터를 열어서 TMainForm.ViewRemoteClick 메서드 변경 (Local Interbase)"라는 문자열을 찾아서 "(InterBase)"로 변경한다. 여전히 Main.pas가 코드 에디터를 열린 상태에서, TMainForm.ViewMenuClick 핸들러 메서드 삭제 Interface 부분에서 선언 삭제 Implementation 부분에서 구현 삭제 단축키 F12를 눌러서, Main.pas를 연 코드 에디터를 폼 디자이너로 전환한 후 스트럭처 뷰에서 아래 그림과 같이 Mainform - MainMenu - View를 선택한 후, 오브젝트 인스펙터에서 Events 탭을 선택하고 OnClick 이벤트에 연결된 "ViewMenuClick"을 지운다. (로컬 데이터와 원격 데이터를 구분하지 않으므로 더이상 필요없다) 프로젝트 관리자에서 DataMod.pas를 더블 클릭하고, 코드 에디터를 열어서 TMastData.DataDirectory 메서드 삭제 Interface 부분에서 선언 삭제 Implementation 부분에서 구현 삭제 여전히 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; DocWiki에서는 CustByLastInvQuery에 있는 SQL문에서 키워드인 DESCENDING을 DESC 로 변경하라고 되어 있지만, 지금은 DESCENDING 키워드도 작동하므로, 굳이 바꾸지 않아도 된다. DocWiki 원문에는 이 8단계까지만 설명되어 있다. 하지만, 실행하려고 하면 몇가지 오류가 생길 것이다. RAD 스튜디오에서 메인 메뉴 > Run > Run (또는 단축키 F9)를 사용하여 마이그레이션이 완료된 애플리케이션을 빌드하고 실행한다. 아마 컴파일이 실패하거나, 실행 중에 오류가 발생될 것이다. 이 실습 중에 이슈를 만나면 "예상되는 오류와 처리 방법"에 있는 설명을 참고하여 해소하자. 9단계. 윈도우 11 스타일 적용 사용자는 애플리케이션이 바깥으로 보이는 모습에 민감하게 반응하는 경향이 있다. 클릭 몇번으로 애플리케이션의 모습을 현대식 UI로 바꿀 수 있다면, 하지 않을 이유가 없다. 이제 최신 윈도우 11 다크 스타일을 적용하자. [진행 절차] RAD 스튜디오에서 메인 메뉴 > Project> Options를 클릭한다. Project Options 창에서 Application > Appearance를 선택하고 아래 그림과 같이 Custom Styles와 Default Style 모두 "Windows11 Modern Dark"를 선택한다. (만약 이 스타일이 없다면 겟잇 패키지 매니저를 이용하여 받고 나서 진행한다) RAD 스튜디오에서 메인 메뉴 > Run > Run (또는 단축키 F9)를 사용하여 마이그레이션이 완료된 애플리케이션을 빌드하고 실행한다. BDE와 파라독스를 사용하던 델파이 7으로 되어있든 애플리케이션이 이제 FireDAC과 인터베이스 그리고 델파이 11.0 알렉산드리아로 완전히 옮겨졌다. 예상되는 오류와 처리 방법 당연하지만, 프로젝트는 저마다 다르기 때문에 모두에게 적용되는 규칙 만으로 변환 할 수는 없다. 이 예제에서 발생되는 오류와 이것을 방지 또는 해소하는 방법을 적용하자. 마이그레이션 할 때 생기는 오류에 대응하는 경험을 할 수 있다. [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단계를 마치고 나면 해소된다. [진행 절차] 걱정하지 말자. 이 메시지 창이 더이상 나타나지 않을 때가지 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는 찾아/바꾸기 도구이므로 이런 한계가 있다) 이제 코드에서 이 부분을 수작업으로 수정하자. [진행 절차] 코드 에디터에서 DataMod.pas 파일을 열고 EditUpdateError 이벤드 핸들러 메소드의 파라미터를 아래와 같이 변경한다. [변경 전] (DataSet: TDataSet; E: EDatabaseError; UpdateKind: TFDUpdateRequest; var UpdateAction: TFDErrorAction); [변경 후] (DataSet: TDataSet; E: EFDException; ARow: TFDDatSRow; UpdateKind: TFDUpdateRequest; var UpdateAction: TFDErrorAction); Interface 부분에서 EditUpdateError 선언의 파라미터 부분을 변경 Implementation 부분에서 TMastData.EditUpdateError 구현의 파라미터 부분을 변경 (원한다면, 다시 변환할 때 자동 처리되도록) 변환 규칙 파일을 보강한다. (ARow: TFDDatSRow; 파라미터를 넣는 것은 조금 부담되지만, 적어도 EDatabaseError를 EFDException로 바꾸는 규칙을 넣을 수는 있다) 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을 제거하자. [진행 절차] 오류 메시지 창에서 OK를 클릭하면, 해당 오류가 있는 코드가 열린다. uses 절에 DBLookup에 빨간색 밑줄이 있을 것이다. DBLookup을 지운다. 다시 단축키 F9를 눌러 실행(Run) 한다. 그러면 DBLookup가 uses에서 사용되는 다른 파일이 열리고 마찬가지고 빨간색 밑줄이 보인다. 이 DBLookup 역시 지운다. (원한다면, 다시 변환할 때 자동 처리되도록) 변환 규칙 파일을 보강한다. 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" 파일의 위치를 쓰기가 허용되는 폴더로 변경한다. [진행 절차] 메시지 창에서 Break 버튼을 클릭하면, 이슈가 발생하는 코드가 표시된다 (아래 코드이다). RSCon.WriteInteger(MASTSQLSection, TypeKey, SQLTypeVal); 이 코드를 잘 보면 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 찾기를 하려고 해서 오류가 발생한다. 이 필드를 계산 필드로 지정하자. [진행 절차] 폼 디자이너에서 DataMod.pas를 열고, "Orders" 컴포넌트를 찾아서 (아마 가장 위 왼쪽에 있을 것이다) 더블 클릭한다. 필드 에디터에 목록이 표시되면, 맨 밑에 있는 "salesperson" 필드를 한번 클릭하여 선택한다. 오브젝트 인스펙터에서 Properties 탭을 선택하고, FieldKind 프로퍼티를 찾는다. 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로 현재 모두 정확하므로, 인터베이스 서버가 동작하고 있는 지를 확인하자. [진행 절차] 윈도우 버튼 (모니터 가장 아래줄의 가장 왼쪽 아이콘) > 시작 > 프로그램 > Embarcadero InterBase [버전] > InterBase Server Manager를 실행한다. InterBase Server Manager 창에서 인터베이스 서버가 Stopped 상태로 표시된다면, Start 버튼을 클릭하여 서버를 시작한다. 참고한 자료 [DocWiki 번역] BDE 애플리케이션 마이그레이션 따라하기 (FireDAC) https://community.embarcadero.com/blogs/entry/delphi-c-builder-bde-japan BDE 애플리케이션을 FireDAC으로 이전하는 방법에는 "BDE에서 FireDAC으로 이전" 관련 사항이 잘 정리되어 있다.
  13. 델파이 설치시에 함께 제공되는 reFind 커맨드라인 프로그램을 사용하여 DBExpress 컴포넌트를 FireDAC 컴포넌트로 자동 변환 하는 방법입니다. 영상에 사용한 샘플은 MySQL 데이터베이스를 사용 하였고 DBGrid에 테이블 데이터를 조회하는 간단한 샘플입니다. 데모영상 사용되는 컴포넌트 비교 DBExpress 사용 프로젝트 (reFind로 변환하기 전) FireDac 사용 프로젝트 (reFind로 변환한 후) 참고로 FireDAC 에서는 DBGrid 사용시 TDatasetPorvider 와 TClientDataSet 없이도 TDataSource 에서 TSQLTable 이나 TSQLQuery로 바로 연결이 가능하므로 TDatasetPorvider 와 TClientDataSet 를 사용하지 않아도 됩니다. reFind 사용법 문서 [따라하기] reFind 도구를 이용해 BDE 프로젝트를 FireDAC으로 마이그레이션 따라하기를 참고하세요. 위 동영상을 이해하는 데도 도움이 됩니다. reFind 사용법은 동일하며, 반영할 "규칙 파일"(BDE용과 DBExpress용 모두 RAD 스튜디오 설치 시 함께 제공됨)만 다릅니다.
  14. MDI Form 프로젝트를 BPL 패키지 방식으로 만들면 기존 DLL 방식 보다 간편하고 안정적인 MDI 프로젝트 생성이 가능해 집니다. 각 Child 폼들은 각각의 패키지 프로젝트로 구성 되어 빌드시 .bpl 타입의 독립 모듈이 생성 됩니다. 따라서 각각의 Form들을 별도의 프로젝트로 구축 할 수 있으므로 Form이 많은 대형 프로젝트에서 분업화 된 작업이 가능하며 메인 Form의 .EXE 사이즈도 적은 용량으로 유지 보수가 좀 더 편리 합니다. 물론 BPL은 델파이 내부에서만 사용되며 그래서 더욱 연동에 유리 합니다. 또한 각각의 Child Form들은 Main 폼에서 생성한 FireDAC 커넥션을 사용 할 수 있어 단일 커넥션으로 데이터베이스 접속이 가능 합니다. 데모 영상은 1부와 2부로 나뉘어져 있고 영상을 먼저 시청하고 아래 요약된 내용을 보시면 쉽게 이해 할 수 있습니다. 1부는 BPL MDI 프로젝트를 구축 하는 방법이고 2부는 작성된 MDI Form 에서 단일 커넥션으로 각각의 Child Form들이 데이터베이스에 접속 하는 방법을 소개 합니다. 샘플프로젝트는 즉시 실행 해 볼 수 있도록 편의상 SQLite를 사용 하였으므로 실무에서는 사용 가능한 RDB를 이용하면 됩니다. Part 1. BPL 로 MDI Project 만들기 1. 프로젝트 폴더 분류 - Output 폴더 생성 : Exe 및 BPL 위치로 사용 2. Main Form 프로젝트 생성 - FormStyle : MDIForm 설정 - 프로젝트 옵션 > Output Directory 지정 2. Child Form 프로젝트 생성 - 프로젝트 그룹에서 Add New Project > Package 선택 - bpl 프로젝트 Contains 우클릭 > Add New > VCL Form 으로 새폼 추가 - FormStyle : MDI Child 설정 - 프로젝트 옵션 > Package Output 폴더 지정 - 패키지 프로젝드 빌드 : 패키지 등록창에서 OK 선택. 3. 같은 방법으로 Child Form 프로젝트 1개 더 생성 4. Main Form 프로젝트 - Project Option > Packages > RunTime Packages > Link with RunTime Packages : TRUE 설정 - 프로젝트 정상 빌드 확인. 5. Main Form 프로젝트 화면 및 소스 작업 (상세내용 샘플 프로젝트 참조) - TMainMenu 로 Child 창을 열기 위한 풀다운 메뉴 생성 - 각 메뉴 클릭시 Child Form 호출 6. Child Form 프로젝트 화면 및 소스 작업 (상세내용 샘플 프로젝트 참조) - Initialization 와 finalization 추가 - Form OnClose 이벤트에 Form 메모리 제거 7. 실행 - Child Form 프로젝트 및 Main Form 프로젝트 각각 빌드 - 실행은 Main Form 프로젝트 (.Exe) - Child Form 프로젝트만 변경시 해당 bpl 프로젝트만 개별 빌드 하면 됨, 단 Main Form Exe는 재실행 Part 2. 각 Child Form에서 단일 Connection 으로 FIreDAC 사용하기 1. Main Form 프로젝트 - TFDConnection 으로 Database Connetion 설정 2. Child Form 프로젝트 - Main Form 프로젝트에서 설정한 TFDConnection 커넥션 지정 Ex) TFDQuery 의 Connection을 "MForm.FDConnection1: 으로 지정 (상세내용 샘플 프로젝트 참조) Part 1 데모영상 Part2 데모영상 프로젝트 샘플 소스 다운로드 MDI_Sample.zip
  15. Docwiki에 있는 "GUI Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) FireDAC 사용자 화면 즉 GUI 관련 질문과 답변을 정리한 목록이다. Q1: 오래 걸리는 쿼리가 실행되는 동안 "Application is busy" 대화창을 표시하는 방법은? A: FDQuery.ResourceOptions.CmdExecMode에 amCancelDialog를 지정하고, 폼 위에 TFDGUIxAsyncExecuteDialog 대화창을 올려둔 다음, 오래 걸리는 쿼리를 준비하고 실행하여 테스트하라. 쿼리가 실행되는 동안, FireDAC은 "Wait" 레이블이 보이고 "Cancel" 버튼이 들어 있는 대화창을 표시한다. 사용자가 "Cancel" 버튼을 누르면 해당 쿼리 실행이 취소된다. Q2: FDGUIxLoginDialog 대화창을 현지화 하는 방법은? A: 코드 작성을 아래와 같이 하라: with FDGUIxLoginDialog1.VisibleItems do begin Clear; Add('User_Name=<local phrase>'); Add('Password=<local phrase>'); end; 또한, FireDAC.Stan.ResStrs 유닛을 열고, "Dialog captions" 섹션을 찾아서 항목을 번역을 할 수도 있다. Q3: TFDGUIxErrorDialog 대화창을 사용하여 에러를 다루는 방법은? A: 폼(form) 또는 데이터 모듈(data module) 위에 TFDGUIxErrorDialog 컴포넌트를 놓아 두어라. 그러면, 처리되지 않은(unhandled) EFDDBEngineException 예외를 다룰 수 있도록 FireDAC 에러 대화창이 표시된다. 이렇게 하기 위해, FireDAC은 TApplication.OnException 이벤트를 낚아챈다(hook). Q4: SQL 모래시계(hourglass)를 완전히 꺼버리는 방법은? A: a) 애플리케이션에서 기다림 커서 (wait cursor)를 완전히 비활성화 하려면, TFDGUIxWaitCursor에서 Provider = 'Console'로 지정하여 사용하라. 'Console' 프로바이더는 기다림 커서 (wait cursor) 구현이 비어있어서 FireDAC에서 기다림 커서 (wait cursor)를 표시하지 않는다. 만약 마우스 커거사 여전히 바뀐다면, uses 절에 오직 FireDAC.ConsoleUI.Wait 유닛 만 있는지 그리고 FireDAC.VCLUI.Wait 와 FireDAC.FMXUI.Wait가 잘 빠져있는 지를 확인하라. 이 방식에서는 당신이 기다림 커서 (wait cursor)를 다시 활성화 할 수는 없다는 점을 유의하라. b) 기다림 커서 (wait cursor)를 비활성화 한 후에, 언젠가 다시 활성화 할 필요가 있다면 코드를 다음과 같이 작성하라: FDWaitCursor1.ScreenCursor := gcrNone; 또는 FDManager.ResourceOptions.SilentMode := True; c) 기다림 커서 (wait cursor)와 FireDAC 대화창을 비활성화 한 후에, 언젠가 다시 그것들을 활성화 할 필요가 있다면, FDManager.SilentMode 프로퍼티에 True를 지정하라. 그러면 기다림 커서 (wait cursor)와 FireDAC 대화창을 비활성화이 모두 비활성화 된다. 여기에 해당되는 창은: 에러 대화창 비동기 실행(Async execution) 대화창 로그인 대화창 스크립트 진행 대화창 ResourceOptions.SilentMode에 True를 지정하면 오직 기다림 커서 (wait cursor)만 비활성화 된다. Q5: 데이터셋(dataset)에 필터(filter)를 적용했는데, 그리드(grid)의 스크롤 바가 변하지 않고 그대로 이다. 왜 그런가? Q: FDDataSet에 연결되 그리드(grid)가 있는데 아래와 같이 레코드를 필터링했다: Grid.DataSource.Dataset.Filter := 'id_virtual_channel in (1, 2, 3)' 모든 것이 잘 되었지만, 그리드의 스크롤 바가 변하지 않고 그대로 있어서 마치 필터가 적용되지 않고 여전히 전체 행(row) 있는 것처럼 보인다. 상당히 좋지 않은데, 예를 들면 그리드에 있는 행(row)의 전체 갯수가 500개 이고, 필터링을 하여 3개만 보여주는데도 그리드의 스크롤 바는 여전히500개 일때와 동일하게 매우 작아서 아주 조금만 움직일 수 있다 (마치 필터링 후에도 여전히 결과는 500개이고 단지 화면에서 3개만 보여주고 있는 것처럼 느끼게 된다). 해결책이 있나? A: 코드 작성을 아래와 같이 하라: FDQuery1.FetchOptions.RecordCountMode := cmVisible; Q6: 데이터셋(dataset)을 새로고침(refresh)하고 나면, DBGrid에서 선택되어 있던 행 여러개가 모두 선택 해제되어 버린다. 선택을 유지하는 방법은? A: Refresh가 호출되고 나면 FireDAC 북마크(bookmark)가 무효화된다. Refresh를 호출하기 전에 선택된 레코드들의 PK 값을 저장해 두었다가 Locate 메소드를 사용하여 해당 레코드들을 다시 선택되도록 하라.
  16. Docwiki에 있는 "SQL Scripts Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) SQL 스크립트 실행 관련 질문과 답변을 정리한 목록이다. Q1: 쿼리 끝에서 세미콜론(;)을 사용하지 못하는 이유는? 쿼리에서 이것을 제거했더니 작동한다. A: ';'는 많은 SQL 스크립트 사투리에서 SQL 명령(command)의 구분자(delimiter)일 뿐이고, SQL 언어가 아니다. 몇몇 DBMS에서는 SQL 명령(command)의 끝에 ';'을 허용하고, 어떤 것들은 허용하지 않는다. 다시 말하자면, 그냥 ';'를 제거하라. Q2: 몇몇 DBMS (PG, Oracle, FB)에서는 SQL 구문을 오직 하나만 실행할 수 있다. 하지만, SQLite 에서는 구문 여러 개를 한번에 실행할 수 있다. 왜 그런가? A: 그렇게 설계되어 있기 때문이다 – ExecSQL 메소드는 SQL 명령을 있는 그대로 DBMS API에게 전달한다. 만약 DBMS에서 "묶음(batch)" 쿼리를 지원한다면, 실행이 될 것이고, 그렇지 않다면 실패할 것이다. TFDScript를 사용하면 SQL 명령(command) 여러 개를 담은 SQL 스크립트들을 실행하고 명령을 제어할 수 있다. Q3: 스크립트가 1개 이상 있는데도, ExecuteAll는 오직 첫번째 스크립트만 실행한다. A: 첫번째 스크립트가 "근본(root)" 스크립트이다. 다른 스크립트들 실행하려면, "근본(root)" 스크립트에서 명시적으로 호출해야 한다. 예를 들면: with FDScript1.SQLScripts do begin with Add do begin Name := 'root'; SQL.Add('@first'); // 명시적으로 '첫번째' 스크립트 호출 SQL.Add('@second'); // 명시적으로 '두번째' 스크립트 호출 end; with Add do begin Name := 'first'; SQL.Add('create table t1 ...;'); SQL.Add('create table t2 ...;'); end; with Add do begin Name := 'second'; SQL.Add('create procedure p1 ...;'); SQL.Add('create procedure p2 ...;'); end; end; ExecuteStep은 TFDScript.Position 지점으로 부터 그 다음 스크립트 명령을 실행한다. ExecuteAll은 스크립트 전체를 실행한다. ValidateAll / ValidateStep 메소드도 있다. 이 메소드들은 스크립트를 진행하지만, SQL 스크립트를 실행하지는 않는다. ValidateAll을 호출하면 TFDScript.TotalJobSize에 값을 할당(assign)한다. 따라서 그 다음에 ExecuteAll을 호출하면 TFDScript.TotalPct10Done을 올바르게 업데이트 한다. 이것은 진행된 스크립트 명령의 10%에 해당된다. Q4: (1) 각 SQL 구문마다 FDConnection.ExecSQL 실행하기 (2) FDScript.ExecuteAll 실행하기는 성능 상 차이가 있는가? : A: 이 2개의 메소드 뒤에서 SQL을 실행하는 코드는 동일하다. 둘 다 IFDPhysCommand.Execute 메소드를 사용한다. TFDScript 파서(parser, 구문 분석기)는 고도로 최적화되어 있다. 이 파서는 Oracle PL/SQL (여기에서는 명령문 안에 ';'이 들어 있을 수 있다) 등 DBMS 마다 제각각인 많은 SQL 사투리를 인식하며 정밀하고 유연하게 제어한다. 따라서, 당신이 FDConnection.ExecSQL에 한번에 하나의 명령(command)을 제출한다면, 이런 명령들을 별도의 스크립트 하나로 뽑아 내거나 할 필요가 없다. FireDAC이 알아서 가장 빠른 방식을 사용할 것이다. 만약 SQL 스크립트가 파일 하나 안에 들어 있다면 FDScript.ExecuteAll이 가장 빠른 방식이다. Q5: 스크립드 작업이 실패했을 때 롤백(ollback)하는 방법은? A: 1) Use FireDAC 트랜젝션 제어를 사용한다: FDConnection1.StartTransaction; try FDScript1.ExecuteAll; FDConnection1.Commit; except FDConnection1.Rollback; raise; end; 2) Oracle인 경우 PL/SQL 블록을 사용하고, 다른 DBMS라면 이와 유사한 구조를 사용한다: begin insert into u_btk.t_test values (1, sysdate); insert into u_btk.t_test values (2, sysdate); insert into u_btk.t_test values (1, sysdate); commit; exception when others then rollback; raise; end; 3) TFDScript.OnError를 사용한다: procedure TForm1.FDScript1Error(ASender: TObject; const AInitiator: IFDStanObject; var AException: Exception); begin FDConnection1.Rollback; end; Q6: 아래 스크립트를 FB(파이어버드)에서 실행하면, “Unexpected end of command line 3” 에러가 난다. 어떻게 고치나? EXECUTE BLOCK AS DECLARE VARIABLE MYVAR VARCHAR(250); BEGIN ... END; A: block(블록)을 가진 SQL 스트립트를 실행하려면, block(블록) 앞에서 명령 구분자(command separator)를 변경해야 한다. 원한다면 블록 처리 뒤부터 다시 원래대로 돌려놓을 수도 있다. 예를 들면; SET TERM #; EXECUTE BLOCK ... END; # SET TERM ;#
  17. Docwiki에 있는 "Metadata Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 메타데이터(metadata) 추출 관련 질문과 답변을 정리한 목록이다. Q1: 데이터베이스 안에 테이블(table)이 존재하는 지를 확인하는 방법은? A: 기본 방식 2가지가 있다: 1) try FDQuery1.Open('select * from tab where 0 = 1'); Result := True; except on E: EFDDBEngineException do if E.Kind = ekObjNotExists then Result := False else raise; end; 2) var oList: TStrings; begin oList := TStringList.Create; try FDConnection1.GetTableNames('', '', ATableName, oList, [osMy, osOther, osSystem], [tkTable, tkTempTable, tkLocalTable]); Result := oList.Count > 0; finally oList.Free; end; end; 첫번째가 보다 최적화된 방식이다. Q2: Oracle에서, TFDMetaInfoQuery를 사용하여 패키지 프로시저(package procedure)를 받아낼 수 있나? A: 오라클 패키지인 PACKAGE_NAME의 프로시저(procedure) 목록을 반환하는 코드는 아래와 같다: FDMetaInfoQuery1.BaseObjectName := 'PACKAGE_NAME'; FDMetaInfoQuery1.MetaInfoKind := mkProcs; FDMetaInfoQuery1.Open; Q3: TFDMetaInfoQuery를 사용하여 인덱스(index) 이름을 얻는 방법은? A: MY_TAB 테이블용 인덱스(index) 목록을 반환하는 코드는 아래와 같다: FDMetaInfoQuery1.ObjectName := 'MY_TAB'; FDMetaInfoQuery1.MetaInfoKind := mkIndexes; FDMetaInfoQuery1.Open; Q4: 쿼리 빌더(Query Builder), 디자인-타임 에디터, 메타데이터 추출 함수 등은 현재의 스키마(schema)에 속해 있는, 즉 스키마(schema)/카탈로그(catalog)에 해당 접두사가 달려있는 오브젝트 이름들을 반환한다. 제외하는 방법은? A: 2가지 옵션이 있다: TFDConnection.GetXxxxName을 호출할 때 AFullName에 False를 지정한다; FireDAC에는 연결 정의(connection definition) 일반 파라미터가 2개 있다 - MetaCurCatalog와 MetaCurSchema이다. DBMS에 따라, 둘 중 하나 또는 둘 다 지원된다 (자세한 내용은 FireDAC Database Connectivity 참고). 만약 명시된 MetaDefCatalog 카탈로그(catalog)/MetaDefSchema 스키마(schema)에 속해 있는 오브젝트라면 오브젝트 이름에서 이 스키마(schema)/카탈로그(catalog)의 이름이 제외된다. 따라서 MetaDefCatalog/MetaDefSchema에 당신의 개발 스키마(schema)/카탈로그(catalog)의 이름을 지정하라. 그러면 애플리케이션을 다른 스키마(schema)/카탈로그(catalog)로 배포할 수 있다. Q5: Oracle 저장 프로시저(stored procedure)를 public synonym을 이용하여 호출한다, 그러나 FireDAC이 항상 해당 저장 프로시저 이름에 스키마(schema) 이를을 덛붙인다. 피하는 방법은? A: FireDAC에는 연결 정의(connection definition) 일반 파라미터가 2개 있다 - MetaCurCatalog와 MetaCurSchema이다. DBMS에 따라, 둘 중 하나 또는 둘 다 지원된다 (자세한 내용은 FireDAC Database Connectivity 참고). 여기에 '*'를 지정하면 오브젝트의 전체 이름 중 대응되는 이름 부분을 사용하지 않도록 할 수 있다.
  18. Docwiki에 있는 "Integration with 3rd Party Products Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 써드 파티 제품 통합 관련 질문과 답변을 정리한 목록이다. Q1: 패스트리포트(FastReport) 애드-온(add-on)이 제공되는가? 공식적으로 지원되는가? A: FastReport에 문의하기 바란다. Q2: 단방향(Unidirectional) 쿼리와 DevExpress 그리드. Query.FetchOptions.Unidirectional = True로 설정했는데, TDataset(Query)이 단방향으로 지정되지 않는다(TDataset(Qurey).IsUnidirectional = False). DevExpress 그리드와 문제가 있기어서 그렇다. A: 이 문제가 발생하는 이유. TDataset(Query).IsUnidirectional에 True를 지정하면 TFDDataSet 기능이 깨진다. 지금 당장은, 올바른 해결책이 없고 추가 조사가 필요하다. DevEx 소스를 수정하여 이 이슈를 피하도록 변경하기를 권한다. 그렇게 하려면: ExpressDataController\Sources\cxDBData.pas 유닛을 연다: TcxDBDataProvider.IsUniDirectional 부분을 찾아서 아래 코드로와 같이 교체한다: function TcxDBDataProvider.IsUniDirectional: Boolean; begin if Assigned(DataSet) then begin {$IFDEF DELPHI6} if DataSet.IsUniDirectional then Result := True else {$ENDIF} if DataSet is TFDRdbmsDataSet then Result := TFDRdbmsDataSet(DataSet).FetchOptions.Unidirectional else Result := False; end else Result := False; end;
  19. Docwiki에 있는 "Editing Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 데이터 편집하기 관련 질문과 답변을 정리한 목록이다. Q1: "[FireDAC][DApt]-400. Update command updated [0] instead of [1] record"는 무슨 뜻인가? A: 이 에러는 FireDAC 안에 float / double / single / date / datetime / time 또는 기타 이와 같은 테이블(table) 필드(field)가 있을 때 종종 발생한다. 이런 필드들은 WHERE 절에서 정확도 손실(precision loss)의 영향을 받는다. 정확도 손실은 애플리케이션에서 파라미터에 값을 할 때 할 때 생길 수 있다. 그 결과, WHERE 절에서 레코드를 하나로 반환하지 못하게 된다. FireDAC이 WHERE 안에 이런 필드를 넣는 방식은 UpdateOptions.UpdateMode에 따라 정해진다. 때때로 이 오류는 upWhereKeyOnly 일때 나타난다. 당신이 upWhereKeyOnly를 명시했더라도, FireDAC에서 여전히 upWhereAll을 사용할 수도 있는데 PK 필드가 정의되지 않았을 때 그럴 수 있다. 다음과 같은 경우에 PK 필드가 정의되지 않게 된다: FetchOptions.Items에서 fiMeta가 빠져있을 때; 또는 a table in SQL 안에 들어 있는 테이블에 프라이머리 키(primary key)를 정의되어 있지 않았을 때; 또는 UpdateOptions.KeyFields가 비어있을 때; 또는 TField 중 어느 것에도 ProviderFlags 프로퍼티 안에 pfInKey가 들어있지 않을 때. 또 다른 이유가 있는데, (SQL Server, PostgreSQL)과 같은 몇몇 DBMS에서 테이블에 데이터를 변경하는 트리거(trigger)가 걸려 있을 때 발생할 수 있다. SQL 서버인 경우라면 트리거 코드 맨 위에 SET NOCOUNT ON를 넣어라. PostgreSQL 인 경우라면 UpdateOptions.CountUpdatedRecords에 False를 지정하라. Q2: TFDUpdateSQL는 언제 사용하는 것인가? A: SQL 명령(command) 원본이 단순 SELECT 명령이거나 또는 조인(join) SELECT 명령이지만 프라이머리 키(primary key) 필드를 유지할 때, FireDAC은 업데이트하는 SQL 명령(command)을 자동으로 만들어 낸다. 따라서, TFDUpdateSQL 사용은 필수가 아니라 선택이다. TFDUpdateSQL가 필요한 경우는 다음과 같다: SQL 명령(command) 원본이 SELECT 명령이 아닐 때 (예를 들면, 결과 세트를 반환하는 저장 프로시저인 경우). SQL 명령(command) 원본에서 프라이머리 키(primary key)를 유지하지 않을 때 (예를 들면, 여러 테이블을 조인하는데, DISTINCT 또는 GROUP BY 절이 들어있는 경우). 표준이 아닌 업데이트 SQL 명령을 애플리케이션에서 사용해야 할 때 (예를 들면, 애플리케이션에서 저장 프로시저를 사용하여 업데이트를 전송 즉 post 할 때). Q3: FDUpdateSQL 안에 있는 SQL에서 매크로(macro)를 사용하는 것이 가능한가? A: 아래 코드를 사용하라: FDUpdateSQL1.Commands[arInsert].MacroByName('MacroName').Value := 'value'; Q4: 캐시된 업데이트(CachedUpdates) 모드에서, 삽입되는 레코드들을 다신 전송(post)하도록 ApplyUpdates를 한번 넘게 호출해야 하는 이유는 무엇인가? A: ApplyUpdate를 호출한 후에, CommitUpdates를 호출해야 한다. CommitUpdates가 호출되고 나면, 모든 변경이 내부 캐시(internal cache)에서 제거된다. Q5: 마스터-디테일 관계에서, 마스터 TFDQuery가 스크롤(scroll) 또는 전송(post)된 후에도 디테일 TFDQuery가 새로고침(refresh)되지 않도록 하는 방법은? A: 2가지 방법이 있다: 마스터-디테일 관계를 당신이 원하는 데로 구현한다. 그러려면, TDataSource.OnDataChange 이벤트 핸들러를 추가해야 한다. 이것이 "표준" 방식이다. 중앙집중식 캐시된 업데이트(centralized cached updates)를 사용한다. Q6: 데이터셋의 레코드를 제거할 때 데이터베이스에서 이 레코드가 지워지지 않도록 하는 방법은? A: 당신은 내부 데이터셋 데이터 저장소에서 직접 작업할 수 있다. TFDDataSet.Table 프로퍼티를 사용하여 여기에 접근할 수 있다. 예를 들면, 인덱스 3을 가진 행(row)을 삭제(delete)하려면 아래와 같이 한다: FDQuery1.UpdateCursorPos; FDQuery1.GetRow.Free; FDQuery1.UpdateCursorPos; FDQuery1.Resync([]); 그리고 결국에는 CachedUpdates 모드를 사용할 수 있다. 데이터셋을 캐시된 업데이트(cached updates) 모드로 지정하라. 그리고 레코드를 삭제(delete)하고, CommitUpdates를 호출하라. Q7: FireDAC을 사용하여, ATable.UpdateToDataset(BTable , 'mykey', [mtufEdit, mtufAppend])를 생성하는 방법은? A: TFDDataSet.CopyDataSet 메소드를 아래 옵션들과 함께 사용하라: [coAppend] - ASource (에 있던 그대로) 에서 모든 레코드를 가져와서 덛붙인다(append); [coEdit] - 기존의 키 값(key value)을 가진 레코드 만 편집(edit)한다; [coAppend, coEdit] - 기존의 키 값(key value)을 가진 레코드를 편집(edit)하고, 기존에 키가 없는 레코드는 덛붙인다(append). Q8: ftGUID 필드에 값을 할당(assign)하는 방법은? A: 아래 코드를 사용하라: (AMemTable.FieldByName('Field1') as TGUIDField).AsGuid := aGUID; Q9: 데이터셋(dataset) 필드(field)에 기본 값(default value)을 지정하는 방법은? A: TField.DefaultExpression 프로퍼티에 표현식(expression)을 할당하라. Q10: TField.DefaultExpression 프로퍼티는 TField.CustomConstraint와 같은 방식으로 지원되나? 이 기본 표현식(default expression)에 적힌 내용은 필드의 기본 값(default value)의 효력과 같은가? A: 그렇다, 단, 필드가 만약 일반(normal) 결과 세트(result set) 필드일 때 그렇다. 만약 필드가 fkInternalCalc 이라면, then the result of the DefaultExpression의 결과는 필드(field) 값(value)으로 사용되고 다른 계산된 필드(calculated field)와 마찬가지로 업데이트 될 것이다. Q11: {fn DAYOFMONTH({fn CURDATE()})} 은 올바른 표현식(expression)인가? A: 아니다. 당신은 지금 FireDAC의 이스케이프 함수(escape function)를 사용하고 있다. 이것은 오직 SQL 명령(command) 안에서만 작동한다. 제약조건(constraint)이나 기본 값(default value)과 같은 표현식(expression) 안에서는 작동하지 않는다. 당신은 FireDAC의 표현식 평가기(expression evaluator)가 지원하는 함수(function)와 구문(syntax) 만을 사용해야 한다: DAYOFMONTH(CURDATE()) 또한, 이와 같은 함수(function)를 사용하려면, uADStanExprFuncs 유닛을 당신의 애플리케이션에 포함(include)해야 한다. Q12: 데이터셋(dataset)의 불리언(Boolean) 필드(field)에 기본 값(default value)을 명시하는 방법은? A: 데이터셋(dataset)의 필드(field)에 기본 값(default value)을 명시하려면 TField.DefaultExpression 프로퍼티에 표현식(expression)을 할당(assign)하라. 불리언(Boolean) 필드(field)에 기본 값(default value)을 할당하려면, False를 할당하고 싶으면 문자열 F, FA, FAL, FALS, FALSE 중 하나를 넣어라. True 인 경우에도 마찬가지 방법으로 할 수 있다. Q13: TField.CustomConstraint 할당(assign)하기가 작동하지 않는다. 뭐가 잘못되었나? Q: 제약조건(constraint) 추가하기를 다음 방식으로 했다: FDQuery.FieldByName('FIELD_NAME').CustomConstraint := 'FIELD_NAME > 1'; FDQuery.UpdateConstraints; FDQuery.Table.Constraints.Check(FDQuery.GetRow(), rsModified, ctAtEditEnd); 작동하지 않는다. 그리고 예외(exception)가 생기지도 않는다. A: 괜찮다 (아래에서 설명). Q: 그러나: FDQuery.Constraints.Add.CustomConstraint := 'FIELD_NAME > 1'; FDQuery.UpdateConstraints; FDQuery.Table.Constraints.Check(FDQuery.GetRow(), rsModified, ctAtEditEnd); 작동한다! 왜 그런가? A: 역시 괜찮다. Q: ctAtEditEnd와 ctAtColumnChange은 정확히 무슨 뜻인가? A: 이 열거형(enum)은 FireDAC이 제약조건(constraint)을 점검하는 시점을 명시한다: ctAtEditEnd - Post가 호출 될 때 ctAtColumnChange - 필드(field)의 값(value)이 변경될 때 아래 설명을 보자: FDQuery.FieldByName('FIELD_NAME').CustomConstraint := 'FIELD_NAME > 1'; 위 코드는 필드(field)-수준 제약조건을 추가한다. 이것은 오직 ctAtColumnChange 이벤트에서만 점검할 수 있다. FDQuery.Constraints.Add.CustomConstraint := 'FIELD_NAME > 1'; 위 코드는 레코드(record)-수준 제약조건을 추가한다. 이것은 오직 ctAtEditEnd 이벤트에서만 점검할 수 있다.
  20. Docwiki에 있는 "Sorting, Searching, Locating, Filtering Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 정렬, 검색, 위치 찾기, 필터링 관련 질문과 답변을 정리한 목록이다. Q1: 데이터셋(dataset) 정렬이 영어가 아닌 문자열(string)에서 정확하지 않다. "[FireDAC][DatS]-2. Object [] is not found" 에러가 발생한다. 뭐가 잘못되었나? A: 이 이슈를 교정하는 방법은 다음과 같다: $(BDS)\source\data\firedac\FireDAC.inc 파일을 연다; 아래 줄을 찾는다: {$define FireDAC_NOLOCALE_DATA} // 바이너리 데이터(data) 비교를 사용하도록 정의(define) {$define FireDAC_NOLOCALE_META} // 바이너리 메타데이터(metadata) 비교를 사용하도록 정의(define) 주석처리하여 작동하지 않도록 한다; 변경한 파일을 저장하고 애플리케이션을 다시 컴파일한다. 주의: 만약 당신의 애플리케이션에서 영어 (ASCII) 텍스트만 취급한다면, 위 줄이 주석처리되지 않도록 분명히 하라. 위 코드 줄은 정렬과 위치 찾기 동작 속도를 현격하게 높여준다 Q2: 데이터를 정렬하려면 인덱스(index)를 생성해야 하나? A: 인덱스(index)를 정의할 필요가 없다. IndexFieldNames가 그 역할을 한다. 인덱스(index)를 사용하면 뷰(view)를 정의하여 필터링과 정렬을 혼합할 수 있다. indexes와 IndexDefs는 모든 FireDAC 데이터셋에서 서로 배타적이다. 즉, 당신은 indexes와 IndexDefs 중 하나만 채워야 하고 둘 다 채우면 안된다. Q3: 룩업 필드(lookup field)를 인덱스(index) 정의에 사용해도 되나? A: 안된다, 룩업 필드를 사용할 수 없다. 하지만, 인덱스(index)에 내부에서 계산되는 필드(internal calculated field)를 사용할 수 있다. 그렇게 하려면 영속 필드(persistent field)를 추가하고, fkInternalCalc 필드를 추가한 다음 OnCalcFields 이벤트 핸들러를 만들고 그 안에서 이 필드를 계산하도록 하라. 예를 들면, procedure TForm21.FDTable1CalcFields(DataSet: TDataSet); begin DataSet.FieldByName('f_calc').AsString := FDMemTable2.Lookup('code', DataSet.FieldByName('f_code').AsInteger, 'name'); end; Q4: 계산되는 필드(calculated field)를 인덱스(index) 정의에 사용해도 되나? A: FireDAC 현재 버전에서는 FieldKind = fkCalculated 인 필드를 위치 찾기(Locate), 룩업(Lookup), IndexFieldNames 등등에서 사용할 수 없다. 해결 방법(workaround)은 fkInternalCalc 필드를 사용하는 것이다. Q5: 실행 중에 FindNearest 메소드를 호출하면, 활성화된(active) 인덱스가 없다는 내용으로 시작하는 에러 메시지가 나온다. A: 인덱스(index)를 활성화(active) 해야할 뿐만 아니라 그 인덱스를 선택해야만 한다. 그렇게 하려면: Indexes[i].Selected := True로 지정한다. 또는 FDTable1.IndexFieldName := <당신의 인덱스 이름>으로 지정한다. Q6: TADDataset 인덱싱을 하기 위해 서로 다른 character collation(문자 비교 규칙 세트)을 정의하는 방법 A: 대체로, 3가지 선택이 있다: TFDMemTable.Table.Locale에 LCID를 할당(assign)한다. FireDAC은 CompareStringA와 CompareStringW를 SORT_STRINGSORT 플래그와 함께 사용한다. collation(문자 비교 규칙 세트)는 기본 설정에서 "DBMS 독립적"이다. 즉, LOCALE_USER_DEFAULT이다. 자세한 내용은 Win API 도움말 참고. FireDAC.DatS.pas 소스 코드를 변경한다. TFDDatSRow.CompareData를 찾아서 당신 만의 비교 알고리즘을 구현한다. 표현식 평가기(expression evaluator)를 가지는 맞춤 함수를 등록한다. 등록하는 자세한 방법은 FireDAC.Stan.Expr.pas 을 참고한다. 그리고 나서 이 함수를 TFDMemTable.Indexes[..].Expression에서 사용한다. 예를 들면: Expression := 'MySort(Name)'. 앞으로, 맞춤 collation을 구현하려고 한다. 그러면 당신처럼 SQLite 드라이버를 사용하는 경우 도움이 될 것이다. Q7: COL1 descending(내림차순), COL2 ascending(올림차순) 처럼 데이터를 정렬하는 방법은? A: IndexFieldNames := 'col_1:D;col_2'; Q8: FDQuery.Locate를 MS-SQL 서버에서 사용하는데 "Function sequence error" 에러가 난다. 뭐가 잘못되었나? A: 명시적인 트랜젝션이 시작된 후에 FDQuery가 오픈(open)된 것으로 보인다. 그 후에 트랜젝션이 커밋(commit)되고, 다시 그 후에 FDQuery.Locate를 호출하였는데 FDQuery가 모든 레코드를 가져오지 않았고 그 대신 Locate 메소드에 의해 암묵적으로 FetchAll이 호출되었을 것이다. 이상이 이 에러가 SQL 서버에서 발생하는 이유이다. 피하는 방법은 다음과 같다: 해당 FDQuery에서는 FDQuery.FetchOptions.Mode = fmAll 로 지정한다; Commit을 호출하기 전에 이 FDQuery에서 FetchAll을 호출한다. SQL 서버는 Commit/Rollback을 한 후에는 오픈(open)된 커서(cursor)를 무효화 한다. Q9: 룩업(Lookup) 테이블을 구현하는 가장 좋은 방법은 무엇인가? 오픈(open)/로드(load) 가 느린걸로 봐서 룩업 테이블이 너무 큰것 같다. A: 클라이언트에서 모든 레코드가 필요한 것이 아니라면 이 구문을 사용하라. TFDQuery with SELECT ... WHERE .... Q10: 최상의 성능을 낼 수 있도록 하려면 룩업(Lookup) 필드를 어떻게 다루면 좋은 지 힌트를 줄 수 있나? A: TFDQuery.IndexFieldNames에 LookupKeyFields를 지정하라, 그러면 FireDAC은 클라이언트 인덱스를 사용하여 룩업 데이터셋(Lookup dataset) 안에서 레코드의 위치를 찾는다. 만약, 고유(unique) 키 값이 너무 높지 않다면, LookupCache에 True를 지정하라. Q11: DateTime 값으로 필터링을 하려는데 잘 안된다. 뭐가 잘못되었나? Q: Delphi 2007에서 FireDAC 2.0.11.895을 사용하여 Postgres 데이터베이스를 다루고 있다. DateTime 필드를 기분으로 필터링을 하려고 하는데, 아래와 같은 값을 전달하면 정확히 일치하는 것을 가져오지 못하는 것 같다: created_date = '8/10/2009 14:42:14' // 또는 심지어... created_date = '8/10/2009 14:42:14.247' // ... 밀리초(millisec)까지 일치해야 하는 상황 그래서 결국 아래와 같이 작성해야 했다: created_date >= '8/10/2009 14:42:14' AND created_date < '8/10/2009 14:42:15' // 또는 created_date >= '8/10/2009 14:42:14.000' AND created_date <= '8/10/2009 14:42:14.999' A: 이 문제는 DBMS 또는 DBMS API 에서 시간 값을 반올림하기 때문일 것이다. 프로그래머는 소숫점 이하에 .247를 기대하지만, 이 값이 .246 이거나 다른 값일 수있다. 이것은 FireDAC이 실패한 것이 아니라 DBMS가 어떻게 작동하느냐에 따라 결정되는 것이다. 당신은 시간 값을 초단위로 반올림하고 그 값을 소숫점 이하가 없는 상수(constant) 값과 비교할 수 있다: uses FireDAC.Stan.ExprFuncs; ... FDQuery1.Filter = 'TimeStampDiff(''second'', created_date, convert(''timestamp'', ''8/10/2009 14:42:14'')) = 0';
  21. Docwiki에 있는 "Fetching and Populating Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 레코드(record) 가져오기 및 데이터셋(dataset) 채우기 관련 질문과 답변을 정리한 목록이다. Q1: FireDAC에서 결과 데이터셋(dataset)에 앞으로 이동-전용(forward-only), 읽기-전용(read-only)을 통한 빠른 접근을 할 수 있는가? A: FDQuery.FetchOptions를 설정하라: CursorKind = ckDefault 또는 ckForwardOnly Mode = fmOnDemand RowsetSize = 1000 Unidirectional = True 원한다면, fiMeta를 Items 에서 빼낸다. 단, 당신이 데이터셋(dataset)을 편집할 필요가 없을 때만. Q2: FDQuery 하나 또는 FDMemTable 하나에 결과 세트(result set) 여러개를 붙여 넣는 방법은? A: 클라이언트 데이터셋(client dataset)을 사용하려 결과 세트 여러 개를 유지하는 방법이 있다: begin loop // 새 params를 사용하는 SqlQuery를 실행한다 ... ClientDataset.AppendData(SqlQuery.Data) ... end loop 아마 단일 TFDQuery로 교체할 수도 있다. 예를 들면: // 최초로 열기(open)와 가져오기(fetch) FDQuery1.Params[0].AsInteger := 1; FDQuery1.Open; // 명령(command)을 다시 실행, 행(row)을 다시 가져온 후 기존 행(row) 뒤에 덛붙이기 FDQuery1.Command.Close; FDQuery1.Params[0].AsInteger := 2; FDQuery1.Command.Open; FDQuery1.FetchAgain; FDQuery1.FetchAll; // 다른 파라미터 값을 사용하여 계속해서 명령(command)을 다시 실행 FDQuery1.Command.Close; FDQuery1.Params[0].AsInteger := 3; FDQuery1.Command.Open; FDQuery1.FetchAgain; FDQuery1.FetchAll; Q3: 쿼리 하나를 실행하여 가져온 결과 세트를 기존 데이터셋에 덛붙일 때 가져온 레코드를을 삽입하지 않고 수행할 수 있는 방법은? A: TFDDataSet.FetchAgain 메소드의 설명을 참고하라. 그 외에도 대안으로, SQL 명령(command)을 실행하여 추가 레코드를 가져와서 기존 데이터셋에 담아 넣을 수 있다.: FDCommand1.CommandText := 'select ... from ... where id= :id'; FDCommand1.Open; FDCommand1.Fetch(ADQuery1.Table); FDCommand1.Close; Q4: 내 쿼리는 레코드를 800개 반환하는데, RecordCount는 50을 반환한다. 뭐가 잘못되었나? A: 기본 설정에서는, RecordCount는 데이터셋(dataset)의 레코드 캐시(cache)에 있는 레코드 갯수를 보여준다. 레코드 카운팅 모드에 대한 더 자세한 내용은 FetchOptions.RecordCountMode 프로퍼티를 참고하라. 50은 기본 설정된 rowset의 크기이다. 이 숫자는 FireDAC이 한번 요청할 때 가져오는 갯수이다. 따라서 오픈(open)을 한 직후에, 데이터셋의 레코드는 the dataset <= 50 이다. 그 숫자를 RecordCount에서 제공한다. 데이터셋(dataset) 안에 있는 레코드 사이를 옮겨 다닐 때, FireDAC은 추가로 rowset을 더 가져오게 되고 그 결과 레코드 갯수가 증가하게 된다. 쿼리가 반환하는 레코드 총 갯수를 제시하려면, 다음 중 하나를 수행하라: ADQuery1.FetchAll을 수행한다. 그 결과, 모든 데이터를 가져오게 되고, RecordCount는 전체 갯수를 제시한다; FetchOptions.RecordCountMode를 cmTotal로 지정한다. 주의 할 점은 이 경우 성능 저하를 유발할 수 있다. 그 이유는 각 SELECT 쿼리 마다 FireDAC이 추가로 SELECT COUNT(*) 쿼리를 실행하기 때문이다.
  22. Docwiki에 있는 "TFDTable Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) TFDTable 관련 질문과 답변을 정리한 목록이다. Q1: TFDTable 안에서 이동할 때 '[FireDAC][DatS]-15. Duplicate row found on unique index' 에러가 난다. 이 에러의 의미는? A: 이 경우 대부분은, 데이터베이스의 정렬 순서와 클라이언트에서의 정렬 순서가 서로 다르다는 것을 의미한다. 이 경우 끝나지 않는 무한 루프(loop) 또는 [FireDAC][DatS]-15 에러를 유발한다. 이 이슈를 해소하려면, FormatOptions.SortLocale와 SortOptions 프로퍼티를 설정하여 클라이언트 쪽의 정렬 순서가 데이터베이스의 정렬 순서와 일치하도록 만들어라. Q2: When navigating through TFDTable 안에 있는 레코드 사이를 옮겨 다닐 때, 애플리케이션이 교착(hang) 상태에 빠진다. 뭐가 잘못되었나? A: 위 Q1의 답변 참고
  23. Docwiki에 있는 "TFDQuery, TFDStoredProc and TFDUpdateSQL Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) TFDQuery, TFDStoredProc, TFDUpdateSQL 관련 질문과 답변을 정리한 목록이다. Q: TFDQuery를 사용하여, 데이터셋 프로바이더에 연결하고 엠바카데로 클라이언트 데이터셋 안에 있는 데이터를 꺼내올 수 있나? A: TFDQuery에는 TFDMemTable과 TFDTableAdapter와 TFDCommand 몇 가지가 혼합되어 있다. 따라서 TFDQuery 안에는 SQL 명령(command) 실행, 파라미터 데이터 전달, 결과 세트(result set)를 받아서 저장, 결과 세트 안을 이동, 데이터 변경을 데이터베이스로 다시 전송(post) 등을 수행할 때 필요한 모든 것이 들어있다. TFDQuery + DSP(데이터셋 프로바이터) + CDS(클라이언트 데이터셋)을 함께 사용할 이유가 없다. TFDQuery를 쓰지 않고 대신에 TFDMemTable, TFDTableAdapter, TFDCommand 각각을 직접 따로 사용할 수도 있다. 그러면 더 유연하겠지만, 코딩은 더 많이 해야한다. 예를 들어 데이터셋들 전반에 걸쳐있는 동기화되는 캐시된 업데이트 상황를 생각해보라. 다시 말해, TFDQuery는 데이터 애플리케이션 프로그래밍을 매일 하는 개발자를 위해 최적화된 일종의 "지름길"이다. Q: 수작업으로 명시한 파라미터를 FDStoredProc에서 강제로 사용하도록 하려면 어떻게 하면 되나? A: FetchOptions.Items 프로퍼티에서 fiMeta를 빼라. 파라미터를 수작업으로 생성하려면, FetchOptions.Items 프로퍼티에 fiMeta가 없도록 빼는 것이 옳다. 이 옵션이 들어있으면, FireDA은 저장 프로시저(stored procedure)의 파라미터 정의를 데이터베이스에서 가져와서 Params 컬렉션 안에 넣을 것이다. 파라미터를 수작업으로 정의하기가 어렵다면, Params 컬렉션을 자동으로 채우면(populate) 파라미터들이 어떻게 정의되는 지를 볼 수 있다. 그리고 나서, 당신의 코드와 비교해보라. Q: '[FireDAC][Phys]-308. Cannot open / define command, which does not return result sets'와 '[FireDAC][Phys]-310. Cannot execute command returning results set' 예외는 어떤 의미인가? A: '[FireDAC][Phys]-308. Cannot open / define command, which does not return result sets' 예외는 결과 세트를 반환하지 "않는" SQL 명령(command)의 Open 메소드를 실행할 때 발생한다. 이 예외(exception)가 발생되는 시점은 해당 SQL 명령이 실행했는데 DBMS에서 결과 세트(result set)를 전혀 반환하지 않을 때이다. '[FireDAC][Phys]-310. Cannot execute command returning results set' exception 예외는 결과 세트를 "반환하는" SQL 명령(command)의 ExecSQL 메소드를 실행할 때 발생한다. 명령(command)이 결과 세트를 반환하는 지 아닌 지는 FireDAC의 SQL 명령(command) 전처리기에 의해서 결정된다. 만약 명령이 SELECT 또는 이와 같은 형식으로 인식된다면 결과 세트를 반환한다; 그렇지 않으면 반환하지 않는다. 이 예외(exception)가 발생되는 시점은 해당 SQL 명령이 실행했는데 DBMS에서 결과 세트(result set)를 전혀 반환하지 않을 때이다. 경우에 따라 FireDAC가 SQL 명령의 결과 집합 반환 여부 인식하지 못할 수 있다. 그리고 때때로 애드 혹(ad hoc) 애플리케이션은 반환하는 결과 집합의 수에 의존하지 않고 SQL 명령을 실행해야 한다. 그렇다면 이러한 경우에는 어떻게 해야 할까? 두 가지 기본 해결책이 있다. 1) FDQuery1.OpenOrExecute; 이 방식은 [FireDAC][Phys]-308 예외가 발생될 수 있지만, 그 예외가 OpenOrExecute 밖으로 전파되지는 않는다. 그리고 SQL 명령(command)은 잘 실행된다. 또한, 해당 명령이 결과 세트(result set)를 반환한다면 이 메소드는 True를 반환하여 알려준다. 2) FDQuery1.Command.CommandKind := skInsert; FDQuery1.ExecSQL; FireDAC에게 (INSERT 등등) 결과 세트를 반환하지 않는 명령(command) 유형을 지정하기만 하면 된다. Q: FDQuery.Execute(FDQuery.Params.ArraySize)를 호출하면 'Out of memory' 예외가 발생한다. ArraySize는 90,000이다. 뭐가 잘못되었나? A: 1) 90,000은 어떤 DBMS에도 너무 과도하다. 그 이유는 데이터가 몇번에 걸쳐 캐시(cache)되어야 하기 때문이다 (파라미터, DBMS API 버퍼, 네트워크 패킷 버퍼, 등등). 또한, 아마도 레코드 하나하나의 크기도 상당할 것이다. 또한 애플리케이션은 아마 DBMS API 한도 (예: 허용하는 최대 Array 크기, Oracle에서는 $7FFF까지만 허용하고, 다른 DBMS에서는 네트워크 패킷 크기 등에 따라 다르다)에 당면하게 될 수도 있다. 2) 90,000을 쪼개서 각 덩어리 당 500-5000 항목을 담도록 하라. AD03-ArrayDML 데모를 참고하라. 대개, 덩어리 크기 한도까지 array를 채우고 나서 Execute를 실행할 때 그 덩어리 크기(chunk size)를 전달한다. 그리고 나서 다시 채우기와 Execute를 반복한다. Firebird 데이터베이스에서, 나는 ArraySize = 1,000,000 (60 초)를 사용했었는데 문제가 없었다. 실험을 통해 얻어진 공식이 있어서 array 하나의 최대 크기를 결정할 수 있다. FireDAC은 자동으로 큰 array 하나를 작은 덩어리도 쪼갠다. 이와 유사한 값을 Oracle에서 찾기는 간단하지 않다. Oracle이 최대 $7FFF까지 지원하지만, 대용량 array에서는 여전히 AV 또는 기타 이슈에 부딪힐 수 있다. 어쨌든, 레코드 하나의 크기가 과도하게 크면, Execute를 호출하기도 전에 메모리가 소진될 수 있다. Q: FDQuery가 레코드를 "모두" 가져왔는 지를 어떻게 알 수 있나? A: SourceEOF 프로퍼티를 확인하라. Q: 나는 (단순 SQL 문을 통해) 레코드 하나를 삽입(insert)하고 새로 추가된 레코드의 IDENTITY / SEQUENCE 를 받고 싶다. 가장 효율적이고 여러 데이터베이스에서도 사용할 수 있는 방법은 무엇인가 A: 1) TFDConnection에는 GetLastAutoGenValue 메소드가 있다. DBMS에 따라 다르지만, 이 메소드는 가장 세션 하나 안에서 마지막에 자동-생성된 값을 반환한다. 예를 들면 Oracle에서는: SELECT <AName>.CURRVAL FROM dual MySQL에서는, SQL 쿼리를 사용하지 않고 MYSQL API를 접근하여 값을 받아온다. 또한, DBMS에서 sequences/generator를 지원하지 않는다면, AName 파라미터 값은 그저 무시된다. 2) 레코드를 IMSERT하고 자동-생성된 값을 받아오는 SQL 명령문을 작성하는 공통된 일반적인 방식은 없다. 예를 들면 Oracle에서는: INSERT ... INTO ... RETURNING ID INTO :ID PostgreSQL에서는, 명령(command) 두개를 나누어 실행한다: INSERT ... INTO .. SELECT CURRVAL(...) 당신이 TDataSet Insert/Post 메소드를 사용하여 데이터베이스에 INSERT를 하나 전송(post)하면, FireDAC은 DBMS kind를 보고 효율적이고 적절한 SQL 명령(command)을 생성한다. Q: 사용자가 amCancelDialog 모드에서 쿼리 실행을 취소한 후에 해당 트랜젝션을 롤백(rollback)하는 방법은? A: 2가지 선택이 있다: 1) FDTransaction1.StartTransaction; try FDQuery1.ExecSQL; FDTransaction1.Commit; except on E: EAbort do // 사용자가 해당 명령(command) 실행을 취소했다 ADTransaction1.Rollback; end; 2) TFDQuery.OnError 이벤트 핸들러를 생성하라. 명령 실행이 취소되면, 이 이벤트 핸들러가 호출되는데 이때 AException 파라미터를 이용하여 조건을 확인하여 맞춤 처리를 할 수 있다: EFDDBEngineException(AException).Kind = ekCmdAborted; Q: 내 쿼리 문장에 '&', '!' 문자가 있어서 올바로 실행되지 못한다. 뭐가 잘못되었나? A: 예를 들면, 다음과 같은 쿼리는 기본 옵션인 경우 실패하게 된다: FDQuery1.SQL.Text := 'select * from xy where Fieldname = ''xxx&n'''; FDQuery1.open; DBMS가 받는 SQL 명령에는 '&n'가 빠져있게 된다. 그 이유는 '&'는 매크로 변수의 시작점을 표시하기 때문이다. 기본 설정에서는, 모든 값에는 빈 값이 들어있다. 따라서 '&n'는 빈 문자열(string)로 교체된다. 만약 당신이 매크로를 사용하지 않는다면 ResourceOptions.MacroCreate와 ResourceOptions.MacroExpand를 False로 지정하라. Q: 저장프로시저(stored procedure) 파라미터에 접근할 때 'Parameter Xxx not found' 에러가 났다. 뭐가 잘못되었나? A: 예를 들면, 코드가 다음과 같다면: FDStoredProc1.StoredProcName := 'TestProc'; FDStoredProc1.Prepare; FDStoredProc1.ParamByName('Par').AsInteger := 100; 그 에러는 여러가지 다른 이유들 때문에 발생할 수 있다: 데이터베이스에 "TestProc" 저장프로시저가 없다. 해당 데이터베이스에서 이 저장 프로시저를 만들어야 한다.; DBMS따라 다르지만, "TestProc"가 유효하지 않은 상태일 수 있다. 이 저장프로시저는 반드시 유효한 상태이어야만 한다.; DBMS따라 다르지만, 이 저장프로시저의 이름에 대소문자가 섞여있다. 그대로 인용해야 한다; FetchOptions.Items 프로퍼티에서 fiMeta가 빠져있다; fiMeta가 반드시 들어있거나 또는 수작업으로 파라미터가 생성되어 있어야 한다.; 이 저장프로시저(stored procedure)에 Par라는 파라미터가 없다; 파라미터 이름을 정확하게 맞게 수정하거나 또는 데이터베이스에 Par 파라미터가 추가되어야 한다; DBMS따라 다르지만, 파라미터 이름 앞에 접두사 '@'가 있을 수도 있거나 또는 ResourceOptions.UnifyParamsset를 True로 지정할 수 있다.
  24. Docwiki에 있는 "TFDManager and TFDConnection Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) TFDManager와 TFDConnection 질문과 답변을 정리한 목록이다. Q: 나는 TFDManager가 있는 기반 데이터 모듈(base data module) 클래스가 있다. 자손(descendant) 클래스를 만들려고 하는데, 'Application must have only one FDManager' 에러가 발생한다. 뭐가 잘못되었나? A: 애플리케이션 안에 FDManager은 오직 하나만 있을 수 있다. 당신의 클래스 안에서 명시적으로 FDManager를 생성하지 말고, 싱글톤(singleton) 오브젝트로 참조하여 FDManager의 함수를 사용하라. Q: 내 프로젝트 그룹(project group) 안에는 델파이 프로젝트들(애플리케이션들)이 여러개 들어있다. 각 프로젝트 별로 저마다 데이터모듈(DataModule)과 FDManager가 있다.이 데이터모듈을 (복사하거나 비교하기 위해) 하나 이상 같이 열려고 하면, 애플리케이션에서는 FDManager를 오직 하나만 가질 수 있다는 에러가 발생하고 바로 데이터 모듈 하나가 제거된다. A: TFDManager가 정말 필요한가? 애플리케이션에서 TFDManager를 명시적으로 생성할 필요는 없다. TFDManager는 옵션과 구성 파일(configuration file)을 디자인-타임 즉 개발화면에서 설정하기 위해 필요한 것이다. Q: 내 FDManager들이 자꾸 사라져서 새로 만들어야 한다. 고칠 방법이 있나? A: 고칠 방법이 없다. 그이유는 TFDManager는 디자인-타임(개발 중)이나 런-타임(실행 중)에 오직 하나만 생성되기 때문이다. 만약 TFDManager가 여러개 있으면, FireDAC은 어느 TFDManager의 설정을 따라야 할 지를 알 수 없게 된다. 맨 위의 질문을 참고 Q: FireDAC은 연결 풀링(connection pooling)을 지원하나? A: 그렇다. FireDAC은 연결 풀링을 지원한다. 대개 연결 풀링이란 열려있는(open) "물리적" 연결들을 풀(pool)에 모아두고, TFDConnection.Connected가 True로 지정되면 FireDAC은 그 풀(pool) 안에서 "물리적" 연결 하나를 가져다 쓴다. TFDConnection.Connected가 False로 지정되면, 그 "물리적" 연결은 닫힘(close)이 되고, 풀(pool) 안으로 돌아간다. FireDAC에서 연결 풀링을 사용하려면, 연결 정의(connection definition)에서 Pooled=True를 추가하기만 하면 된다. 다른 조치는 필요없다. "멀티쓰레딩(Multithreading)"에 보다 자세히 설명되어 있다. Q: 연결 에디터(Connection Editor) 창은 FDPhysFBDriverLink1.VendorLib을 무시하는 것 같고 하드-코딩된 드라이버를 사용한다. A: 해당 드라이버를 사용하도록 VendorLib을 지정하기는 첫 연결을 하기 전에 해야 한다. 연결이 설정된(established) 다음에, 해당 DBMS 클라이언트가 로드된다. 디자인-타임에, TFDPhysXXXDriverLink의 프로퍼티들이 사용되도록 분명히 하려면, 데이터 모듈(data module) / 폼(form)을 생성하는 순서 상 TFDPhysXXXDriverLink가 가장 먼저인지를 확인하라. 그리고 원한다면 델파이 IDE를 다시 시작하라. 런-타임에, 해당 드라이버 링크의 Release 메소드를 사용하라. FDConnection1.Close; ... FDConnectionN.Close; FDPhysFBDriverLink.VendorLib := 'c:\fbclient.dll'; FDPhysFBDriverLink.Release; FDConnection1.Open; ... FDConnectionN.Open; 또한, 가상 드라이버(virtual driver)를 정의하는 방법도 있다. 자세한 내용은 "드라이버 구성하기(Configuring Drivers)"를 참고하라. 예를 들면, [FB_Embedded] BaseDriverID=FB VendorLib = C:\fb\fbembed.dll 디자인-타임에 DriverID로 FB_Embedded 드라이버를 사용한다. 런-타임에는 FDDrivers.ini를 사용하거나 또는 TFDPhysXXXDriverLink를 구성하라.
  25. Docwiki에 있는 "First Steps to Use FireDAC"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: 시작하기 (FireDAC) 목차 1 도입 (Introduction) 2 데이터베이스에 연결을 설정하기 (Establishing the Connection to the Database) 3 데이터베이스에서 행을 선택하여 가져오기 (Selecting Rows from the Database) 4 애플리케이션이 실행되도록 준비하기 (Preparing the Application for Run Time) 5 요약 (Summary) 6 기타 자료 (See Also) 1 도입 (Introduction) 이 튜토리얼에는 크게 세가지 영역이 있다: 데이터베이스에 연결 설정하기: 델파이를 사용하여 데이터베이스에 연결되는 애플리케이션을 만드는 방법 데이터베이스에서 행을 선택하여 가져오기: 개발 화면에서 데이터를 가져와서 그리드(grid)에 표현하기 애플리케이션이 실행되도록 준비하기: 데이터베이스 애플리케이션을 표준 실행 파일로 만들어 실행하기 위해 필요한 절차 사용된 화면은 RAD 스튜디오 2007이다, 따라서 RAD 스튜디오 최신 버전에서는 조금 다를 수도 있다. 2 데이터베이스에 연결을 설정하기 (Establishing the Connection to the Database) 이 글에서는, MS-SQL 서버의 Northwind 데모 데이터베이스와 미리 정의된 연결 정의(connection definition) - MSSQL_Demo를 사용한다. 새 "VCL Forms Application Delphi for Win32"를 생성하고 시작하자. 첫째, TFDConnection 컴포넌트를 폼 위에 끌어 놓는다. 이 컴포넌트는 RAD 스튜디오 툴 팔레트 (Tool Palette) 안에 "FireDAC" 섹션 안에 들어있다. 이 컴포넌트는 데이터베이스 연결을 설정하고 제어한다. 그 다음, TFDConnection 컴포넌트의 ConnectionDefName 프로퍼티에서 드롭다운 목록을 펼친 후 MSSQL_Demo를 선택한다. 그러면 이 연결(connection) 컴포넌트는 해당 연결 정의(connection definition)를 사용할 것이다. 연결 정의에는 연결 정보가 미리 정의되어 있으므로, 이것을 사용하면 (서버 이름, 기본 데이터베이스 지정 등) 연결 파라미터를 추가로 입력할 필요가 없다. Connected 프로퍼티를 True로 지정하면, FireDAC이 로그인 대화창(Login Dialog)을 표시한다: 여기에 사용자 로그인 정보를 입력한다. 기본 설정이라면, 로그인 시도를 3번까지 할 수 있다. 모두 실패하면, 로그인 단계가 실패로 판정되고 에러 메시지가 표시된다. OK 버튼을 클릭하여 데이터베이스에 연결을 설정한다. DBMS에서 사용자 세션을 지원한다면, 이 때 DBMS 안에 사용자 세션이 생성된다. 연결 설정을 성공한 후에는, Connected 프로퍼티는 True로 설정된 그대로 유지된다. 그렇지 않으면 False로 재설정되고 FireDAC은 해당 에러 메시지를 표시한다. 3 데이터베이스에서 행을 선택하여 가져오기 (Selecting Rows from the Database) 이제 TFDQuery 컴포넌트를 툴 팔레트의 "FireDAC" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. 이 컴포넌트는 SQL 명령(command)을 수행하는고 데이터베이스에서 행(row)를 담아 오고, 변경된 데이터를 다시 데이터베이스로 전송(post)하는 역할을 담당한다. TFDQuery 컴포넌트의 Connection 프로퍼티를 앞에서 올려둔 FDConnection1으로 지정하여 이 쿼리가 해당 데이터베이스 연결을 사용하도록 한다. 참고: 만약 폼(form) 또는 데이터 모듈(datamodule)에 이미 TFDConnection 컴포넌트가 하나 이상 놓여져 있다면, TFDQuery 컴포넌트가 놓여질 때 가장 먼저 놓여진 연결이 자동으로 그 TFDQuery 컴포넌트의 Connection 프로퍼티에 지정된다. SQL 프로퍼티를 클릭하여 에디터 창을 열고 그 안에 아래 SQL 명령문을 넣는다: SELECT * FROM Orders OK 버튼을 클릭하여 에디터 창을 닫는다. 그러면 해당 SQL 명령문이 TFDQuery 컴포넌트의 SQL 프로퍼티에 지정된다. 그 다음, 델파이의 표준 TDataSource 컴포넌트를 툴 팔레트의 "Data Access" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. TDataSource 컴포넌트의 DataSet 프로퍼티를 앞에서 놓아둔 FDQuery1로 지정한다. 이제 TDBGrid 컨트롤을 툴 팔레트의 "Data Controls" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. 그리고, 이 TDBGrid의 DataSource 프로퍼티를 앞에서 놓아둔 DataSource1으로 지정한다. 마지막으로, FDQuery1의 Active 프로퍼티를 True로 지정한다. 그러면 해당 SQL 명령(command)이 DBMS로 전달되어서, 명령이 실행되고 결과 세트( result set)가 반환된다. 이 데이터는 DBGrid1 컨트롤에 표현된다. 4 애플리케이션이 실행되도록 준비하기 (Preparing the Application for Run Time) 이 애플리케이션이 실행되려면 다음과 같은 작업이 필요하다: TFDPhysMSSQLDriverLink 컴포넌트를 툴 팔레트의 "FireDAC Links" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. TFDGUIxWaitCursor 컴포넌트를 툴 팔레트의 "FireDAC UI" 섹션에서 끌고와서 폼(form) 위에 놓아 둔다. 이제 애플리케이션이 실행될 준비가 되었다. 위 컴포넌트 2개는 이 데이터베이스 애플리케이션에서 필요한 유닛들이 당신의 애플리케이션 실행파일(executable) 안에서 링크(link)될 수 있도록 한다. 실전에서는 이 컴포넌트들을 주 데이터 모듈(data module)안에 놓아 두는 것이 전형적이다. 5 요약 (Summary) 이 튜토리얼은 델파이에서 FireDAC을 이용하여 간단한 클라이언트-서버 애플리케이션을 만드는 방법을 보여준다. FireDAC의 연결(connection) 컴포넌트와 쿼리(query) 컴포넌트를 사용하여 코드를 한 줄도 쓰지 않고 데이터베이스에 연결을 설정하고 행(row)을 클라이언트로 담아와서 표현해보았다. 연결 정의에 대한 자세한 내용은 "연결 설정하기"를 참고하라. 또한 FireDAC\Samples\Getting Started 폴더에는 다른 DBMS 데모 애플리케이션들이 들어있으니 참고하기 바란다. 6 기타 자료 (See Also) Overview (FireDAC) 연결 설정하기 (FireDAC) 모바일 튜토리얼: FireDAC을 모바일 애플리케이션에서 사용하기 (iOS, Android) View full 엠바카데로 개발도구 가이드
×
×
  • Create New...

중요한 정보

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