带数据库连接的Windows服务

时间:2015-02-16 06:16:53

标签: c#

我正在尝试简单的Windows服务它工作正常,直到没有与database.once连接我建立连接我的服务得到安装并启动成功,但无法正常工作,并没有得到停止。它抛出一个错误:“Windows无法停止本地计算机上的服务“。

以下是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Timers;
using System.Data;
using System.Data.SqlClient;

namespace tgfservice4
{
    public partial class tgfservice4 : ServiceBase
    {
        private static string con = "Data Source=ABC;Initial Catalog=ABC;User Id=ABC;Password=ABC";//ConfigurationManager.ConnectionStrings["ABCD"].ToString();
        private SqlConnection sn = new SqlConnection(con);

        private SqlCommand sm;
        Timer timer = new Timer();
        public tgfservice4()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            //add this line to text file during start of service
            TraceService("start service");

            //handle Elapsed event
            timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);

            //This statement is used to set interval to 1 minute (= 60,000 milliseconds)

            timer.Interval = 60000;

            //enabling the timer
            timer.Enabled = true;
        }

        protected override void OnStop()
        {
            timer.Enabled = false;
            TraceService("stopping service");
        }

        private void OnElapsedTime(object source, ElapsedEventArgs e)
        {
            TraceService("Another entry at " + DateTime.Now);
        }
        private void TraceService(string content)
        {


            sn.Open();
           // sm = new SqlCommand("Update_Table", sn);
          //  sm.CommandType = CommandType.StoredProcedure;
            try
            {
                //    sm.Parameters.AddWithValue("@value", "0");
                //    sm.ExecuteNonQuery();
            }
            catch
            {
                throw;
            }
            finally
            {
                sm.Dispose();
                sn.Close();
                sn.Dispose();
            }





            //set up a filestream
            FileStream fs = new FileStream(@"d:\MeghaService.txt", FileMode.OpenOrCreate, FileAccess.Write);

            //set up a streamwriter for adding text
            StreamWriter sw = new StreamWriter(fs);

            //find the end of the underlying filestream
            sw.BaseStream.Seek(0, SeekOrigin.End);

            //add the text
            sw.WriteLine(content);
            //add the text to the underlying filestream

            sw.Flush();
            //close the writer
            sw.Close();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我认为您的OnStop方法需要很长时间才能连接数据库并在该连接上进行操作。

一般来说,你应该在后台的另一个线程中进行繁重的操作。

通常,Windows服务中的OnStart和OnStop事件用于启动进程,耗时的进程将在子线程中执行它

如果启动时出现任何错误,那么服务可能会像这样。要首次亮相,您可以执行以下操作。

protected override void OnStart(string[] args)
{
     System.Diagnostics.Debugger.Launch();
     ...
}

然后将visual studio附加到流程并调试问题。

您也可以查看事件查看器中的系统和应用程序日志。

  
    

计算机/服务器管理器 - >事件查看器 - > Windows日志 - >应用

  

答案 1 :(得分:0)

如果在OnStop中引发异常,则服务控制管理器将不会卸载您的服务。因此,如果您在连接到数据库时遇到问题,只需将其记录在事件日志中,而不会引发更多错误。此外,如果尚未打开连接,请勿尝试关闭连接。关闭连接后添加try catch。最重要的是,确保OnClose中没有任何东西爆炸。