ho usato lo SDK Quickbooks perché stavo sviluppando un tool di importazione per un amico e non abbiamo avuto il lusso di acquistare una libreria di terze parti.
Ho iniziato a svilupparlo come un servizio Web, ma ho dovuto ricorrere dopo aver capito che, non solo abbiamo bisogno di distribuire la ridistribuibile dell'SDK Quickbooks sul server, ma abbiamo anche bisogno di Quickbooks per essere installato. E più spesso che mai, Quickbooks mostrava una finestra di dialogo, che su un server è pessima.
Finché la finestra di dialogo è stata aperta, Quickbooks SDK rifiuta qualsiasi connessione ad esso.
Ho finito per farlo come una pura applicazione C# Winform. Da lì, è piuttosto diretto.
Al cuore del programma è stata una classe sessione di quickbook che ha gestito la sessione e il messaggio
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);
}
}
Dopo di che, è stato semplice questione di creazione di una sessione, la creazione di un messaggio e aggiungendo il diverso interrogazione .
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
}
}
Questo codice è lungi dall'essere a prova di proiettile dalle molte insidie di Quickbooks. Anche l'SDK Quickbooks è piuttosto lento.Ad esempio, il recupero dell'elenco dei fornitori richiede circa 2 minuti per circa 1000 fornitori.
fonte
2011-08-16 20:11:24
Per un servizio Windows, l'interoperabilità COM sembra la soluzione migliore. –
Nonostante il fatto che possa essere un po 'complicato, cosa c'è di sbagliato nell'usare COM? –
@JP, Lo chiameremo requisito aziendale – iamkrillin