QBFC“无效的票证参数”

时间:2014-12-18 18:11:50

标签: quickbooks qbxml 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!!

我发现了这一点,因为任何时候我都会在代码中设置一个断点来调试问题 - 问题就会消失。所以我才知道我可以在那里放一秒睡眠并模拟相同的行为。 (顺便说一句 - 半秒延迟没有帮助 - 仍然会抛出异常)

这让我摸不着头脑。我在应用程序的开头初始化sessionManager并在整个代码中重用它。它可以在这个应用程序的其他地方工作,但在这里我查看了原始XML(对于请求和响应)并且没有看到任何错误。响应只有一个错误:“数据文件不再打开。无法继续。”但没有任何迹象表明原因。 (并且数据文件是打开的,在此异常之后我可以将它用于任何其他数量的东西)

我怀疑它与 WHEN 调用此代码有关。我有一个监听器,它监听来自XDMessaging加载项的消息(用于进程间通信)。当侦听器收到消息时,事件会调用此代码。但是这个代码在相同的应用程序(和相同的线程)中调用,因为我有很多类似的东西,它没有问题。如果这是一个线程问题我会认为错误会发生,无论我是否睡眠()一秒钟或不是。

有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您使用的是什么版本的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);
    }
}