Windows服务和数据库连接

时间:2014-02-22 04:55:17

标签: c# database oracle windows-services onstart

(我是Windows服务的新手) 我有一个自动Windows服务,从数据库表中获取一些记录,为每个记录调用一个Web服务方法,并将方法的返回值和一些其他信息插入到表中。 我的问题列在下面:

1-当我尝试手动启动服务时,我得到Error 1053 (the service did not respond to the start or control request in a timely fashion)。顺便说一句,尽管错误服务启动并做了它必须做的事情。

2-(我知道这是一个常见的问题,但我更愿意再问一遍)服务是自动的,但取决于数据库连接。当服务运行的系统正在重启时,我必须手动启动它。我添加了Thread.Sleep()代码行以避免此问题。解决问题的真正方法是什么?

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

        //Creating event log
        plog = new System.Diagnostics.EventLog();
        if (!System.Diagnostics.EventLog.SourceExists("Prov"))
        {
            System.Diagnostics.EventLog.CreateEventSource("Prov", "ProvLog");
        }
        plog.Source = "Prov";
        plog.Log = "ProvLog";
        plog.Clear();
        Log("Service started at " + DateTime.Now.ToLongTimeString(), System.Diagnostics.EventLogEntryType.Information);

        class_ora_tran.int_class_ora_tran();
        DataTable dt;

        Thread.Sleep(300000); 

        while (true)
        {
            Con2DB();
            if (class_ora_tran.dbConnected())
            {
                RemoveOldRecords();
                dt = FetchRec();
                if (dt != null)
                {
                    if (dt.Rows.Count > BLKSize)
                        Bulk(dt);
                    else
                        Single(dt);
                }
            }
        }   
    }

3-虽然我编写了OnStop()方法,但在服务运行时没有Stop函数,我想停止它。 我还要提一下,我的服务始终处于启动模式,永远不会更改为已启动。

Protected void OnStop(string[] args)
    {
        class_ora_tran.Disconnect();
        Log("Service stoped at " + DateTime.Now.ToLongTimeString(), System.Diagnostics.EventLogEntryType.Information);
        plog.Close();
    }

4-时不时地,虽然状态正在开始,但我的服务停止了它必须做的事情并且不从表中获取记录。它发生过两次,不幸的是我忘了查看事件查看器以查看是否发生了一些错误。谁知道是什么原因?它与我上面提到的问题有关吗?

5-每次我想卸载服务时,我都要运行卸载命令两次! 有什么帮助吗?

修改 记录会有争议地插入到表中,并且只要向表中输入新记录,就应该完成调用Web服务等的过程。我认为需要一个While(真)循环。有没有建议更换这部分?

1 个答案:

答案 0 :(得分:2)

我会为您的服务提出一些建议。

  1. 让您的服务成为手动启动。因此,一旦您安装了该服务,您只需手动启动它一次。
  2. 启动后,您可以选择运行逻辑。

    。每隔X分钟http://www.codeproject.com/Questions/540617/windowsplusserviceplustoplusrunpluseveryplusoneplu

    运行一次

    。每天运行hh:mm Windows Service to run a function at specified time  。立即运行

  3. 将您的代码放入函数中并在Timer_Elapsed()函数中调用此函数,您可以在上面的链接示例中选择

  4. 使用OnStart设置计时器信息,读取配置文件等。

  5. 尝试使用Windows添加/删除程序删除该服务。 (创建安装程序msi以安装您的服务。保存命令行)How to create an installer for a .net Windows Service using Visual Studio