我使用QuickBooks的SDK,因为我正在为一个朋友的导入工具,我们没有购买第三方库的奢侈品。
我开始将它作为一个Web服务来开发,但我意识到这一点后不得不回退,不仅需要在服务器上部署Quickbooks SDK的可再发行版本,还需要安装Quickbooks本身。 Quickbooks通常会显示一个对话框,这在服务器上很糟糕。
只要该对话框打开,Quickbooks SDK就会拒绝任何连接。
我最终将它作为纯C#Winform应用程序来完成。从那里,它相当海峡。
在程序的心脏是处理的会话和消息
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);
}
}
后一个的QuickBook会话类,这是简单的创建一个会话,创建一条消息,并附加了不同的查询的问题。
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
}
}
这段代码远非QuickBook的许多缺陷的防弹。 Quickbooks SDK也相当慢。例如,检索供应商名单大约需要2分钟,大约1000个供应商。
对于Windows服务,COM互操作似乎是最好的解决方案。 –
尽管它可能有点混乱,但使用COM有什么问题? –
@JP,我们将其称为业务需求 – iamkrillin