从我的研究看起来基本上有3个选项.
1:使用COM
2:使用Web服务和Web连接器
3:使用第三方组件(并且似乎有很多)
这些选项中的每一个都给我带来了一个问题:
1:我被告知我无法使用COM
2:这个解决方案对我来说似乎非常有用,因为我需要从Windows服务集成
3:这些解决方案中的一些相当昂贵.
我看起来好像要去第三方路线,我脑子里有两个领跑者:
1:QODBC(http://www.qodbc.com/usa.html)
2:AccessBooks(http://www.synergration.com/AccessBooksUpdater/default.aspx)
亲爱的读者,我的问题如下:
1:您将使用哪种解决方案(com,Web服务,第三方)?
2:为什么你会选择其他选项呢?
3:我还有其他选择吗?
我使用了Quickbooks SDK,因为我正在为朋友开发一个导入工具,我们没有购买第三方库的奢侈.
我开始开发它作为一个Web服务,但我意识到,之后回落,不仅我们需要部署的Quickbooks SDK的服务器上的redistribuable,但我们也需要自身的Quickbooks要安装.通常情况下,Quickbooks会显示一个对话框,这在服务器上很糟糕.
只要该对话框打开,Quickbooks SDK就会拒绝任何与它的连接.
我最终将其作为一个纯C#Winform应用程序.从那里开始,它相当紧张.
该计划的核心是一个处理会话和消息的quickbook会话类
public static class Quickbooks { public static QuickbookSession CreateSession() { return new QuickbookSession(); } } public class QuickbookSession : IDisposable { ////// Initializes a new instance of the internal QuickbookSession() { this.SessionManager = new QBSessionManager(); this.SessionManager.OpenConnection2( ConfigurationManager.AppSettings["QuickbooksApplicationId"], ConfigurationManager.AppSettings["QuickbooksApplicationName"], Utils.GetEnumValueclass. /// (ConfigurationManager.AppSettings["QuickbooksConnectionType"])); var file = Quickbook.QuickbookDatabaseFilePath; if (string.IsNullOrEmpty(file)) { file = ConfigurationManager.AppSettings["QuickbooksDatabaseLocalPath"]; } this.SessionManager.BeginSession(file, Utils.GetEnumValue (ConfigurationManager.AppSettings["QuickbooksSessionOpenMode"])); } /// /// Gets the Quickbook session manager that is owning this message. /// public QBSessionManager SessionManager { get; private set; } public QuickbookMessage CreateMessage() { return new QuickbookMessage(this.SessionManager); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { // get rid of managed resources } this.SessionManager.EndSession(); this.SessionManager.CloseConnection(); System.Runtime.InteropServices.Marshal.ReleaseComObject(this.SessionManager); } }
之后,创建会话,创建消息和附加不同查询的问题很简单.
using(var session = Quickbooks.CreateSession()) { // Check if the job already exist using (var message = session.CreateMessage()) { var jobQuery = message.AppendCustomerQueryRq(); jobQuery.ORCustomerListQuery.CustomerListFilter.ORNameFilter.NameFilter.Name.SetValue("something"); jobQuery.ORCustomerListQuery.CustomerListFilter.ORNameFilter.NameFilter.MatchCriterion.SetValue(ENMatchCriterion.mcContains); var result = message.Send(); // do stuff here with the result } }
这段代码远远没有从Quickbooks的许多陷阱中得到证据.Quickbooks SDK也相当慢.例如,为大约1000个供应商检索供应商列表大约需要2分钟.