2014-10-17 143 views
0

好吧,我討厭被困難,但我這次。我能夠得到的服務安裝得很好,因此效果很好。當我開始服務時,它停止了,我沒有得到有關錯誤的細節。所以這裏是我的代碼:安裝Windows服務將無法啓動

using System; 
using System.Configuration; 
using System.Data; 
using System.Data.Common; 
using System.Data.OleDb; 
using System.Data.SqlClient; 
using System.IO; 
using System.ServiceProcess; 
using System.Text.RegularExpressions; 
using System.Threading; 

namespace MyServiceImport 
{ 

public partial class MyServiceData : ServiceBase 
{ 
    private System.Timers.Timer _timer; 
    private Double ReadTime = Convert.ToDouble(ConfigurationManager.AppSettings.Get("ReadTime")) * 1000 * 60; 
    private DateTime _lastRun = DateTime.Now; 
    Thread _thread; 

    public MyServiceData() 
    { 
     InitializeComponent(); 
    } 

    // These lines run when the service starts up 
    protected override void OnStart(string[] args) 
    { 
     _timer = new System.Timers.Timer(); 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
     _timer.Enabled = true; 
     _timer.Interval = ReadTime; 
     _timer.Start(); 

     #region Write to Audit Log 
     string Event = "Update Service"; 
     string DoneBy = "Automation User"; 
     string Information = "Update Service has Started."; 
     string MyTimeStamp = DateTime.Now.ToString(); 

     SqlConnection conn = new SqlConnection(DBUtils.MyService_DBString); 
     string writeit = "INSERT INTO MyService_Activities (Event, DoneBy, Information, TimeStamp) values(@Event, @DoneBy, @Information, @TimeStamp)"; 
     SqlCommand WriteLog = new SqlCommand(writeit, conn); 
     conn.Open(); 
     WriteLog.Parameters.AddWithValue("Event", Event); 
     WriteLog.Parameters.AddWithValue("DoneBy", DoneBy); 
     WriteLog.Parameters.AddWithValue("Information", Information); 
     WriteLog.Parameters.AddWithValue("TimeStamp", MyTimeStamp); 
     WriteLog.ExecuteNonQuery(); 
     conn.Close(); 
     #endregion 

    } 

    // writes message into the activity log that the service has stopped. 
    protected override void OnStop() 
    { 
     #region Write to Audit Log 
     string Event = "Update Service"; 
     string DoneBy = "Automation User"; 
     string Information = "Update Service has Stopped."; 
     string MyTimeStamp = DateTime.Now.ToString(); 

     SqlConnection conn = new SqlConnection(DBUtils.MyService_DBString); 
     string writeit = "INSERT INTO MyService_Activities (Event, DoneBy, Information, TimeStamp) values(@Event, @DoneBy, @Information, @TimeStamp)"; 
     SqlCommand WriteLog = new SqlCommand(writeit, conn); 
     conn.Open(); 
     WriteLog.Parameters.AddWithValue("Event", Event); 
     WriteLog.Parameters.AddWithValue("DoneBy", DoneBy); 
     WriteLog.Parameters.AddWithValue("Information", Information); 
     WriteLog.Parameters.AddWithValue("TimeStamp", MyTimeStamp); 
     WriteLog.ExecuteNonQuery(); 
     conn.Close(); 
     #endregion 
    } 

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     // set up connection string 
     string _csMyServiceDD = DBUtils.MyService_DBString; 
     string DoImportNow = string.Empty, TaskDay = string.Empty, TaskStartTime = string.Empty, TaskEndTime = string.Empty; 

     SqlConnection conn = new SqlConnection(_csMyServiceDD); 
     // Get task variables from database for comparison 
     string query = "SELECT TaskDay, TaskStartTime, TaskEndTime FROM MyService_TaskSchedule where TaskName = 'DoImport'"; 
     SqlCommand cmd1 = new SqlCommand(query, conn); 
     // opens the connection to read 
     conn.Open(); 
     SqlDataReader rdr1 = cmd1.ExecuteReader(); 
     while (rdr1.Read()) 
     { 
      TaskDay = rdr1.GetValue(0).ToString(); 
      TaskStartTime = rdr1.GetValue(1).ToString(); 
      TaskEndTime = rdr1.GetValue(2).ToString(); 
     } 
     // closing the connection 
     conn.Close(); 

     // setting _lastRun variable to this moment. 
     _lastRun = DateTime.Now; 
     // stop the timer 
     _timer.Stop(); 
     try 
     { 
      // check if the current time is within the time range for this service task. 
      if (DateTime.Now.DayOfWeek.ToString() == TaskDay && DateTime.Now > Convert.ToDateTime(TaskStartTime) && DateTime.Now < Convert.ToDateTime(TaskEndTime)) 
      { 
       _thread = new Thread(new ThreadStart(ImportData)); 
       _thread.Name = "ImportData"; 
       _thread.Start(); 
      } 
      // decide if there is something to do 
      #region Write to Audit Log 
      string Event = "Update Service"; 
      string DoneBy = "Automation User"; 
      string Information = "Update Service has started importing data."; 
      string MyTimeStamp = DateTime.Now.ToString(); 

      string writeit = "INSERT INTO MyService_Activities (Event, DoneBy, Information, TimeStamp) values(@Event, @DoneBy, @Information, @TimeStamp)"; 
      SqlCommand WriteLog = new SqlCommand(writeit, conn); 
      conn.Open(); 
      WriteLog.Parameters.AddWithValue("Event", Event); 
      WriteLog.Parameters.AddWithValue("DoneBy", DoneBy); 
      WriteLog.Parameters.AddWithValue("Information", Information); 
      WriteLog.Parameters.AddWithValue("TimeStamp", MyTimeStamp); 
      WriteLog.ExecuteNonQuery(); 
      conn.Close(); 
      #endregion 
     } 
     catch (Exception ex) 
     { 
      // Catch error and write to audit log 
      #region Write to Audit Log 
      string Event = "Update Service"; 
      string DoneBy = "Automation User"; 
      string Information = "Error occurred in Import - Message: " + ex.ToString() + ""; 
      string MyTimeStamp = DateTime.Now.ToString(); 

      string writeit = "INSERT INTO MyService_Activities (Event, DoneBy, Information, TimeStamp) values(@Event, @DoneBy, @Information, @TimeStamp)"; 
      SqlCommand WriteLog = new SqlCommand(writeit, conn); 
      conn.Open(); 
      WriteLog.Parameters.AddWithValue("Event", Event); 
      WriteLog.Parameters.AddWithValue("DoneBy", DoneBy); 
      WriteLog.Parameters.AddWithValue("Information", Information); 
      WriteLog.Parameters.AddWithValue("TimeStamp", MyTimeStamp); 
      WriteLog.ExecuteNonQuery(); 
      conn.Close(); 
      #endregion 
     } 
     _timer.Start(); 
    } 
+1

你需要改善你的問題。任何人都不可能爲你做代碼檢視,所以你需要向我們提供更多的信息(這需要記錄大量的調試/審計線索信息,以便你/我們可以弄清楚) – KevinDTimm 2014-10-17 18:07:57

回答

0

我重寫了整個事情,首先做了一個基本的服務啓動,然後我添加了我的代碼。現在運作良好。謝謝大家的提示和指針。

0

你確定你的catch {}按預期工作嗎?我懷疑你沒有得到任何反饋,因爲你的SQLConnection不能正常工作。嘗試做一個簡單的日誌記錄來排除它。

0

你的問題和標籤不會給我們太多的繼續。你正在使用C#?而且,我假設Visual Studio?

真正幫助我調試服務的是NLog

你可以通過NuGet安裝,初學者很容易。 只是許多優秀的教程之一。我寫信給普通的舊.txt文件。

您基本上在整個代碼中放入了一堆日誌註釋,然後嘗試啓動您的服務。當它失敗時,你打開日誌.txt,看看最後寫的東西是什麼。您現在知道它在該日誌行和下一個日誌行之間失敗。

在您對NLog感到滿意之後,您甚至可以在您的代碼中放入一個全局的,未處理的錯誤捕獲器,並將Exception寫入NLog,它會將StackTrace寫入您的日誌並提供更詳細的信息。您的NLog.config文件必須設置爲將Exception s格式化爲文本。