从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代码一样,它们做的事情非常相似,没有问题。如果这是一个线程问题,我认为无论我是否睡眠(),这个错误都会发生。
有人有什么想法吗?
发布于 2014-12-26 16:35:13
您使用的是什么版本的QBSDK以及QuickBooks的什么版本?我使用QBSDK13进行了测试(尽管我在创建消息请求时指定了版本7),使用14.0版本的企业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);
}
}https://stackoverflow.com/questions/27553039
复制相似问题