Таким образом, Quickbooks не позволяет службе Windows подключаться к своей системе через свой QBFC13.0. Он также не позволяет запускать любую программу автоматически, все должно выполняться в контексте ПОЛЬЗОВАТЕЛЯ. Я пробовал все, чтобы обойти это. Где я сейчас: у меня есть приложение Windows (.exe), которое вручную запускается пользователем. Он бесконечно зацикливается, но в 4 часа утра он должен собрать данные из QuickBooks. Работа, которую он выполняет, увенчается успехом (иногда).
Проблема возникает случайным образом, когда он пытается выполнить работу в 4 часа утра. Диспетчер задач показывает, что он все еще работает, но в файлах журнала больше нет записей. Когда он находится в своем цикле, он должен регистрировать каждую минуту, говоря, что он активен. Я не могу понять, как он перестает писать в журнал (или вообще что-то делать), но все еще работает в диспетчере задач. Кроме того, когда он останавливается, он ничего не записывает в журнал, никаких ошибок не обнаружено.
Я не делал никакой очистки кода, поэтому прошу прощения, если он плохо организован и неправильный.
static void Main(string[] args)
{
WriteToFile("Program Startup " + DateTime.Now);
try
{
var DebugLevel = System.Configuration.ConfigurationManager.AppSettings["Debug"];
while (1 > 0)
{
Thread.Sleep(1000 * 60);
WriteToFile("Timer Ticked " + DateTime.Now);
if ((DateTime.Now.Hour == 4 && DateTime.Now.Minute == 0 && attempt == -1) || DebugLevel == "DEBUG" || (attempt <= 2 && attempt >= 0))
{
GC.Collect();
GC.WaitForPendingFinalizers();
try
{
attempt++;//iterate the attempt
WriteToFile("QuickBooks data gather executable started " + DateTime.Now + " Attempt Number: " + Convert.ToString(attempt + 1));
SetupQBSession();
QBCustomer customerQuery = new QBCustomer();
List<ICustomerRet> customers = customerQuery.DoCustomerQuery(sessionManager, connectionOpen, sessionBegun);
WriteToFile("Initial Connection to Quickbooks succesfull. " + DateTime.Now);
foreach (ICustomerRet r in customers)
{
//WriteToFile(r.Name.GetValue());
//Make database Call to log QB customer data.
using (CSTClassesDataContext cst = new CSTClassesDataContext(ConfigurationManager.ConnectionStrings["CST"].ConnectionString))
{
//save the customer data
var DBCustomerSaveResult = cst.QB_Customer_Save(r.Name.GetValue(), (bool)r.IsActive.GetValue());
WriteToFile("QuickBooks Customer Data Saved for " + r.Name.GetValue() + " " + DateTime.Now);
string connetionString = null;
SqlConnection connection;
SqlCommand command;
string sql = null;
SqlDataReader dataReader;
connetionString = cst.Connection.ConnectionString;
sql = "select * from QB_customer where QB_customer.customer_name = '" + r.Name.GetValue() + "'";
connection = new SqlConnection(connetionString);
try
{
connection.Open();
command = new SqlCommand(sql, connection);
dataReader = command.ExecuteReader();
if (dataReader.Read() && dataReader.HasRows)
{
QBInvoice invoicesQuery = new QBInvoice();
List<IInvoiceRet> invoices = invoicesQuery.DoInvoiceQuery(dataReader.GetValue(1).ToString(), sessionManager, connectionOpen, sessionBegun);
foreach (IInvoiceRet invoice in invoices)
{
if (invoice.Memo.GetValue().ToString() != null)
{
int dbQBcustomerID = Convert.ToInt32(dataReader.GetValue(0));
var DBInvoiceSaveResult = cst.QB_invoice_save(dbQBcustomerID, invoice.RefNumber.GetValue().ToString(), invoice.Memo.GetValue().ToString(), (decimal)invoice.BalanceRemaining.GetValue(), invoice.DueDate.GetValue(), invoice.IsPaid.GetValue());
WriteToFile("Invoices updated for QB_customer_id: " + dbQBcustomerID + ", Invoice Number " + invoice.RefNumber.GetValue().ToString() + ", IsPaid " + invoice.IsPaid.GetValue() + " " + DateTime.Now);
}
}
//Console.WriteLine(dataReader.GetValue(0) + " - " + dataReader.GetValue(1) + " - " + dataReader.GetValue(2));
}
dataReader.Close();
command.Dispose();
connection.Close();
}
catch (Exception ex)
{
WriteToFile(ex.ToString());
}
}
}
CloseQBSession();
attempt = -1;
}
catch (Exception exeption)
{
if (attempt <= 2 && attempt >= 0)
{
//attempt++;
}
else
{
attempt = -1;
}
CloseQBSession();
WriteToFile(exeption.ToString());
}
finally
{
WriteToFile("QB Thread Finished " + DateTime.Now);
}
}
}
}
catch(Exception high)
{
WriteToFile(high.ToString());
}
// Hide
ShowWindow(handle, SW_HIDE);
//Console.Read();
}
private static void WriteToFile(string Message)
{
string filepath = "FILEPATH REMOVED FOR STACK OVERFLOW(unneeded information)" + DateTime.Now.Date.ToShortDateString().Replace('/', '_') + ".txt";
if (!File.Exists(filepath))
{
// Create a file to write to.
using (StreamWriter sw = File.CreateText(filepath))
{
sw.WriteLine(Message);
}
}
else
{
using (StreamWriter sw = File.AppendText(filepath))
{
sw.WriteLine(Message);
}
}
}