这是一个备份数据库的服务, 逻辑很简单, 就是通过定时器实现在特定的时间执行 SQL 语句备份数据库, 并将每一步操作的情况写入日志文件.
- 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.Data.SqlClient;
- namespace DataBaseService
- {
- public partial class DataBakService : ServiceBase
- {
- public DataBakService()
- {
- InitializeComponent();
- }
- // 定时器
- System.Timers.Timer tmBak = new System.Timers.Timer();
- // 服务器启动时写日志, 开启定时器
- protected override void OnStart(string[] args)
- {
- using (System.IO.StreamWriter sw = new System.IO.StreamWriter("D:\\log.txt", true))
- {
- sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "DATABASENAME Service Start.");
- }
- // 到时间的时候执行事件
- tmBak.Interval = 60000;// 一分钟执行一次
- tmBak.AutoReset = true;// 执行一次 false, 一直执行 true
- // 是否执行 System.Timers.Timer.Elapsed 事件
- tmBak.Enabled = true;
- tmBak.Start();
- tmBak.Elapsed += new System.Timers.ElapsedEventHandler(SQLBak);
- }
- private void SQLBak(object source, System.Timers.ElapsedEventArgs e)
- {
- // 如果当前时间是 10 点 30 分
- if (DateTime.Now.Hour == 9 && DateTime.Now.Minute == 50)
- {
- string sql = string.Format(@"
- BACKUP DATABASE DATABASENAME
TO DISK = N'E:\DBBak\DATABASENAME {0}{1}{2}.bak'-- 目录一定要存在
WITH INIT , NOUNLOAD ,
NAME = N'数据库备份', -- 名字随便取
- NOSKIP ,
- STATS = 10,
- NOFORMAT", DateTime.Now.Year,DateTime.Now.Month,DateTime.Now.Day);
- try
- {
- using (System.IO.StreamWriter sw = new System.IO.StreamWriter("D:\\log.txt", true))
- {
- sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "正在备份 DATABASENAME 数据库......");
- }
- SqlConnection conn = new SqlConnection("server=127.0.0.1;uid=sa;pwd=44545454;database=DATABASENAME");
- conn.Open();
- SqlCommand cmd = new SqlCommand(sql, conn);
- cmd.CommandTimeout = 0;
- cmd.ExecuteNonQuery();
- conn.Close();
- }
- catch (Exception ex)
- {
- using (System.IO.StreamWriter sw = new System.IO.StreamWriter("D:\\log.txt", true))
- {
- sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "备份 DATABASENAME 数据库出现异常:" + ex.Message);
- return;
- }
- }
- using (System.IO.StreamWriter sw = new System.IO.StreamWriter("D:\\log.txt", true))
- {
- sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "备份 DATABASENAME 数据库成功!");
- }
- }
- }
- // 服务停止时写日志
- protected override void OnStop()
- {
- using (System.IO.StreamWriter sw = new System.IO.StreamWriter("D:\\log.txt", true))
- {
- sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " DATABASENAME
- Service Stop.");
- }
- }
- }
- }
- View Code
服务命令:
安装:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowService 所在目录 \ WindowService.exe
- Net Start ServiceEFNETSYS
- sc config ServiceEFNETSYS start= auto
卸载:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowService 所在目录 \ WindowService.exe
--- 如果需要查看脚本运行状况, 在脚本最后一行加入 pause
View Code
安装 InstallUtil.exe 工具
打开 cmd 窗口分别执行
cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe window 服务所在目录 / windows 服务. exe
sc 命令
打开 cmd 窗口执行
sc create 服务名称 binPath="windows 服务项目的 bin\Release 下. exe 文件地址" start=auto binPath = 后面有个空格
卸载 InstallUtil.exe 工具
cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe -u window 服务所在目录 / windows 服务. exe
sc 命令 sc delete 服务名称
******************************************************************************
可以通过 sc 命令或者注册表删除服务名
命令行删除 windows 系统服务办法一:
用 sc.exe 这个 Windows 命令
开始 -- 运行 --cmd.exe, 然后输入 sc 就可以看到了. 使用办法很简单:
sc delete "服务名" (如果服务名中间有空格, 就需要前后加引号)
如针对上面的: sc delete KSD2Service
注册表删除 windows 系统服务方法二:
直接进行注册表编辑 (不推荐)
打开注册表编辑器, 找到下面的键值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 一般服务会以相同的名字在这里显示一个主健, 直接删除相关的键值便可.
PS: 特殊情况
1, 如果服务显示的是 rundll32.exe, 并且这个文件是位于 system32 目录下, 那么就不能删除这个 rundll32.exe 文件, 它是 Windows 系统的文件. 这时只要清除相关的服务就可以了
2, 如果一个服务删除了马上又自动建立了, 说明后台有进程在监视, 保护. 需要先在进程管理器中杀掉相应的进程, 或者启动后按 F8, 到安全模式下删除.
来源: http://www.bubuko.com/infodetail-2651345.html