2015-02-05 102 views
0

我的問題如下。我正在開發一個Windows服務,它需要從一臺計算機收集數據並插入另一臺計算機上的SQL Server(兩臺計算機都在同一個域中)。基於C#的Windows服務未啓動

我安裝與InstallUtil.exe服務沒有任何問題後,當我嘗試從「服務」啓動服務窗口,我得到的事件日誌以下消息:

我瞭解錯誤消息,但我不明白爲什麼我會收到此消息,因爲我將SQL Server登錄名配置爲混合模式

我開發了一個測試Windows窗體應用程序,它可以很容易地從服務所在的計算機連接到SQL Server。

這是我測試的Windows窗體應用程序的連接上述代碼:

 private void button1_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       SqlConnection con = new SqlConnection(@"Data Source= SomeMachineNam\SQLEXPRESS;Initial Catalog=SomeDatabase;User ID=SomeUser;Password=SomePWD;"); 
       con.Open(); 

       if (con.State == ConnectionState.Open) 
       { 
        MessageBox.Show("OK"); 
       } 

       con.Close(); 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

,這是我不工作服務的片段:

的OnStart事件:

這是一個SQL Server檢查器調用。

protected override void OnStart(string[] args) 
    { 
      while (SQL_ellenorzo_Class.Inditaskor_ellenoriz() == false) { } 
    } 

SQL_ellenorzo_Class

這是SQL Server的檢查類

static class SQL_ellenorzo_Class 
{ 

    #region Globális változók 

    //A "Main" osztály példányosítása 
    static weight_checker_data_collector fo_osztaly = new weight_checker_data_collector(); 

    //Az SQL kapcsolat példányosítása. 
    static SqlConnection con = new SqlConnection(@"Data Source=" 
     + _3DES_dekodolo_Class.Decrypt(ConfigurationManager.AppSettings["data_source"]) 
     + ";Initial Catalog=" 
     + _3DES_dekodolo_Class.Decrypt(ConfigurationManager.AppSettings["initial_catalog"]) 
     + ";User ID=" 
     + _3DES_dekodolo_Class.Decrypt(ConfigurationManager.AppSettings["user_id"]) 
     + ";Password=" 
     + _3DES_dekodolo_Class.Decrypt(ConfigurationManager.AppSettings["password"]) 
     + ";"); 

    //Az indításkori kapcsolódási próbák száma. 
    internal static int kapcsolodasi_proba_indulaskor = 0; 

    //Mivel a leállás hosszab ideig tart, így 2x küldi el a végleges hiba üzenetet, így ezt kezelni kell, hogy el lett-e már küldve. 
    static bool vegleges_hiba_elkuldve = false; 

    #endregion 

    internal static bool Inditaskor_ellenoriz() 
    { 
     //Azámláló növelése, amely az indítási próbákat számolja. 
     kapcsolodasi_proba_indulaskor++; 

     //A szervíz nevének meghatározása és beállítása a 'Servicecontroller'-nek. 
     int processId = System.Diagnostics.Process.GetCurrentProcess().Id; 
     ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service WHERE ProcessId = " + processId); 
     ManagementObjectCollection collection = searcher.Get(); 
     fo_osztaly.Servicecontroller.ServiceName = (string)collection.Cast<ManagementBaseObject>().First()["Name"]; 

     //A gép nevének megadása a Servicecontroller-nek. 
     fo_osztaly.Servicecontroller.MachineName = Environment.MachineName; 

     try 
     { 
      //A kapcsolat megnyitása. 
      con.Open(); 

      if (con.State == System.Data.ConnectionState.Open) 
      { 
       //A kapcsolat lezárása. 
       con.Close(); 
      } 

      //A visszatérési érték 'true'. 
      return true; 
     } 

     catch 
     { 
      //Ha 30-szor egymás után nem érhető el az SQL szerver, akkor e-mailt küld. 
      if (kapcsolodasi_proba_indulaskor > 30) 
      { 
       //Ha még nem lett elküldve a végleges hiba. 
       if (vegleges_hiba_elkuldve == false) 
       { 
        //Hibaüzenet az EventLog-ba, hogy nem tudott kapcsolódni az SQL szerverhez és most leáll. 
        fo_osztaly.Eventlog.WriteEntry("At startup the service cannot connect to the SQL server and now will stop. Please check it!", EventLogEntryType.Error); 

        //El lett küldve a végleges hiba. 
        vegleges_hiba_elkuldve = true; 

        //E-mail arról, hogy az elinduláskor nem tudott kapcsolódni az SQL szerverhez. 
        E_mail_kuldo_Class.Email_kuldes("SQL Server connecting error", "At the startup the Anritsu Data Collector service could not connect to the SQL Server. Please check it!"); 
       } 
      } 

      //Ha még csak kevesebb, mint 30-szor vagy pont annyiszor próbált meg kapcsolódni az SQL szerverhez, akkor gyűjti az adatokat egy változóba. 
      else if (kapcsolodasi_proba_indulaskor <= 30) 
      { 
       //Írja az EventLog-ba, hogy hány sikertelen csatlakozási próba volt az SQL szerverhez. 
       fo_osztaly.Eventlog.WriteEntry("The " + kapcsolodasi_proba_indulaskor.ToString() + "/30 trying to connect to the SQL server is failed. ", EventLogEntryType.Error); 
      } 

      //A folyamat várjon 1 másodpercet. 
      Thread.Sleep(2000); 

      //Rekurzívan meghívja saját magát a metódus. 
      Inditaskor_ellenoriz(); 

      //Visszatérés 'Hamis' értékkel. 
      return false; 
     } 
    } 

我希望你能理解我的問題。如果您有任何問題,請問我。

+0

與您當前的問題沒有直接關係,但您的服務代碼錯誤。你打算在30秒內從'OnStart'返回。不要坐在無盡的循環中。如果你想讓代碼保持運行,那麼你有責任創建線程來運行該代碼。 –

+0

謝謝你,你的回覆我會修改它。 :) – Gabor

+0

嘗試使用管理員帳戶運行該服務並查看會發生什麼情況。也許問題與運行服務的用戶的權限有關。 – JotaBe

回答

1

您是否啓用遠程訪問並創建新用戶以連接到您的sql實例?

+0

當然可以。 – Gabor

+0

試試這個鏈接的答案: http:// stackoverflow。com/questions/6643720/add-login-and-connect-to-sql-with-sql-server-authentication – virusivv

+0

我不知道爲什麼,但我放棄了我的舊用戶並創建了一個新的用戶,現在它運行良好,但我真的不明白爲什麼我會使用相同的權利和設置。 – Gabor

0

SQL服務器是而不是配置爲SQL身份驗證,它只接受Windows身份驗證,作爲服務,您必須在安裝時指定用戶名和密碼。

您需要更改連接字符串以刪除用戶名和密碼或允許在服務器上執行SQL身份驗證。

+0

SQL Server可以接受SQL身份驗證。我允許混合模式,所以這不應該成爲問題。 – Gabor

+0

@Gabor,看看你的事件日誌。它說只允許窗口驗證:) –

+0

是的,我知道它。這就是我發佈我的問題的原因。 – Gabor