我的Windows服务应用程序在启动时没有运行(ODBC, c#, Visual Studio 2008)

本文关键字:ODBC Visual 2008 Studio 运行 应用程序 服务 Windows 启动 我的 | 更新日期: 2023-09-27 18:03:09

我刚刚写了一个程序作为Windows服务应用程序运行,GasMeterMonitoring;但是,当我在本地机器上启动这个应用程序时,什么也没有发生。
程序应该从另一台计算机上的MS Access数据库中获取数据,然后将该数据插入Oracle数据库。
我不确定为什么这不起作用。有什么想法会导致这个不正常运行?我之前创建了一个非常类似的服务,工作得很好。
不同之处在于所有数据都位于一台机器上,而在此代码中有两台独立的机器。此外,我使用计时器与此代码。为了设置我的定时器,我使用了下面的Microsoft服务应用程序演练指南和一个定时器代码的改编。我只是想请你帮我把整件事搞清楚。

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.Timers;
using System.Data.Odbc;
using System.Data.SqlClient;
using System.Data.OracleClient;
using System.IO;


namespace GasMeterMonitoring
{
public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
        if(!System.Diagnostics.EventLog.SourceExists("GasMeterSourse"))
            System.Diagnostics.EventLog.CreateEventSource("GasMeterSourse", "MeterLog");
        eventLog1.Source = "GasMeterSourse";
        eventLog1.Log = "MeterLog";
    }        
    protected override void OnStart(string[] args)
    {
        eventLog1.WriteEntry("GasMeterMonitoring is reporting.");            
        timer1.Interval = 60000;
        timer1.Enabled = true;
        timer1.Start();
    }
    protected override void OnContinue()
    {
        eventLog1.WriteEntry("GasMeterMonitoring is reporting again");
    }
    protected override void OnPause()
    {
        eventLog1.WriteEntry("GasMeterMonitoring reporting has been paused");
    }
    protected override void OnStop()
    {
        timer1.Enabled = false; 
        eventLog1.WriteEntry("GasMeterMonitoring reporting has stopped");
    }
    protected override void OnShutdown()
    {           
        eventLog1.WriteEntry("GasMeterMonitoring reporting has stopped due to computer shutdown");
    }
    public void EmailError(string ErrorMessage)
    {
        try
        {
            System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
            message.To.Add("ladante.riley@severstalna.com");
            message.Subject = "An error occured in GasMeterMonitoring.exe service";
            message.From = new System.Net.Mail.MailAddress("ladante.riley@severstalna.com");
            message.Body = ErrorMessage;
            System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("DBN-EX03.severstalco.com");
            smtp.UseDefaultCredentials = true;
            smtp.EnableSsl = true;
            smtp.Send(message);
        }
        finally 
        {
            // End-user will contact me otherwise
        }
    } 
    private void timer1_Tick(object sender, EventArgs e)
    {
        try
        {
            // ODBC connect strings 
            string connectionString = "Dsn=TakeCharge";
            string connString = "DSN=IDBS1;Uid=rouge;Pwd=steel";
            string sqlins = "";
            // Variables to be later placed inside the INSERT INTO query
            string dayTime = "";
            string hsmt = "";
            string boft = "";
            string eaft = "";
            string j9st = "";
            string lmbt = "";
            string fbst = "";
            string fcbt = "";
            string fdwpt = "";
            string fdept = "";
            string fdbt = "";
            string ffat = "";
            string ffpt = "";
            string fdnpt = "";
            string ftdt = "";
            string fppt = "";
            string fgpt = "";
            string hsmr = "";
            string bofr = "";
            string eafr = "";
            string j9sr = "";
            string lmbr = "";
            string fbsr = "";
            string fcbr = "";
            string fdwpr = "";
            string fdepr = "";
            string fdbr = "";
            string ffar = "";
            string ffpr = "";
            string fdnpr = "";
            string ftdr = "";
            string fppr = "";
            string fgpr = "";
            // Creates a MS Access ODBC and Oracle ODBC connection                             
            OdbcConnection conn = new OdbcConnection(connString);
            OdbcConnection DbConnection = new OdbcConnection(connectionString);
            OdbcCommand DbCommand = DbConnection.CreateCommand();
            DbConnection.Open();
            // Checks to see that the MS Access ODBC connection is open                
            if (DbConnection.State == ConnectionState.Open)
            {
                eventLog1.WriteEntry("MS ACCESS connection is " + DbConnection.State);
                DbCommand.CommandText = "SELECT Data.[Date / Time],DATA.[Hot Strip Mill Total],Data.[Basic Oxygen Furnace Total],Data.[Electro-Arc Furnace Total],Data.[J-9 Shop Total],Data.[Levy Maintence Building Total],Data.[Ford Body Shop Total], Data.[Ford Chiller Building Total],Data.[Ford Dearborn W Plant Total],Data.[Ford Dearborn E Plant Total], Data.[Ford Dearborn Balcony Total], Data.[Ford Final Assembly Total],Data.[Ford Frame Plant Total], Data.[Ford Dearborn N Plant Total],Data.[Ford Tool and Die Total], Data.[Ford Paint Plant Total],Data.[Ford Glass Plant Total], DATA.[Hot Strip Mill Rate], Data.[Basic Oxygen Furnace Rate], Data.[Electro-Arc Furnace Rate],Data.[J-9 Shop Rate],Data.[Levy Maintence Building Rate],Data.[Ford Body Shop Rate],Data.[Ford Chiller Building Rate],Data.[Ford Dearborn W Plant Rate],Data.[Ford Dearborn E Plant Rate],Data.[Ford Dearborn Balcony Rate],Data.[Ford Final Assembly Rate],Data.[Ford Frame Plant Rate],Data.[Ford Dearborn N Plant Rate],Data.[Ford Tool and Die Rate],Data.[Ford Paint Plant Rate],Data.[Ford Glass Plant Rate]FROM DATA";
                // Accesses data from the MS Access ODBC connection then establishes a field counter to cycle through every column for every row
                OdbcDataReader DbReader = DbCommand.ExecuteReader();
                int fCount = DbReader.FieldCount;
                OdbcCommand cmdnon = new OdbcCommand(sqlins, conn);
                conn.Open();
                // Checks to see that the Oracle ODBC connection is open
                if (conn.State == ConnectionState.Open)
                {
                    eventLog1.WriteEntry("ORACLE connection is" + conn.State); 
                    // Create parameters for the Oracle ODBC connection
                    cmdnon.Parameters.Add(dayTime, OdbcType.DateTime);
                    cmdnon.Parameters.Add(hsmt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(boft, OdbcType.Numeric);
                    cmdnon.Parameters.Add(eaft, OdbcType.Numeric);
                    cmdnon.Parameters.Add(j9st, OdbcType.Numeric);
                    cmdnon.Parameters.Add(lmbt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fbst, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fcbt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fdwpt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fdept, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fdbt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(ffat, OdbcType.Numeric);
                    cmdnon.Parameters.Add(ffpt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fdnpt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(ftdt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fppt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fgpt, OdbcType.Numeric);
                    cmdnon.Parameters.Add(hsmr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(bofr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(eafr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(j9sr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(lmbr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fbsr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fcbr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fdwpr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fdepr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fdbr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(ffar, OdbcType.Numeric);
                    cmdnon.Parameters.Add(ffpr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fdnpr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(ftdr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fppr, OdbcType.Numeric);
                    cmdnon.Parameters.Add(fgpr, OdbcType.Numeric);
                    // Performs the insert query on the Oracle ODBC connection
                    while (DbReader.Read())
                    {
                        // Sets my variable equal to the values that are grabbed from the MS Access database table
                        dayTime = DbReader.GetString(0);
                        hsmt = DbReader["Hot Strip Mill Total"].ToString();
                        boft = DbReader["Basic Oxygen Furnace Total"].ToString();
                        eaft = DbReader["Electro-Arc Furnace Total"].ToString();
                        j9st = DbReader["J-9 Shop Total"].ToString();
                        lmbt = DbReader["Levy Maintence Building Total"].ToString();
                        fbst = DbReader["Ford Body Shop Total"].ToString();
                        fcbt = DbReader["Ford Chiller Building Total"].ToString();
                        fdwpt = DbReader["Ford Dearborn W Plant Total"].ToString();
                        fdept = DbReader["Ford Dearborn E Plant Total"].ToString();
                        fdbt = DbReader["Ford Dearborn Balcony Total"].ToString();
                        ffat = DbReader["Ford Final Assembly Total"].ToString();
                        ffpt = DbReader["Ford Frame Plant Total"].ToString();
                        fdnpt = DbReader["Ford Dearborn N Plant Total"].ToString();
                        ftdt = DbReader["Ford Tool and Die Total"].ToString();
                        fppt = DbReader["Ford Paint Plant Total"].ToString();
                        fgpt = DbReader["Ford Glass Plant Total"].ToString();
                        hsmr = DbReader["Hot Strip Mill Rate"].ToString();
                        bofr = DbReader["Basic Oxygen Furnace Rate"].ToString();
                        eafr = DbReader["Electro-Arc Furnace Rate"].ToString();
                        j9sr = DbReader["J-9 Shop Rate"].ToString();
                        lmbr = DbReader["Levy Maintence Building Rate"].ToString();
                        fbsr = DbReader["Ford Body Shop Rate"].ToString();
                        fcbr = DbReader["Ford Chiller Building Rate"].ToString();
                        fdwpr = DbReader["Ford Dearborn W Plant Rate"].ToString();
                        fdepr = DbReader["Ford Dearborn E Plant Rate"].ToString();
                        fdbr = DbReader["Ford Dearborn Balcony Rate"].ToString();
                        ffar = DbReader["Ford Final Assembly Rate"].ToString();
                        ffpr = DbReader["Ford Frame Plant Rate"].ToString();
                        fdnpr = DbReader["Ford Dearborn N Plant Rate"].ToString();
                        ftdr = DbReader["Ford Tool and Die Rate"].ToString();
                        fppr = DbReader["Ford Paint Plant Rate"].ToString();
                        fgpr = DbReader["Ford Glass Plant Rate"].ToString();
                        cmdnon.CommandText = "insert into NAT_GAS_READINGS( HSM_TOTAL,BOF_TOTAL,EAF_TOTAL,J9_SHOP_TOTAL,LEVY_TOTAL,BODY_SHOP_TOTAL,CHILLER_BLDG_TOTAL,WPLANT_TOTAL,EPLANT_TOTAL,BALCONY_TOTAL,FINAL_ASSEMBLY_TOTAL,FRAME_PLANT_TOTAL,NPLANT_TOTAL,TOOL_DIE_TOTAL,PAINT_PLANT_TOTAL,GLASS_PLANT_TOTAL,HSM,BOF,EAF,J9_SHOP,LEVY,BODY_SHOP,CHILLER_BLDG,WPLANT,EPLANT,BALCONY,FINAL_ASSEMBLY,FRAME_PLANT,NPLANT,TOOL_DIE,PAINT_PLANT,GLASS_PLANT,DATETIME) values (to_number('" + hsmt + "'), to_number('" + boft + "'), to_number('" + eaft + "'), to_number('" + j9st + "'), to_number('" + lmbt + "'),to_number('" + fbst + "'),to_number('" + fcbt + "'), to_number('" + fdwpt + "'), to_number('" + fdept + "'), to_number('" + fdbt + "'), to_number('" + ffat + "'), to_number('" + ffpt + "'), to_number('" + fdnpt + "'), to_number('" + ftdt + "'), to_number('" + fppt + "'), to_number('" + fgpt + "'), to_number('" + hsmr + "'), to_number('" + bofr + "'), to_number('" + eafr + "'), to_number('" + j9sr + "'), to_number('" + lmbr + "'), to_number('" + fbsr + "'), to_number('" + fcbr + "'), to_number('" + fdwpr + "'), to_number('" + fdepr + "'), to_number('" + fdbr + "'), to_number('" + ffar + "'), to_number('" + ffpr + "'), to_number('" + fdnpr + "'), to_number('" + ftdr + "'), to_number('" + fppr + "'), to_number('" + fgpr + "'), to_date('" + dayTime + "', 'yyyy-mm-dd HH24:MI:SS' ))";
                        int rowsAffected = cmdnon.ExecuteNonQuery();                           
                    }
                    //Closes the ODBC connections
                    conn.Close();
                    DbReader.Close();
                    DbCommand.Dispose();
                    DbConnection.Close();
                }
                else
                {
                    eventLog1.WriteEntry("ORACLE connection is "+ conn.State);
                }
            }
            else
            {
                eventLog1.WriteEntry("MS ACCESS connection is " + DbConnection.State);
            }
        }
        catch (Exception ex)
        {
            // Sends an error to the event log, and email, the error to me regarding what is wrong.
            eventLog1.WriteEntry(ex.ToString(), EventLogEntryType.Error);               
            EmailError(ex.ToString() +"'n"+ "(" + ex.InnerException.ToString() + ")");                                
        }
        finally
        {
            eventLog1.WriteEntry("Gas Meter monitoring is functioning properly.");
        }        
    }
}
}

我的Windows服务应用程序在启动时没有运行(ODBC, c#, Visual Studio 2008)

当显式地声明计时器和经过的处理程序时会发生什么

private System.Timer timerX;
void timerX_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer1_Tick(); // alternativley copy the code from timer1_Tick...
}
并在OnStart: 中实例化它
timerX = new System.Timers.Timer();
timerX.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
timerX.Interval = 60000;
timerX.Enabled = true;

为定时器调用Start()与设置Enabled =true ;相同

您的事件处理程序称为_tick,但从MSDN上看,我只能看到一个经过的事件。如果这是你正在处理的事件,那么看起来你的EventArgs是错误的。如果你看一下你提到的计时器文章的评论它说:

我无法让这个工作,直到我改变事件参数方法timer1_elapsed到System.Timers.ElapsedEventArgs e

也许这就是原因?

就我个人而言,我以前开发过一个Windows服务,它是一个棘手的野兽。我建议将代码放在类库中,然后从那里调用它。然后可以编写控制台应用程序和windows服务。你可以运行控制台程序来测试你的代码,你将能够调试它,而且你不需要停止/卸载/安装/启动来测试每个版本。

当你确信你的代码正在做你所期望的,然后你可以弹出它在服务中并安装它。如果您正在处理任何类型的文件系统访问,存储的cfg路径,注册表操作或其他此类基于权限的操作,您可能会在它按预期工作之前遇到一些进一步的障碍:)

在我离开之前,我想说的最后一件事是,你应该考虑这真的是一个Windows服务还是一个计划任务。如果你需要定期运行一些内容并报告信息,那么你应该编写一个控制台应用并将其添加为计划任务。如果你需要构建一个总是可用的东西,并提供一个服务,比如一个需要监控传入连接的服务器,或者一个需要知道什么时候上传的文件夹监视,那么你应该写一个服务。

我没有看到主方法在你的代码?你有吗,把它从你的问题中省略掉?

publci static void Main()
{
    ServiceBase.Run(new Service1());
}