【问题标题】:C# based Windows Service not start基于 C# 的 Windows 服务无法启动
【发布时间】:2015-02-05 17:22:14
【问题描述】:

我的问题如下。我正在开发一个 Windows 服务,它需要从计算机收集数据并插入到另一台机器上的 SQL Server 中(两台计算机都在同一个域中)。

我使用 InstallUtil.exe 安装服务没有任何问题,当我尝试从“服务”窗口启动服务后,我在 EventLog 中收到以下消息:

我了解错误消息,但不明白为什么会收到此消息,因为我将 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);
            }
       }

这是我不工作的服务的 sn-p:

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;
        }
    }

我希望你能理解我的问题。有什么问题可以问我。

【问题讨论】:

  • 与您当前的问题没有直接关系,但您的服务代码错误。你应该在 30 秒内从 OnStartreturn。不要坐在一个无休止的循环中。如果您希望代码继续运行,您有责任创建线程来运行该代码。
  • 谢谢您的回复我会修改的。 :)
  • 尝试使用管理员帐户运行服务,看看会发生什么。也许问题与运行服务的用户的权限有关。

标签: c# sql sql-server windows service


【解决方案1】:

您是否启用了远程访问和创建新用户以连接到您的 sql 实例?

【讨论】:

  • 试试这个链接的答案:stackoverflow.com/questions/6643720/…
  • 我不知道为什么,但我删除了我的旧用户并创建了一个新用户,现在它运行良好,但我真的不明白为什么因为我使用相同的权限和设置。
  • 感谢您的合作。 :)
【解决方案2】:

SQL 服务器配置为 SQL 身份验证,它只接受 Windows 身份验证,作为一项服务,您必须在安装时指定用户名和密码。

您需要更改连接字符串以删除用户名和密码或允许在服务器上进行 SQL 身份验证。

【讨论】:

  • SQL Server 可以接受 SQL 身份验证。我允许混合模式,所以这应该不是问题。
  • @Gabor,查看您的事件日志。它说只允许窗口身份验证:)
  • 是的,我知道。这就是我发布问题的原因。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多