在VS2012中新建WindowsService定时任务

1.0 打开VS2013,选择文件->新建->项目。在项目中找到windows服务项目,重新命名后点击确定。

2、在service1设计器中点击右键,选择查看代码,进入代码页面。

2.1 设置App.config(数据库连接字符串和参数)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
    </startup>
  <connectionStrings>
    <add name="SqlConnString" connectionString="data source=172.16.251.34;initial catalog=yccenter;user id=ycliulei30963;password=ycliulei30963_1123V223s9;Integrated Security=False"
         providerName="System.Data.SqlClient"/>
    <add name="OracleConnString" connectionString="User ID=IPS;Password=IPS20150309;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.251.32)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = TEST0321)))"
      providerName="System.Data.OracleClient" />
  </connectionStrings>

  <appSettings>
    <add key="logFilePath" value="D:\ycSynchroDatalog\" />

  </appSettings>
</configuration>

2.2 从appconfig中获取sql server数据库和oracle数据库的连接字符串,以及配置的一些参数。并设置Timer控件

 //Sql server连接字符串
        private static string strSqlConnection = System.Configuration.ConfigurationManager.ConnectionStrings["SqlConnString"].ConnectionString;
        //Oracle连接字符串
        private static string strOracleConnection = System.Configuration.ConfigurationManager.ConnectionStrings["OracleConnString"].ToString();
        //日志文件路径
        private static string logFilePath = System.Configuration.ConfigurationManager.AppSettings["logFilePath"].ToString() + DateTime.Now.ToString("yyyyMMdd") + @"\logSynchroData.txt";

        //八点开启的服务Timer控件
        System.Timers.Timer SoSoftTimer = new System.Timers.Timer(1000);
        //十点开启的服务Timer控件
        System.Timers.Timer startTenTimer = new System.Timers.Timer(1000);

2.3 在代码编辑器中添加【OnStart】服务启动方法。

   protected override void OnStart(string[] args)
        {
            // TODO: 在此处添加代码以启动服务。
            SoSoftTimer.Elapsed += SoSoftTimer_Elapsed;
            SoSoftTimer.Start();//开始计时器
            SoSoftTimer.Enabled = true;

            startTenTimer.Elapsed += startTenTimer_Elapsed;
            startTenTimer.Start();

            startTenTimer.Enabled = true;
        }

2.4 添加【OnStop】服务结束方法

  protected override void OnStop()
        {

            startTenTimer.Enabled = false;
            SoSoftTimer.Enabled = false;

        }

2.5

除此之外还有一个Program.cs文件:打开看下。

使得一个Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点。在Windows服务程序中,我们也是在Main()函数中完成这个操作的。首先我们在Main()函数中创建一个Windows服务的实例,该实例应该是ServiceBase类的某个子类的对象,然后我们调用由基类ServiceBase类定义的一个Run()方法。然而Run()方法并不就开始了Windows服务程序,我们必须通过前面提到的服务控制管理器调用特定的控制功能来完成Windows服务程序的启动,也就是要等到该对象的OnStart()方法被调用时服务才真正开始运行。如果你想在一个Windows服务程序中同时启动多个服务,那么只要在Main()函数中定义多个ServiceBae类的子类的实例对象就可以了,方法就是创建一个ServiceBase类的数组对象,使得其中的每个对象对应于某个我们已预先定义好的服务。

   /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new ServiceData(),
                new Service2() 

            };
            ServiceBase.Run(ServicesToRun);
        }

2.6  添加八点的时候运行的方法StartEightTimer_Elapsed

void StartEightTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            int intHour = e.SignalTime.Hour;
            int intMinute = e.SignalTime.Minute;
            int intSecond = e.SignalTime.Second;

            //判断是否同步数据(八点)
            if (intHour == 8 && intMinute ==00 && intSecond ==00)
            {
                WriteTxtFile(DateTime.Now.ToLongTimeString() + " : 八点的服务开始同步数据!", logFilePath);
                CallSqlToOracle("八点的");
                WriteTxtFile(DateTime.Now.ToLongTimeString() + " : 八点的服务同步数据结束!\r\n", logFilePath);
            }
        }

2.7 添加十点的时候运行的方法startTenTimer_Elapsed

 void startTenTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            int intHour = e.SignalTime.Hour;
            int intMinute = e.SignalTime.Minute;
            int intSecond = e.SignalTime.Second;

            //判断是否同步数据(十点)
            if (intHour ==10 && intMinute == 00 && intSecond == 00)
            {
                WriteTxtFile(DateTime.Now.ToLongTimeString() + " : 十点的服务开始同步数据!", logFilePath);

                CallSqlToOracle("十点的");

                WriteTxtFile(DateTime.Now.ToLongTimeString() + " : 十点的服务同步数据结束!\r\n", logFilePath);
            }
        }

2.8 添加同步数据的方法CallSqlToOracle

 

  1  /// <summary>
  2         /// 同步数据方法
  3         /// </summary>
  4         /// <param name="number">几点开启的服务</param>
  5         public void CallSqlToOracle(string number)
  6         {
  7             int DataCount = 0;
  8             SqlConnection sqlConn = new SqlConnection(strSqlConnection);
  9             sqlConn.Open();
 10
 11             string strSql = "SELECT  grid,i_count,nowtime FROM IPS_View_SourceDetail";
 12
 13             SqlCommand sqlCommand = sqlConn.CreateCommand();
 14             sqlCommand.CommandText = strSql;
 15             sqlCommand.CommandType = CommandType.Text;
 16
 17             SqlDataAdapter sqlAdapter = new SqlDataAdapter();
 18             sqlAdapter.SelectCommand = sqlCommand;
 19
 20             DataSet ds = new DataSet();//创建数据集;
 21             sqlAdapter.Fill(ds);//填充数据集
 22
 23             string strMessageBody = string.Empty;   //消息内容
 24             string employeeID = string.Empty;        //员工工号
 25             string reportCount = string.Empty;       //报告数量
 26             string strNowTime = string.Empty;       //时间
 27
 28             #region    搬运数据
 29             //判断数据集是否为空
 30             if (ds.Tables[0].Rows.Count > 0 && ds != null)
 31             {
 32                 OracleConnection oracleConn = new OracleConnection(strOracleConnection);
 33                 oracleConn.Open();
 34                 foreach (DataRow dsRow in ds.Tables[0].Rows)
 35                 {
 36                     int result = 0;
 37
 38
 39                     DateTime nowTime = Convert.ToDateTime(dsRow["nowtime"]);
 40
 41                     string strOracle = "INSERT INTO IPS_SEND_QUEUE(QUEUE_SEQID,SERVICE_ID,USER_ID,SUBSCRIBE_TYPE,MESSAGE_BODY,RECEIVE_TIME,NEED_SENDTIME,SEND_FLAG,SEND_NUM)"
 42                     + "VALUES(SEQ_Ips_Send_Queue_Id.Nextval,:SERVICE_ID,:USER_ID,:SUBSCRIBE_TYPE,:MESSAGE_BODY,:RECEIVE_TIME,:NEED_SENDTIME,:SEND_FLAG,:SEND_NUM)";
 43
 44
 45                     OracleParameter[] prams = new OracleParameter[] {
 46                         new OracleParameter("SERVICE_ID",OracleType.Number),
 47                         new OracleParameter("USER_ID",OracleType.NVarChar),
 48                         new OracleParameter("SUBSCRIBE_TYPE", OracleType.Number),
 49                         new OracleParameter("MESSAGE_BODY", OracleType.Clob),
 50                         new OracleParameter("RECEIVE_TIME", OracleType.DateTime),
 51                         new OracleParameter("NEED_SENDTIME",OracleType.DateTime),
 52                         new OracleParameter("SEND_FLAG",OracleType.Number),
 53                         new OracleParameter("SEND_NUM",OracleType.Number),
 54                     };
 55
 56                     reportCount = dsRow["i_count"].ToString();
 57                     employeeID = dsRow["grid"].ToString();
 58                     strNowTime = nowTime.ToString("yyyy-MM-dd hh:mm:ss");
 59                     strMessageBody = string.Format("尊敬的:{0},您好,截至{1}您有{2}份报告4小时后将超时,请及时登录系统审批,谢谢!", employeeID, strNowTime, reportCount);
 60
 61
 62                     prams[0].Value = 100;
 63                     prams[1].Value = employeeID;
 64                     prams[2].Value = 1;
 65                     prams[3].Value = strMessageBody;
 66                     prams[4].Value = nowTime;
 67                     prams[5].Value = nowTime;
 68                     prams[6].Value = 0;
 69                     prams[7].Value = 0;
 70
 71
 72
 73                     OracleCommand oracleCommand = oracleConn.CreateCommand();
 74                     oracleCommand.CommandText = strOracle;
 75                     oracleCommand.CommandType = CommandType.Text;
 76
 77                     if (prams.Length > 0)
 78                     {
 79                         oracleCommand.Parameters.AddRange(prams);
 80                     }
 81
 82                     try
 83                     {
 84                         result = oracleCommand.ExecuteNonQuery();
 85                         if (result > 0)
 86                         {
 87                             DataCount++;
 88                         }
 89                     }
 90                     catch (Exception ex)
 91                     {
 92                         WriteTxtFile(DateTime.Now.ToLongTimeString() + " : " + number + "的服务插入失败!" + ex.Message, logFilePath);
 93                     }
 94                 }
 95
 96                 oracleConn.Close();
 97
 98             }
 99             else
100             {
101                 WriteTxtFile(DateTime.Now.ToLongTimeString() + " : " + number + "的服务插入失败!没有数据可进行同步", logFilePath);
102             }
103             #endregion
104             sqlConn.Close();
105             WriteTxtFile(DateTime.Now.ToLongTimeString() + " : " + number + "的服务一共同步了" + DataCount + "条数据!", logFilePath);
106         }

同步数据方法

2.9  添加日志方法  WriteTxtFile

 1       /// <summary>
 2         /// 写日志文件
 3         /// </summary>
 4         /// <param name="message">日志内容</param>
 5         /// <param name="filePath">日志路径</param>
 6         public void WriteTxtFile(string message, string filePath)
 7         {
 8
 9             string strPath = Path.GetDirectoryName(filePath);
10             if (!Directory.Exists(strPath))
11             {
12                 Directory.CreateDirectory(strPath);
13             }
14
15             FileStream fsWrite = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
16
17             StreamWriter sw = new StreamWriter(fsWrite, System.Text.Encoding.UTF8);
18             sw.WriteLine(message);//开始写入值
19
20             sw.Close();  //关闭流
21             fsWrite.Close();
22         }

添加日志方法

3.0   在service1中的设计器中点击右键,选择【添加安装程序】。

4.0  在安装程序中选中【serviceProcessInstaller1】,查看其属性,将【Account】值改为【LocalSystem】。

在安装程序中选中【serviceInstaller1】,查看其属性,将【ServiceName】值改为你想要的服务名称。

【Description】值是服务的介绍,【DescriptionName】值是服务的名称。

5.0  编译生成项目。

在目录【C:\Windows\Microsoft.NET\Framework】中找到程序对应的.net版本,然后在该版本的目录中找到【InstallUtil.exe】程序,并将该程序拷贝到我们项目中的Debug目录下。与编译生成的CallSynchroData.exe文件放一起。

6.0 新建文本文件,并将名称改为安装服务.bat的批处理文件

编辑批处理文件:输入  E:\ProjectTest\CallSynchroData\CallSynchroData\bin\Debug\InstallUtil.exe CallSynchroData.exe

当然,这里需要将目录换成你自己程序所在的目录。保存,双击批处理文件。等待一段时间会出现提示安装成功的Dos窗口。此时,Windows服务就已经安装好了。

在任务管理器的服务中就可以找到当初命名的服务名称的服务了。选中该服务点击右键,启动服务就完成了。程序会在你代码设定的每天八点和十点整做你设定的任务。

卸载服务命令:新建一个批处理文件,将命令改为

E:\ProjectTest\CallSynchroData\CallSynchroData\bin\Debug\InstallUtil.exe -u CallSynchroData.exe

这里需要将目录换成你自己程序所在的目录。保存,双击写文件,服务卸载成功!

时间: 2024-10-10 03:28:34

在VS2012中新建WindowsService定时任务的相关文章

VS2012中丢失ArcGIS模板的解决方法

由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjects SDK for the Microsoft.NET Framework后,在VS2012中新建项目或添加窗口(类等)是没有ArcGIS模板.解决方法如下: 1.安装ArcGIS10.0会自动生成C:\Program Files\Microsoft Visual Studio 10.0文件夹,将文件夹中的Common7\IDE\ItemTe

vs2012中配置和使用boost库

vs2012中配置和使用boost库 一.配置: 1.到www.boost.org下载boost库源代码,完成之后解压,我放置的路径是f:\install. 2.打开vs2012,点击"工具"->"visual studio 命令提示",弹出命令行 3.切换到install\boost_1_55_0路径下,在命令行输入bootstrap,便生成bjam.exe,保存在boost_1_55_0目录下 4.在命令行输入bjam toolset=msvc-12.0

在VS2012中采用C++中调用DLL中的函数 (4)

这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人Blog在C++中调用DLL中的函数(1)(2)(3) 但是问题出现了,上面讲述的步骤很详细但是在自己运行的时候却会出现错误,于是今天在使用google“vs2012 c++调用dll”时,发现了一篇MSDN上的指南:http://msdn.microsoft.com/zh-cn/library/m

在VS2012中采用C++中调用DLL中的函数(4)

转自:http://www.cnblogs.com/woshitianma/p/3683495.html 这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人Blog在C++中调用DLL中的函数(1)(2)(3) 但是问题出现了,上面讲述的步骤很详细但是在自己运行的时候却会出现错误,于是今天在使用google"vs2012 c++调用dll"

DICOM医学图像处理:DCMTK在VS2012中的配置

背景: 最近由于项目需要,将原本的开发IDE环境由VS2008升级到了VS2012.本以为编译完成后的DCMTK开源库可以直接从VS2008移植到VS2012.但是通过项目属性添加完包含目录和依赖库后,编译会出现大量的链接错误(大多是跟dcmdata.lib.oflog.lib有关). 解决方法: 重新按照原本的博客前辈柳北风儿(大神目前已经博客转移到网易:http://blog.163.com/[email protected]/),利用CMake工具,选择VS2012本地编译器对DCMTK3

Maven入门1-在Eclipse中新建Maven Web项目

在eclipse中新建Maven Web项目 很多时候开发效率低下,大部分原因是IDE环境不熟悉.配置不会配置:因此在学习一项技能之前,有必要对基本的环境配置有所了解,正所谓磨刀不误砍柴工.这篇文章主要针对初次接触Maven,不熟悉配置的研究人员. 1.Maven配置及介绍 Maven官网:http://maven.apache.org/ 以前开发Java Web工程时,需要导入很多依赖包,但是随着工程逐渐变大,所管理的包越来越多,有必要使用工具来管理这些包,这样不需要我们手动导入:Maven就

在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库

http://www.cnblogs.com/huangtailang/p/4221164.html 背景:个人电脑中使用的是VS2012,数据库为2008R2,最近需要打开一个SqlServer2012的数据库 如果在本机安装一个2012的数据库可能比较浪费时间,本来是想在如万网等服务商那边购买一个2012的数据库来使用的,但发现目前的服务商最高提供的数据库为2008R2 既然不想安装新的数据库版本那就只能在现在的环境中想办法了,还好在VS2012中提供了一个本地的数据库引擎于是尝试通过201

在Azure中新建Linux

开始学习Linux,这里开个系列用来记录Linux的学习笔记,这些是在实验楼:https://www.shiyanlou.com/的学习笔记. 这一篇是在Azure中新建一个Ubuntu的服务器用于练手,Ubuntu是Linux的一个发行版本. 一.打开Azure portal,新建->计算->Ubuntu Server->创建 随后会弹出一些配置供用户填写 1.基本 名称是在Azure中用来区分不同资源的名字,随便填个,这主要你自己记得就好. 下面的用户名就是用来登陆的服务器的用户名,

MyEclipse使用总结——在MyEclipse中新建Maven框架的web项目[转]

前面的文章我们已经在本机安装好了maven,同时在myeclipse中配置好了maven的插件. 链接如下: Maven安装----在Windows上安装Maven myeclipse安装maven插件 现在我们就开始在myeclipse中新建一个maven框架的web项目 新建项目 填写项目名称,一定记得勾选Add Maven support (java EE如果选取5.0报错,则选6.0) 我们的maven项目就新建好了,相关基本的依赖已经在pom.xml中.项目机构如下: 可能出现的错误及