9

从我的研究看来,基本上有 3 个选项。

1:使用 COM
2:使用 Web 服务和 Web 连接器
3:使用 3rd 方组件(似乎有不少)

这些选项中的每一个都给我带来了一个问题:
1:我被告知我不能使用 COM
2:这个解决方案对我来说似乎很老套,因为我需要从 Windows 服务集成
3:其中一些解决方案相当昂贵。

我看起来我将不得不走第 3 方路线,并且我心中有两个领跑者:

1: QODBC (http://www.qodbc.com/usa.html)
2: AccessBooks (http://www.synergration.com/AccessBooksUpdater/default.aspx)

亲爱的读者,我的问题如下:

1:您会使用哪种解决方案(com、Web 服务、哪个第 3 方)?
2:你为什么会选择它而不是其他选项?
3:还有其他我错过的选择吗?

4

4 回答 4

8

我使用 Quickbooks SDK 是因为我正在为朋友开发导入工具,而我们没有购买 3rd 方库的奢侈。

我开始将其开发为 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);
    }
}

之后,创建会话、创建消息并附加不同的查询就很简单了。

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 分钟。

于 2011-08-16T20:11:24.520 回答
4

我决定使用上面没有提到的另一种产品,称为“QuickBooks ADO.NET 数据提供程序”,它显然是由制作 QuickBooks 集成器产品的同一个人制作的

我选择它的原因...

1)它有一个远程访问组件
您安装远程服务器,您可以从网络上的任何地方访问您的 QuickBooks 数据

2)远程访问组件可以作为服务运行
Nuff 说

3) 为 QuickBooks 数据提供 SQL 风格的接口
4) 做一些自动魔术缓存以加快数据访问

于 2011-08-23T21:01:02.380 回答
2

我在我参与的一个项目中使用了 nSoftware 的 QuickBooks 集成器。它比使用 QuickBooks SDK 容易得多,而且支持很棒。该产品已经存在了大约 8 年。

http://www.nsoftware.com/ibiz/quickbooks/

于 2011-08-16T19:30:06.600 回答
1

虽然我确信在某些情况下它不起作用,但我的第一个攻击方向是在Intuit 开发人员中心找到的 Quickbooks SDK 。

于 2011-08-16T19:22:47.433 回答