자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi ADO Query -> FD Query 마이그레이션 문의합니다.
2019.10.22 15:56
안녕하세요.
기존 마이그레이션 이전에 ADO Query를 다음과 같은 방식으로 사용 하고 있었습니다.
ado query를 오픈하고 오픈된 data를 dataset에서 clientdataset으로 전달하는 방식입니다.
결과적으로 최초에 adoquery.open시 db에 연결하여 data를 가져오는 작업을 한번 처리합니다.
헌데 FireDac을 사용해서 동일한 작업을 진행했더니,
FDQuery.open시 한번, Datasetprovider_FD.data 또는 ClientDataSet_FD.active := true; 시 한번 총 두번 db 쿼리를 실행합니다.
첨부된 소스를 보시면 Datasetprovider_FD.data 시에 이미 open 되어 있는 fdquery를 close한 후 다시 open하는 형태로 진행됩니다. 따라서 개발자가 의도하지않은 2배의 쿼리가 실행되게 됩니다.
질문을 정리하자면,
ADOQuery 또는 FDQuery를 open되어 있는 상태에서 Datasetprovider.data 구문 실행시,
1. DatasetProvider_ADO의 경우 ADOquery를 close하지 않고 할당만 처리.
2. DatasetProvider_FD의 경우 FDquery를 close하고 다시 open함.
동일한 DatasetProvider.data를 사용햇는데, dataset의 종류(ado,FD)에 따라 close 를 하고 안하고 차이나는 이유를 알고 싶습니다.
댓글 3
-
험프리
2019.10.23 13:58
-
mckim
2019.10.23 15:43
답변감사합니다.
1.알려주신 fmondemand 를 fmAll로 변경하여 테스트해보았으나 결과는 동일합니다.
2.ClientDataset을 사용하는 이유는 다음과 같습니다.
위 예시와 달리 현재 저희가 운영하고 있는 소스는 DataSnap쪽에서는 fdquery를 이용하여, datasetprovider까지 data를 가져오고 난 후에 클라이언트 프로그램을 전달하고 클라이언트쪽에서 ClientDataset만 이용하여 data를 control하는 구조입니다.
DataSnap 쪽에서 쿼리를 중복으로 실행하는 현상을 확인하고 그것을 간단하게 설명드리고자 위와같은 구조의 예제샘플을 만든것입니다.
지난번 세미나도 그렇고 엠바카데로에서 계속해서 부각하는것이 손쉽게 마이그레이션이 가능하다는 부분이죠.
datasetprovider, clientdataset 컴포넌트가 deprecated된 것도 아닌데 다른 컴포넌트로 바꿔야한다는것은 앞뒤가 좀 맞지 않는것 같습니다.
대부분의 업체들이 저희와 같이 최소한의 수정으로 마이그레이션을 진행하고자 할겁니다.
모든 컴포넌트를 신기술에 맞도록 교체하는것이 궁극적으로 맞는것이지만, 그것이 쉽지않다는것을 알고계실겁니다.
첨부된 소스코드로 직접 테스트 해주실 수는 없는지 다시 문의드립니다.
-
험프리
2019.10.24 16:31
단순히 몇번 돌려본다고 답을 드릴 이슈가 아닌것 같습니다^^
다른 업무와 일정상 직접 테스트하지 못하는 점 양해 부탁드립니다.
Delphi ADO Query -> FD Query 마이그레이션 문의합니다.
2019.10.22 15:56
안녕하세요.
기존 마이그레이션 이전에 ADO Query를 다음과 같은 방식으로 사용 하고 있었습니다.
ado query를 오픈하고 오픈된 data를 dataset에서 clientdataset으로 전달하는 방식입니다.
결과적으로 최초에 adoquery.open시 db에 연결하여 data를 가져오는 작업을 한번 처리합니다.
헌데 FireDac을 사용해서 동일한 작업을 진행했더니,
FDQuery.open시 한번, Datasetprovider_FD.data 또는 ClientDataSet_FD.active := true; 시 한번 총 두번 db 쿼리를 실행합니다.
첨부된 소스를 보시면 Datasetprovider_FD.data 시에 이미 open 되어 있는 fdquery를 close한 후 다시 open하는 형태로 진행됩니다. 따라서 개발자가 의도하지않은 2배의 쿼리가 실행되게 됩니다.
질문을 정리하자면,
ADOQuery 또는 FDQuery를 open되어 있는 상태에서 Datasetprovider.data 구문 실행시,
1. DatasetProvider_ADO의 경우 ADOquery를 close하지 않고 할당만 처리.
2. DatasetProvider_FD의 경우 FDquery를 close하고 다시 open함.
동일한 DatasetProvider.data를 사용햇는데, dataset의 종류(ado,FD)에 따라 close 를 하고 안하고 차이나는 이유를 알고 싶습니다.
댓글 3
-
험프리
2019.10.23 13:58
-
mckim
2019.10.23 15:43
답변감사합니다.
1.알려주신 fmondemand 를 fmAll로 변경하여 테스트해보았으나 결과는 동일합니다.
2.ClientDataset을 사용하는 이유는 다음과 같습니다.
위 예시와 달리 현재 저희가 운영하고 있는 소스는 DataSnap쪽에서는 fdquery를 이용하여, datasetprovider까지 data를 가져오고 난 후에 클라이언트 프로그램을 전달하고 클라이언트쪽에서 ClientDataset만 이용하여 data를 control하는 구조입니다.
DataSnap 쪽에서 쿼리를 중복으로 실행하는 현상을 확인하고 그것을 간단하게 설명드리고자 위와같은 구조의 예제샘플을 만든것입니다.
지난번 세미나도 그렇고 엠바카데로에서 계속해서 부각하는것이 손쉽게 마이그레이션이 가능하다는 부분이죠.
datasetprovider, clientdataset 컴포넌트가 deprecated된 것도 아닌데 다른 컴포넌트로 바꿔야한다는것은 앞뒤가 좀 맞지 않는것 같습니다.
대부분의 업체들이 저희와 같이 최소한의 수정으로 마이그레이션을 진행하고자 할겁니다.
모든 컴포넌트를 신기술에 맞도록 교체하는것이 궁극적으로 맞는것이지만, 그것이 쉽지않다는것을 알고계실겁니다.
첨부된 소스코드로 직접 테스트 해주실 수는 없는지 다시 문의드립니다.
-
험프리
2019.10.24 16:31
단순히 몇번 돌려본다고 답을 드릴 이슈가 아닌것 같습니다^^
다른 업무와 일정상 직접 테스트하지 못하는 점 양해 부탁드립니다.
해당 이슈는 ADO와 FireDAC의 운용 매커니즘과 연관이 있는 것 같습니다. 저도 해당 작업을 직접 진행해보지 않아 뾰족한 답을 드리긴 어렵습니다.
몇가지 의견을 드리니 참고하실 내용이 있다면, 참고하시기 바랍니다.
1) TFDQuery의 FetchOptions.Mode가 fmOnDemand로 설정 시 최초 RowsetSize 만큼 데이터를 가져오고, 그 이상 요청 시 다시 데이터를 가져옵니다.
해당 매커니즘이 쿼리를 여러번 오픈하는데 영향을 줄지 모르겠습니다.
2) 굳이 TFDQuery로 질의한 결과를 TClientDataSet으로 옮겨야 하는지 근본적인 구성도 검토해 보시면 좋을것 같습니다.
TFDQuery도 데이터셋으로 내부적으로 데이터를 갖고(캐슁)있습니다. 사용하려는 목적에 따라 구성을 검토해보시기 바랍니다.
3) TClientDataSet을 TFDMemTable로 변경하는 것도 검토해보시기 바랍니다.
두개 모두 메모리 기반 데이터셋입니다. 원하는 기능 구현 시 TFDMemTable의 기능 활용도 고려해보면 좋을 것 같습니다.
그 기능 중 하나인 데이터셋을 머지하는 기능을 TFDMemTable에서 지원합니다.
https://blog.hjf.pe.kr/413
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)