基于 C# Windows 服务未启动
C# based Windows Service not start
我的问题如下。我正在开发一个 Windows 服务,它需要从一台计算机收集数据并插入另一台机器上的 SQL 服务器(两台计算机都在同一个域中)。
我使用 InstallUtil.exe 安装服务没有任何问题,当我尝试从 "Services" window 启动服务后,我在事件日志中收到以下消息:
我理解错误消息,但我不明白为什么会收到此消息,因为我将 SQL 服务器登录配置为 混合模式 .
我开发了一个测试Windows表单应用程序,它可以很容易地从服务所在的计算机连接到SQL服务器。
这是我测试的代码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 服务器检查程序调用。
protected override void OnStart(string[] args)
{
while (SQL_ellenorzo_Class.Inditaskor_ellenoriz() == false) { }
}
SQL_ellenorzo_Class
这是 SQL 服务器检查器 class
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;
}
}
希望你能理解我的问题。如果您有任何问题,请问我。
SQL 服务器 未 配置为 SQL 身份验证,它只接受 Windows 身份验证,作为一项服务,您必须指定一个安装时的用户名和密码。
您需要更改连接字符串以删除用户名和密码或允许在服务器上进行 SQL 身份验证。
您是否启用了远程访问和创建新用户以连接到您的 sql 实例?
我的问题如下。我正在开发一个 Windows 服务,它需要从一台计算机收集数据并插入另一台机器上的 SQL 服务器(两台计算机都在同一个域中)。
我使用 InstallUtil.exe 安装服务没有任何问题,当我尝试从 "Services" window 启动服务后,我在事件日志中收到以下消息:
我理解错误消息,但我不明白为什么会收到此消息,因为我将 SQL 服务器登录配置为 混合模式 .
我开发了一个测试Windows表单应用程序,它可以很容易地从服务所在的计算机连接到SQL服务器。
这是我测试的代码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 服务器检查程序调用。
protected override void OnStart(string[] args)
{
while (SQL_ellenorzo_Class.Inditaskor_ellenoriz() == false) { }
}
SQL_ellenorzo_Class
这是 SQL 服务器检查器 class
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;
}
}
希望你能理解我的问题。如果您有任何问题,请问我。
SQL 服务器 未 配置为 SQL 身份验证,它只接受 Windows 身份验证,作为一项服务,您必须指定一个安装时的用户名和密码。
您需要更改连接字符串以删除用户名和密码或允许在服务器上进行 SQL 身份验证。
您是否启用了远程访问和创建新用户以连接到您的 sql 实例?