当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从C#代码集成quickbooks的最佳方法是什么?》经验,为你挑选了1个好方法。

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



1> Pierre-Alain..:

我使用了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  class.
    /// 
    internal QuickbookSession()
    {
        this.SessionManager = new QBSessionManager();

        this.SessionManager.OpenConnection2(
            ConfigurationManager.AppSettings["QuickbooksApplicationId"],
            ConfigurationManager.AppSettings["QuickbooksApplicationName"],
            Utils.GetEnumValue(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分钟.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有