从我的研究看起来基本上有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
{
/// <summary>
/// Initializes a new instance of the <see cref="QuickbookSession"/> class.
/// </summary>
internal QuickbookSession()
{
this.SessionManager = new QBSessionManager();
this.SessionManager.OpenConnection2(
ConfigurationManager.AppSettings["QuickbooksApplicationId"],
ConfigurationManager.AppSettings["QuickbooksApplicationName"],
Utils.GetEnumValue<ENConnectionType>(ConfigurationManager.AppSettings["QuickbooksConnectionType"]));
var file = Quickbook.QuickbookDatabaseFilePath;
if (string.IsNullOrEmpty(file))
{
file = ConfigurationManager.AppSettings["QuickbooksDatabaseLocalPath"];
}
this.SessionManager.BeginSession(file, Utils.GetEnumValue<ENOpenMode>(ConfigurationManager.AppSettings["QuickbooksSessionOpenMode"]));
}
/// <summary>
/// Gets the Quickbook session manager that is owning this message.
/// </summary>
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);
}
}
Run Code Online (Sandbox Code Playgroud)
之后,创建会话,创建消息和附加不同查询的问题很简单.
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
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码远远没有从Quickbooks的许多陷阱中得到证据.Quickbooks SDK也相当慢.例如,为大约1000个供应商检索供应商列表大约需要2分钟.
我决定使用上面未提及的另一种产品,称为“QuickBooks ADO.NET Data Provider”,它显然是由制作 QuickBooks 集成器产品的同一个人制作的
我选择它的原因...
1)它有一个远程访问组件
您安装远程服务器,您可以从网络上的任何地方访问您的QuickBooks数据
2)远程访问组件可以作为服务运行
Nuff说
3) 为 QuickBooks 数据提供 SQL 风格的接口
4) 进行一些自动魔法缓存以加速数据访问