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=数据库源(IP地址);initial catalog=yccenter;user id=数据库账号;password=数据库密码;Integrated Security=False" providerName="System.Data.SqlClient"/> <add name="OracleConnString" connectionString="User ID=数据库账号;Password=数据库密码;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 数据库地址)(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() + " : 八点的服务同步数据结束! ", 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() + " : 十点的服务同步数据结束! ", 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:WindowsMicrosoft.NETFramework】中找到程序对应的.net版本,然后在该版本的目录中找到【InstallUtil.exe】程序,并将该程序拷贝到我们项目中的Debug目录下。与编译生成的CallSynchroData.exe文件放一起。
6.0 新建文本文件,并将名称改为安装服务.bat的批处理文件。
编辑批处理文件:输入 E:ProjectTestCallSynchroDataCallSynchroDatainDebugInstallUtil.exe CallSynchroData.exe
当然,这里需要将目录换成你自己程序所在的目录。保存,双击批处理文件。等待一段时间会出现提示安装成功的Dos窗口。此时,Windows服务就已经安装好了。
在任务管理器的服务中就可以找到当初命名的服务名称的服务了。选中该服务点击右键,启动服务就完成了。程序会在你代码设定的每天八点和十点整做你设定的任务。
卸载服务命令:新建一个批处理文件,将命令改为
E:ProjectTestCallSynchroDataCallSynchroDatainDebugInstallUtil.exe -u CallSynchroData.exe
这里需要将目录换成你自己程序所在的目录。保存,双击写文件,服务卸载成功!