C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[75251] Re:[FireDAC] Cannot set MasterSource for database
빌더(TWx) [builder] 484 읽음    2019-01-17 00:33
뽀뽀중 님이 쓰신 글 :
: DB 파일은 하나이고 테이블이 여러개 인데,
: 각각의 테이블 1개당 하나의 폼을 생성해서 작업을 하려고 합니다.
:
: ******Form1
: void __fastcall TFormUser::FormCreate(TObject *Sender) {
:
:     if (AsDBName != "") { // DB가 열렸으면, DB 그리드에 입력한다.
:         try {
:             // User DBGrid 설정
:             FDQueryUser->Connection = FormMain->FDConnection1;
:             FormMain->DataSource1->DataSet = FDQueryUser;
:             DBGridUser->DataSource = FormMain->DataSource1;
:             FDQueryUser->Active = true;
:         }
:
:         catch (Exception& E) {
:             ShowMessage(E.Message);
:         }
:     }
: }
:
: ******Form2
: // ---------------------------------------------------------------------------
: void __fastcall TFormDistric::FormCreate(TObject *Sender) {
:     if (AsDBName != "") { // DB가 열렸으면, DB 그리드에 입력한다.
:         try {
:             // District DBGrid 설정
:             FDQueryDistric->Connection = FormMain->FDConnection1;
:             FormMain->DataSource1->DataSet = FDQueryDistric;
:             FDQueryDistric->DataSource = FormMain->DataSource1; <<<=이부분에서 에러가 발생 합니다.
:             FDQueryDistric->Active = true;
:         }
:
:         catch (Exception& E) {
:             ShowMessage(E.Message);
:         }
:     }
: }
:
: ================
: 위와 같이 같이 메인 폼에 있는 FDConnection1, DataSource1 를 동일하게 사용을 하는 것으로 하였습니다.
: 물론 테이블은 다른데,,,  Form2가 생성될때 제목과 같은 에러가 발생을 합니다.
:
: FireDAC을 사용해서 SQLite 로컬 사용합니다.
:
: 어떻게 수정을 해야 하나요?
:
: 미리 감사 드립니다.
:
: **** 인터넷을 검색을 해보니...
: http://www.delphigroups.info/2/32/41591.html
: creates a master detail relationship between two tables. 라는 문구가 보이네요...
:
: 두개의 테이블에서 Master Detail 관게를 설정 하면 될것 같은데,,,
: 어덯게 설정을 해야 하나요?





답변:


VCL에서 데이타 베이스 파트는 크게 보면 3개의 계층 구조로 간단하게 구현되어 있습니다.


TTable, TQuery, TFDQuery 등... 물리적으로 데이타 베이스를 액세스 하는 요소들을 통틀어서 "data set" 이라고 하고
모든 data set은 TDataSet 으로 부터 상속되어 만들어 집니다.

TDBEdit, TDBGrid 등과 같이 데이타 요소를 비쥬얼 하게 디스플레이 하는 요소들을 "data-aware" 라고 하고요.

데이타 베이스를 액세스 하기 위한 라이브러리를 설계할 때... data set 과 data-aware 2개의 레이어만 있어도 가능 할 텐데
VCL에서는 데이타 베이스 종류에 따라 물리적으로 종속적인 구조를 가질 수 밖에 없는 data set 을 바로 사용하지 않고

data set     <----->   data source   <----->  data-aware

위와 같이 'data source'라는 하나의 레이어를 더 두어 추상화 해 놓은 인터페이스를 별도로 사용해서 물리적인 종속성을
피하는 구조로 VCL 라이브러리를 설계해 놓았습니다.


'Circular datalinks are not allowed' 문제는...
데이타 베이스 테이블 구조에서의 Master/Detail 관계 때문에 일어나는 문제라기 보다는...

FormMain->DataSource1->DataSet = FDQueryDistric;
이 라인에서 data source 와 data set 이... 바인딩 되어 인터페이스가 내부에서 셋업되어 있는데

FDQueryDistric->DataSource = FormMain->DataSource1
위에서 이미 바인드 되어 있는 data set 과 data source를 또 다시 바인딩을 하려고 해서 나타나는 에러 입니다.
인터페이스 A가 B로 바인드 되어 있는데, 다시 B를 A로 순환적으로 바인드를 시도하려는 행위.

위에서 이미 바인드 되어 있으므로 두번째 바인딩은 필요없게 되는 거죠.


그리고...

2개의 TFDQuery가 독립적으로 2개의 폼에서 동시에 사용되는 조건이라면...
DataSource1 하나를 공유해서 사용하지 말고, 2개로 나누어서 별개로 사용 하세요.


안풀리는 부분... 이해 안가는 부분... 기술적인 문제 등이 있을 때는
VCL 라이브러리 소스코드를 보세요. 그 안에 답이 다 들어 있습니다.

파스칼 언어가 begin...end, if...then, procedure, function 등으로 코드가 긴 경우 가독성을 깨뜨려 버려서 보기 불편하지만
파스칼은 언어 구조가 상당히 간단합니다. C++을 이미 마스터 하고 있다면 IDE Help 파일만 봐도 파스칼 언어는 간단해서
금방 마스터 할 수 있을 겁니다. 언어 구조가 간단해서 초보자들이 접근하기는 쉽지만, 디테일 하게 표현 할 수 있는 능력은
C++ 보다 많이 떨어지는 단점이 있기도 합니다.

나 같은 경우도... RTL, VCL 버그 잡을 필요가 있을 때가 아니면, 실전에서 파스칼을 사용할 일은 없지요.


+ -

관련 글 리스트
75250 [FireDAC] Cannot set MasterSource for database[FDQueryDistric]. 'Circular datalinks are not allowed' 뽀뽀중 341 2019/01/16
75251     Re:[FireDAC] Cannot set MasterSource for database 빌더(TWx) 484 2019/01/17
75252         Re:Re:[FireDAC] Cannot set MasterSource for database 뽀뽀중 358 2019/01/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.