2014-12-18 3 views
0

QBFC에서 이상한 오류가 발생했습니다. 이 코드는 실패합니다.QBFC "유효하지 않은 티켓 매개 변수"

 var qbRequest = sessionManager.CreateMsgSetRequest("US", 7, 0); 
     qbRequest.Attributes.OnError = ENRqOnError.roeStop; 
     var qbQuery = qbRequest.AppendCustomerQueryRq();     
     // Don't get all fields (would take forever) - just get these... 
     qbQuery.IncludeRetElementList.Add("ListID"); 
     qbQuery.IncludeRetElementList.Add("Phone"); 
     qbQuery.IncludeRetElementList.Add("AltPhone"); 
     qbQuery.IncludeRetElementList.Add("Fax"); 
     var qbResponses = sessionManager.DoRequests(qbRequest);// <<- EXCEPTION: INVALID TICKET PARAMETER !!! 

그러나 여기에 지연을 넣으면 정상적으로 작동합니다. 예 :

 System.Threading.Thread.Sleep(1000); 
     var qbResponses = sessionManager.DoRequests(qbRequest);// <<- WORKS FINE!! 

언제든지 문제를 디버그하기 위해 코드에 중단 점을 설정했기 때문에이를 발견했습니다. 문제는 사라질 것입니다. 그래서 나는 그곳에 1 초의 수면을 넣고 똑같은 행동을 시뮬레이션 할 수 있다는 것을 배웠습니다. (btw - 0.5 초 지연은 도움이되지 않습니다 - 여전히 예외를 throw합니다)

이것은 내 머리를 긁적니다. 응용 프로그램의 시작 부분에서 sessionManager를 초기화하고 코드 전체에서 다시 사용합니다. 그리고 그것은이 응용 프로그램의 다른 곳에서도 작동하지만 여기서는 작동합니다. 원시 XML (요청 및 응답 모두)을 살펴본 결과 거기에 아무 것도 보이지 않습니다. 응답에 "데이터 파일이 더 이상 열리지 않습니다. 계속할 수 없습니다."라는 오류가 있습니다. 그러나 이유를 나타내는 것은 아무것도 아닙니다. (그리고이 데이터 파일을 열어서 다른 모든 것들에 사용할 수 있습니다.)

과 관련이 있다고 생각합니다.이 코드가 호출됩니다. XDMessaging 추가 기능 (프로세스 간 통신에 사용됨)의 메시지를 수신하는 수신기가 있습니다. 리스너가 메시지를 수신하면이 코드가 이벤트를 호출합니다. 하지만이 코드는 다른 QBFC 코드의 톤과 동일한 응용 프로그램 (동일한 스레드)에서 호출됩니다.이 코드는 문제없이 매우 유사한 작업을 수행합니다. 그리고 그것이 스레딩 문제라면 나는 잠시 잠을 잘랐는지 상관없이 오류가 발생할 것이라고 생각합니다.

아무도 아이디어가 있습니까?

답변

0

사용중인 QBSDK 버전과 QuickBooks 버전은 무엇입니까? 필자는 버전 14.0 Enterprise R5P를 사용하여 QBSDK 13 (메시지 요청을 작성할 때 버전 7을 지정 했음)을 사용하여 테스트했습니다. 지체없이 문제 나 예외를 경험했습니다. 이미 연결을 열고 다른 곳에서 세션을 시작한 것처럼 보이기 때문에 SessionManager에서 계속 진행되는 작업이있을 것입니다.

QBSessionManager SessionMananger = new QBSessionManager(); 
SessionMananger.OpenConnection2("Sample", "Sample", ENConnectionType.ctLocalQBD); 
SessionMananger.BeginSession("", ENOpenMode.omDontCare); 
IMsgSetRequest MsgRequest = SessionMananger.CreateMsgSetRequest("US", 7, 0); 
MsgRequest.Attributes.OnError = ENRqOnError.roeStop; 
var qbQuery = MsgRequest.AppendCustomerQueryRq(); 
qbQuery.IncludeRetElementList.Add("ListID"); 
qbQuery.IncludeRetElementList.Add("Phone"); 
qbQuery.IncludeRetElementList.Add("AltPhone"); 
qbQuery.IncludeRetElementList.Add("Fax"); 
IMsgSetResponse MsgResponse = SessionMananger.DoRequests(MsgRequest); 

for (int index = 0; index < MsgResponse.ResponseList.Count; index++) 
{ 
    IResponse response = MsgResponse.ResponseList.GetAt(index); 
    if (response.StatusCode != 0) 
    { 
     MessageBox.Show(response.StatusMessage); 
    } 
} 
:

여기에 아무 문제가 없었다 내 코드입니다
관련 문제