从C#代码集成quickbooks的最佳方法是什么?

时间:2011-08-16 19:18:07

标签: c# quickbooks

从我的研究看起来基本上有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:我还有其他选择吗?

4 个答案:

答案 0 :(得分:7)

我使用了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);
    }
}

之后,创建会话,创建消息和附加不同查询的问题很简单。

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

答案 1 :(得分:3)

我决定使用另一种上面没有提到的名为“QuickBooks ADO.NET Data Provider”的产品,它显然是由制作QuickBooks集成商产品的人制作的

我选择它的原因......

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

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

3)为QuickBooks数据提供SQL样式界面
4)是否有一些自动魔术缓存来加速数据访问

答案 2 :(得分:2)

我使用了nSoftware的QuickBooks集成商来处理我所在的项目。它比使用QuickBooks SDK更容易,并且支持很棒。该产品已存在约8年。

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

答案 3 :(得分:1)

虽然我确信在某些情况下它无法正常工作,但我的第一个攻击方向是在Intuit developer center找到的Quickbooks SDK。