【问题标题】:c# service on local computer started and then stopped本地计算机上的 c# 服务启动然后停止
【发布时间】:2020-03-27 23:35:44
【问题描述】:

我是这个员工的新人。 我使用 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");

    }
}

以及如下图所示的错误 感谢您的帮助。

【问题讨论】:

  • Write中的代码是否抛出异常?将其包裹在 try/catch 中,看看会发生什么。
  • 正如@DavidG 所指出的,您很可能遇到了异常 - 使用 try / catch 或检查 Windows 事件日志中的异常。
  • 我试图检查windows事件日志并且出现这个错误:服务无法启动。 MySql.Data.MySqlClient.MySqlException (0x80004005):您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以获取正确的语法,以便在第 1 行的 '-values SET belongs_to =' Doaa '' 附近使用

标签: c# mysql windows-services


【解决方案1】:

错误是因为您没有正确编码服务的使用。但这不是您在这种情况下的主要问题。这是误报,您仍然需要找到潜在的错误。

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

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

  1. 正在运行
  2. 暂停
  3. 已停止

OnStart 方法应该将服务从 Stopped 或 Paused(如果支持)状态转移到 Running 状态,并且应该很快返回。

所以第一件事是将代码移动到一个单独的线程中。哪怕只执行一次。

protected override void OnStart(string[] args)
{
    var task = Task.Run(() =>{
            Write();
     });
}

然后更新您的 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/
    }

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

【讨论】:

  • 谢谢,错误与查询的语法有关。
  • @Doaa 是的,就像我说的那样,您发布的错误是误报。但是请注意上面的代码,因为您的代码误用了Service的OnStart方法,并且您还有其他错误,例如未关闭Db连接,不安全地防止SQL注入等,这将在以后给您带来问题。如果不在这段代码中,在下一个项目中!
  • 是的,你是对的,我的代码没有很好地实现,但我之前有很多问题,我写只是为了尝试小查询而不关闭连接。关于 onStart 方法,在里面我调用 write( ) 方法,是不是好方法!?
  • 如果我有两个连接,对于 2 个数据库,例如,第一个连接,我将运行查询以获取值,然后使用第二个连接将此值插入到第二个数据库。你知道我该怎么做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多