Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
本地计算机上的c#服务启动后停止_C#_Mysql_Windows Services - Fatal编程技术网

本地计算机上的c#服务启动后停止

本地计算机上的c#服务启动后停止,c#,mysql,windows-services,C#,Mysql,Windows Services,我是新来的。 我使用c#创建了一个windows服务来连接mySQL数据库。当我运行该服务时,它会给我如图中所示的错误,并且不会更改数据库中的任何内容。 这是我的代码: namespace WindowsService1 { public partial class Watcher : ServiceBase { public Watcher() { InitializeComponent(); }

我是新来的。 我使用c#创建了一个windows服务来连接mySQL数据库。当我运行该服务时,它会给我如图中所示的错误,并且不会更改数据库中的任何内容。 这是我的代码:

namespace WindowsService1
{
    public partial class Watcher : ServiceBase
    {
        public Watcher()
        {
            InitializeComponent();
        }

    protected override void OnStart(string[] args)
    {
        Write();
    }

    protected override void OnStop()
    {
    }

    public void Write()
    {
        MySqlConnection connection = new MySqlConnection("Host=--;User=--;Password=--;Database=--;Convert Zero Datetime=True");

        connection.Open();
        var command = connection.CreateCommand();
        command.CommandType = System.Data.CommandType.Text;
        command.CommandText = " UPDATE messured-values SET belong_to = 'Doaa'";
        command.ExecuteNonQuery();
        Console.WriteLine("done");

    }
}
错误如下图所示 谢谢你的帮助


错误是因为您没有正确编码服务的使用。但这不是你在这件事上的主要问题。这是一个假阳性,您仍然需要找到潜在的错误

对于Windows服务,
OnStart
方法应仅用于启动进程,而不是实际运行任何将自行处理的代码

服务在其生命周期中具有以下状态

  • 运行
  • 停顿
  • 停止
  • OnStart方法应该将服务从停止或暂停(如果支持)状态移动到运行状态,并且应该相当快地返回

    因此,第一件事是将代码移动到一个单独的线程中。即使只是执行一次

    protected override void OnStart(string[] args)
    {
        var task = Task.Run(() =>{
                Write();
         });
    }
    
    然后更新写入方法以捕获异常,使用参数,然后记录错误

    try
    {
            using (MySqlConnection connection = new MySqlConnection("Host=--;User=--;Password=--;Database=--;Convert Zero Datetime=True"))
            {
                connection.Open();
                using (var command = connection.CreateCommand())
                {
                    command.CommandType = System.Data.CommandType.Text;
                    command.CommandText = " UPDATE messured-values SET belong_to = @belong";
                    command.Parameters.Add("@belong", SqlDbType.VarChar).Value = "Doaa";
                    command.ExecuteNonQuery();
                }
                connection.Close();
            }
        }
        catch(Exception e)
        {
            //Log e.Message to a Log output file for debug purposes/
        }
    

    您需要编写将错误输出到调试日志文件或类似文件的方法。

    写入中的代码是否引发异常?将其包装在一个
    try/catch
    中,看看会发生什么。如@DavidG所示,您很可能遇到异常-请使用try/catch或检查windows事件日志中的异常。我试图检查windows事件日志,但出现以下错误:服务无法启动。MySql.Data.MySqlClient.MySqlException(0x80004005):您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解使用第1行的near'-values SET BENEL_to='Doaa''的正确语法。谢谢,错误与查询的语法有关。@Doaa是的,就像我说的,您发布的错误是误报。但请注意上面的代码,因为您误用了服务的OnStart方法,并且您还有其他错误,例如未关闭Db连接、SQL注入不安全等,这将在以后导致您出现问题。如果不在本代码中,则在下一个项目中!是的,你是对的,当然,我的代码没有以良好的方式实现,但我以前有很多问题,我写代码只是为了尝试小查询而不关闭连接。关于onStart方法,在它里面我称之为write()方法,这不是一个好方法吗!?如果我有两个连接,对于两个数据库,例如first connection,我将运行查询以获取值,然后使用second connection将该值插入第二个数据库。你知道我怎么做吗?