본문 바로가기
DogFoot/Delphi

[FireDAC] MySQL Commands out of sync; you can't run this command now

by 크림슨킹 2021. 4. 2.

FireDAC으로 MySQL의 StoredProcedure를 처리하는데,

이전엔 멀쩡했던 녀석이 이런 오류를 뱉어낸다. 흠...

다른 점이라면 32bit로 빌드했을 때는 문제가 없었고, 64bit로 빌드했다는 점...

 

프로그래밍의 9할은 디버깅!!!

 

ExecProc를 이리저리 따라가 보니...

32bit와 64bit가 상이하게 에러는 뱉어내는 지점은

FireDAC.Stan.Async.pas > TFDStanAsyncExecutor.Run 내부의

MsgWaitForMultipleObjects 라는 WIN32 API 호출부분이다.

 

저 API 자체의 문제는 아닌 듯하고, FireDAC에서 쿼리시에 동기화처리 부분의 문제로 보이는데

FireDAC의 설정과 저 API의 궁합이 문제인 듯...

아무튼 몇가지 FireDAC의 TFDStoreProc의 property 중에 Excute관련 부분을 변경해 본다,

결론은...!

 

ResourceOptions > DirectExecute := True;

 

DirectExecute에 대한 설명은 SQL문을 사전준비 하여 실행하냐 바로하냐의 차이라는데,

False인 사전준비 처리는 비동기 방식으로 진행되는 모양이다.

이게 32bit에서는 문제가 없지만, 64bit에서는 문제가 되는 모양.

아무튼 미션 클리어!

 

그 밖의 TFDStoreProc/Qry의 주요 속성들은 다음과 같다.

설정은 다음과 같이 기본 설정하는 것이 낫다.

  1. FetchOptions

         Items: [fiBlobs,fiDetails] //fiMeta는 파라미터 자동설정임.

           런타임에서 직접 설정하는 경우 오류가 발생하므로 fiMeta는 제거한다.

         Mode: fmAll       //모두 다 읽어와라

         AutoClose: True  //데이터셋 다 읽으면 데이터셋 자동닫기 여부

  2.ResourceOptions

        CmdExecMode: amBlocking   //실행 종료 시 까지 블로킹(대기).

            비동기로 처리해야되면 amASync로(AfterOpen에서 결과 받음)

        CmdExecTimeout:  알아서 설정

        UnifyParam: False  //mssql의 @파라미터에서 @를 넣지 않아도 되냐마냐인데, XE10.3.3에서는 이게 또 안먹는다.

        SilentMode: True

 

보다 자세한 사항들은 Document참조,

 

끝!

댓글