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-секундный сон и смоделировать такое же поведение. (кстати - задержка в полсекунды не помогает - все еще выдает исключение)

Это заставило меня почесать голову. Я инициализирую sessionManager в начале приложения и повторно использую его в своем коде. И это работает везде в этом приложении, но не здесь. Я просмотрел необработанный XML (как для запроса, так и для ответа) и не вижу там ничего плохого. В ответе просто ошибка: "Файл данных больше не открыт. Невозможно продолжить". но ничего не указывает, почему. (и файл данных открыт, после этого исключения я могу использовать его для любого количества ДРУГИХ вещей)

Я подозреваю, что это как-то связано с КОГДА вызывается этот код. У меня есть прослушиватель, который прослушивает сообщения от надстройки XDMessaging (используется для межпроцессного взаимодействия). Когда прослушиватель получает сообщение, событие вызывает этот код. Но этот код вызывается в том же приложении (и в том же потоке), что и тонны ДРУГОГО кода QBFC, который у меня есть, который делает очень похожие вещи без проблем. И если бы это была проблема с потоками, я бы подумал, что ошибка произойдет независимо от того, буду ли я спать () в течение секунды или нет.

У кого-нибудь есть идеи?


person William Madonna Jr.    schedule 18.12.2014    source источник


Ответы (1)


Какую версию QBSDK вы используете и какую версию QuickBooks? Я тестировал с помощью QBSDK 13 (хотя я указал версию 7 при создании запроса сообщения) с версией 14.0 Enterprise R5P. У меня не было проблем или исключений без задержки. Возможно, что-то происходит с вашим 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);
    }
}
person TravestyOfCode    schedule 26.12.2014