2014-02-20 2 views
5

FireDAC에서 매크로를 사용하여 SQL 쿼리를 사전 처리하려고합니다.FireDAC - 매크로 확장 후 SQL 표시

Select * from MyTable 
    join OtherTable on MyTable.Key = OtherTable.Key 
&Where 

그럼 내 코드에서 내가 할이 : 이것은 복잡한 쿼리에 좋은 일했다

WhereClause = 'stuff based on my form'; 
Query.MacroByName('Where').AsRaw := WhereClause; 
Query.Open; 

그것은 나를 수 있기 때문에 SQL이 같은 설정으로 나는 데이터 모듈에 TADQuery 개체가 SQL 속성 편집기를 사용하여 내 필드와 조인 조건이 올바른지 확인하십시오.

제 문제는 where 절로 인해 SQL 문이 유효하지 않은 경우입니다. 전처리가 실행될 SQL을 볼 수있는 방법이 있습니까? 지금 당장 FireDac 오류를 잡아 내고 EADDBEngineException 객체에있는 SQL을 보여줍니다. 그러나 그것은 여전히 ​​매크로와 함께 원래의 SQL을 보여줍니다. 오류가 발생한 후에도 매크로를 얻을 수 없다면 어쨌든 매크로 대체가 강제로 수행되어 디버거에서 SQL을보고 잘못된 것을 볼 수 있습니다.

가까운 미래에 SQL Server로 옮길 목표로 MS Access 데이터베이스에 연결하는 것이 중요합니다.

+1

그냥 추측 (I 이후 현재 FireDAC을 가지고 있지는 않지만) ['Prepare'] (http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile)에 전화 할 필요는 없습니다. = uADCompClient_T ADRdbmsDataSet_Prepare.html) 메서드를 사용하여 전처리를 트리거 할 수 있습니까? 쿼리 준비 결과는 ['SQLText'] (http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile=uADCompClient_TADCustomCommand_SQLText.html) 속성에 저장해야하지만 여기에는 도움이 매우 혼란 스러워요. 그리고 나는이 속성이'TADSQLQuery'에 숨겨져 있다고 생각합니다. – TLama

+0

글쎄, 내가 무슨 일이 일어나고 있는지 대략 체크했는데'Prepare '(나는 당신에게 쓸모가 없다)를 호출하는 것이 그 전처리를 유발시키는 최소한의 요구 사항인지 아직도 확신 할 수 없다. 비록 전처리 된 SQL은 DBMS로 전송되며 ['Text'] (http://docs.embarcadero.com/products/rad_studio/firedac/frames.html?frmname=topic&frmfile=uADCompClient_TADCustomQuery_Text)를 통해 액세스 할 수 있습니다. .html) 속성 (이러한 속성의 경우 일반적이지는 않은 이름). 그래서, 나는 오히려 믿을만한 대답을 기다리고 싶습니다. 좋은 질문! – TLama

+1

@tlama - 고마워! ADQuery.Text가 필요한 것 같습니다. 나는 그것을 생각하지 않고 그 재산을 바로 지나쳤습니다. 귀하의 의견에서 나는 그 도움말 파일에 대한 또 다른 짧은 참조를 찾았습니다. [추적 및 모니터링] (http://docs.embarcadero.com/products/rad_studio/firedac/Tracing_and_Monitoring.html) 섹션에는 "SQL 명령 텍스트 확인"이라는 제목 아래쪽 단락이 있습니다. 오류 객체의 .Text 속성에 접근 할 수있는 것처럼 보이지 않지만 디버거에서 볼 수있는 큰 도움이 될 것입니다. –

답변

1

의견에서

(그냥 대답없는 질문의 목록에서이 질문에 제거하기 위해) : 나는 약이 무슨 일이 일어나고 있는지 확인했습니다

음을 나는 아직도 경우 확실하지 않다 (나는 당신에게 쓸모가 없다)을 준비하는 것은 최소 전제 조건이다. 하지만 사전 처리 된 SQL은 DBMS로 전송되며 은 텍스트 속성을 통해 액세스 할 수 있습니다 (이러한 속성은 매우 드문 이름 임). - 그렇다 SQL 실제로데이터베이스 엔진에 무슨 일이 일어나고 있는지 모니터링하기 위해, 텍스트 속성을 사용에서 8시 18분

+1

그러나 확실하게 "나는 약간의 믿을만한 대답을 기다리고 싶습니다." 대답으로 게시하기에 이상적인 후보가 아닌가? – MartynA

+0

"ADQuery.Text"가 필요한 것 같습니다. " 대답 - 네. FireDAC에는 명령으로 DBMS 서버로 전송되는 최종 텍스트를보기위한 다른 방법이 없습니다. – Nashev

+0

우리의 애플 리케이션에서 우리는 FireDAC 라이브러리 사본을 가지고 있으며, 일부는이 텍스트를 Exception 객체를 통해 예외 처리기로 전송합니다. 예외 처리기는 최종 텍스트와 모든 매개 변수 및 대부분의 호출 컨텍스트 정보로보다 유익한 예외 설명을 볼 수 있도록합니다. – Nashev

1

에서 TLama 이월 21 일 '14은 "FDMonitor"FireDAC 유틸리티를 사용하는 것이 좋습니다. (아래) DokWiki 페이지에 따르면

  • 기존 FDConnection에 MonitorBy =하기 Xxx 접속 정의 ​​매개 변수를 추가,
  • 진정한에의 추적 속성을 설정 양식에
  • TFDMoniRemoteClientLink 구성 요소를 드롭 구성 요소. IDE 개체 관리자에서 FDConnection 구성 요소를 선택하고 Params 속성을 확장 한 다음 MonitorBy를 mbRemote로 설정하여이 작업을 수행 할 수 있습니다. TFDMoniXxxxClientLink 데이터 모듈 또는 폼 생성하기 TFDConnection 앞에 서므로 FDConnection 위 오른쪽 형태 또는 데이터 모듈 후 생성 순서와 TFDMoni 이동 클릭 .. 성분하여 조정해야

참고 .

또한 TFDMoniXxxxClientLink의 옵션에서 기록되는 대부분의 이벤트를 비활성화하는 것이 유용합니다. 그렇지 않으면 반환되는 모든 데이터가 FireDAC 모니터에도 표시됩니다.Eventkinds 속성을 확장하고 ekConnConnect, ekConnPrepare 및 ekCmdExecute를 제외한 모든 이벤트 종류를 끕니다.

그런 다음 IDE에서 FireDAC 모니터를 엽니 다 (도구> FireDAC 모니터). 모니터가 실행 중일 때만 앱을 시작하십시오. 추적 출력 탭에서 추적 이벤트를 두 번 클릭하면 아래 창에 데이터베이스로 전송 된 실제 SQL이 표시됩니다.

위와 같이 ekConnPrepare의 EventType을 추가하면 쿼리의 Prepare가 호출 될 때 표시되지만 확실히 말할 수는 없습니다.

자세한 내용은 DocWiki에서 다음 페이지를 참조하십시오

개요 : FDMonitor

방법 : Tracing and Monitoring (FireDAC)

다른 FireDAC 유틸리티 : Utilities (FireDAC)