zoukankan      html  css  js  c++  java
  • Topshelf+Quartz.net+Dapper+Npoi(二)

    quartznet 


      上篇说到quartznet这个东东,topshelf+quartznet有很多不错的文章,可以查看七七同学的文章(http://www.cnblogs.com/jys509/p/4628926.html)。这里我主要说说cron表达式,如果玩过linux下定时任务的肯定不陌生。

      官方英文介绍地址:http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html

      cron expressions 整体上还是非常容易理解的,只有一点需要注意:"?"号的用法,看下文可以知道“?”可以用在 day of month 和 day of week中,他主要是为了解决如下场景,如:每月的1号的每小时的31分钟,正确的表达式是:* 31 * 1 * ?,而不能是:* 31 * 1 * *,因为这样代表每周的任意一天。

      由7段构成:秒 分 时 日 月 星期 年(可选)
      "-" :表示范围  MON-WED表示星期一到星期三
      "," :表示列举 MON,WEB表示星期一和星期三
      "*" :表是“每”,每月,每天,每周,每年等
      "/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始
      "?" :只能出现在日,星期段里面,表示不指定具体的值
      "L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
      "W" :表示工作日,距离给定值最近的工作日
      "#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT)

      官方实例 

    ExpressionMeaning
    0 0 12 * * ? 每天中午12点触发
    0 15 10 ? * * 每天上午10:15触发
    0 15 10 * * ? 每天上午10:15触发
    0 15 10 * * ? * 每天上午10:15触发
    0 15 10 * * ? 2005 2005年的每天上午10:15触发
    0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
    0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
    0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
    0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
    0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
    0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
    0 15 10 15 * ? 每月15日上午10:15触发
    0 15 10 L * ? 每月最后一日的上午10:15触发
    0 15 10 L-2 * ? Fire at 10:15am on the 2nd-to-last last day of every month
    0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
    0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month
    0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
    0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
    0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.
    0 11 11 11 11 ? Fire every November 11th at 11:11am.

      

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
     6             HostFactory.Run(x =>
     7             {
     8                 x.UseLog4Net();
     9                 x.Service<ServiceRunner>();
    10                 x.RunAsLocalSystem();
    11 
    12                 x.SetDescription("Windows服务导出数据");
    13                 x.SetDisplayName("QuartzTopShelf");
    14                 x.SetServiceName("QuartzTopShelfService");
    15                 x.EnablePauseAndContinue();
    16 
    17             });
    18         }
    19     }
    View Code
     1 public class ServiceRunner : ServiceControl, ServiceSuspend
     2     {
     3         private readonly IScheduler scheduler;
     4 
     5         public ServiceRunner()
     6         {
     7             scheduler = StdSchedulerFactory.GetDefaultScheduler();
     8         }
     9 
    10         public bool Start(HostControl hostControl)
    11         {
    12             scheduler.Start();
    13             return true;
    14         }
    15 
    16         public bool Stop(HostControl hostControl)
    17         {
    18             scheduler.Shutdown(false);
    19             return true;
    20         }
    21 
    22         public bool Continue(HostControl hostControl)
    23         {
    24             scheduler.ResumeAll();
    25             return true;
    26         }
    27 
    28         public bool Pause(HostControl hostControl)
    29         {
    30             scheduler.PauseAll();
    31             return true;
    32         }
    33 
    34     }
    View Code

       Dapper 


      Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。

         Dapper优势: 

    1. 轻量。只有一个文件(SqlMapper.cs),编译完成之后只有120k(好象是变胖了)
    2. 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
    3. 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
    4. 可以映射一对一,一对多,多对多等多种关系。
    5. 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。
    6. 支持FrameWork2.0,3.0,3.5,4.0,4.5

          上篇已经说过我用dapper的原因,就是为了方便而已。(使用dapper可以不去考虑你的数据库是sqlserver还是mysql,上层只需要配置一下连接串就行,方便的很)

          直接上代码(用的是仓储模式):

         IRepository.cs  

     1  public interface IRepository<TEntity> where TEntity : class
     2     {
     3         object Insert(TEntity entity);
     4 
     5         void Insert(IList<TEntity> list);
     6 
     7         bool Update(TEntity entity);
     8 
     9         bool Delete(TEntity entity);
    10 
    11         TEntity GetEntity(int id);
    12 
    13         int GetCount(object predicate);
    14 
    15         /// <summary>
    16         /// 分页获取数据
    17         /// </summary>
    18         /// <param name="predicate"></param>
    19         /// <param name="page">页数</param>
    20         /// <param name="resultsPerPage">每页数量</param>
    21         /// <param name="sort">排序</param>
    22         /// <returns></returns>
    23         IList<TEntity> GetPageList(object predicate, int pageIndex, int pageSize, IList<ISort> sort);
    24 
    25     }
    View Code

        Repository.cs

     1 public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
     2     {
     3         private string _connName = null;
     4         /// <summary>
     5         /// 数据库连接名称
     6         /// </summary>
     7         public string connName { set { _connName = value; } }
     8 
     9         public object  Insert(TEntity entity)
    10         {
    11             using (var db = DbFactory.GetDatabase(_connName))
    12             {
    13 
    14                 return db.Insert(entity);
    15             }
    16         }
    17 
    18         public void Insert(IList<TEntity> list)
    19         {
    20             using (var db = DbFactory.GetDatabase(_connName))
    21             {
    22                 db.Insert<TEntity>(list);
    23             }
    24         }
    25 
    26         public bool Update(TEntity entity)
    27         {
    28             using (var db = DbFactory.GetDatabase(_connName))
    29             {
    30                 return db.Update(entity);
    31             }
    32         }
    33 
    34         public bool Delete(TEntity entity)
    35         {
    36             using (var db = DbFactory.GetDatabase(_connName))
    37             {
    38                 return db.Delete(entity);
    39             }
    40         }
    41 
    42         public IList<TEntity> GetList()
    43         {
    44             using (var db = DbFactory.GetDatabase(_connName))
    45             {
    46                 return db.GetList<TEntity>().ToList();
    47             }
    48         }
    49         public IList<TEntity> GetList(object predicate, IList<ISort> sort = null)
    50         {
    51             using (var db = DbFactory.GetDatabase(_connName))
    52             {
    53                 return db.GetList<TEntity>(predicate, sort).ToList();
    54             }
    55         
    56         }
    57         public IList<TEntity> GetPageList(object predicate, int pageIndex, int pageSize, IList<ISort> sort)
    58         {
    59             using (var db = DbFactory.GetDatabase(_connName))
    60             {
    61                 return db.GetPage<TEntity>(predicate, sort, pageIndex, pageSize).ToList();
    62             }
    63         }
    64 
    65         public int GetCount(object predicate)
    66         {
    67             using (var db = DbFactory.GetDatabase(_connName))
    68             {
    69                 return db.Count<TEntity>(predicate);
    70             }
    71         }
    72 
    73         public TEntity GetEntity(int id)
    74         {
    75             using (var db = DbFactory.GetDatabase(_connName))
    76             {
    77                 return db.Get<TEntity>(id);
    78             }
    79         }
    80         public TEntity GetEntity(string id)
    81         {
    82             using (var db = DbFactory.GetDatabase(_connName))
    83             {
    84                 return db.Get<TEntity>(id);
    85             }
    86         }
    87     }
    View Code

      DbFactory.CS

     1 public class DbFactory
     2     {
     3         /// 得到web.config里配置项的数据库连接字符串。  
     4         private static readonly ConnectionStringSettings _settings = ConfigurationManager.ConnectionStrings["XX"];
     5 
     6         public static IDbConnection GetDbConnection(string connName = null)
     7         {
     8             ConnectionStringSettings settings = _settings;
     9             if (connName != null)
    10                 settings = ConfigurationManager.ConnectionStrings[connName];
    11             if (settings == null)
    12                 throw new Exception("数据库连接字符串不能为空!");
    13             DbServerType type = (DbServerType)Enum.Parse(typeof(DbServerType), settings.ProviderName);
    14             return GetDbConnection(settings.ConnectionString, type);
    15         }
    16 
    17         public static IDbConnection GetDbConnection(string connStr, DbServerType type)
    18         {
    19             if (string.IsNullOrEmpty(connStr)) throw new Exception("数据库连接字符串不能为空!");
    20 
    21             IDbConnection conn = null;
    22             switch (type)
    23             {
    24                 case DbServerType.MsSqlServer:
    25                     conn = new SqlConnection(connStr);
    26                     break;
    27                 case DbServerType.MySQL:
    28                     conn = new MySqlConnection(connStr);
    29                     break;
    30                 case DbServerType.SQLite:
    31                 case DbServerType.Orcale:
    32                 case DbServerType.DB2:
    33                 case DbServerType.MongoDB:
    34                 default:
    35                     throw new NotImplementedException("尚未实现对该数据库的支持!");
    36             }
    37             conn.Open();
    38             return conn;
    39         }
    40 
    41         public static IDatabase GetDatabase(string connName = null)
    42         {
    43             ConnectionStringSettings settings = _settings;
    44             if (connName != null)
    45                 settings = ConfigurationManager.ConnectionStrings[connName];
    46             if (settings == null)
    47                 throw new Exception("数据库连接字符串不能为空!");
    48             DbServerType type = (DbServerType)Enum.Parse(typeof(DbServerType), settings.ProviderName);
    49             return GetDatabase(settings.ConnectionString, type);
    50         }
    51 
    52         public static IDatabase GetDatabase(string connStr, DbServerType type)
    53         {
    54             if (string.IsNullOrEmpty(connStr)) throw new Exception("数据库连接字符串不能为空!");
    55 
    56             IDbConnection conn = null;
    57             IDapperExtensionsConfiguration config = null;
    58             ISqlGenerator sqlGenerator = null;
    59 
    60             switch (type)
    61             {
    62                 case DbServerType.MsSqlServer:
    63                     conn = new SqlConnection(connStr);
    64                     config = new DapperExtensionsConfiguration(typeof(AutoClassMapper<>), new List<Assembly>(), new SqlServerDialect());
    65                     sqlGenerator = new SqlGeneratorImpl(config);
    66                     break;
    67                 case DbServerType.MySQL:
    68                     conn = new MySqlConnection(connStr);
    69                     config = new DapperExtensionsConfiguration(typeof(AutoClassMapper<>), new List<Assembly>(), new MySqlDialect());
    70                     sqlGenerator = new SqlGeneratorImpl(config);
    71                     break;
    72                 case DbServerType.SQLite:
    73                 case DbServerType.Orcale:
    74                 case DbServerType.DB2:
    75                 case DbServerType.MongoDB:
    76                 default:
    77                     throw new NotImplementedException("尚未实现对该数据库的支持!");
    78             }
    79             return new Database(conn, sqlGenerator);
    80         }
    81     }
    View Code

        NPOI


      npoi没什么好说的,直接nuget上下载dll,就可以使用了,有兴趣的可以下载源码看看,用它做一些excel的样式也是很方便的。   

     1  public static class NPOIHelper
     2     {
     3         public static void ExportToFile(DataSet dataSet, string fileFullPath)
     4         {
     5             List<DataTable> dts = new List<DataTable>();
     6             foreach (DataTable dt in dataSet.Tables) dts.Add(dt);
     7             ExportToFile(dts, fileFullPath);
     8         }
     9         public static void ExportToFile(DataTable dataTable, string fileFullPath)
    10         {
    11             List<DataTable> dts = new List<DataTable>();
    12             dts.Add(dataTable);
    13             ExportToFile(dts, fileFullPath);
    14         }
    15         public static void ExportToFile(IEnumerable<DataTable> dataTables, string fileFullPath)
    16         {
    17             IWorkbook workbook = new XSSFWorkbook();
    18             int i = 0;
    19             foreach (DataTable dt in dataTables)
    20             {
    21                 string sheetName = string.IsNullOrEmpty(dt.TableName)
    22                     ? "Sheet " + (++i).ToString()
    23                     : dt.TableName;
    24                 ISheet sheet = workbook.CreateSheet(sheetName);
    25 
    26                 IRow headerRow = sheet.CreateRow(0);
    27                 for (int j = 0; j < dt.Columns.Count; j++)
    28                 {
    29                     string columnName = string.IsNullOrEmpty(dt.Columns[j].ColumnName)
    30                         ? "Column " + j.ToString()
    31                         : dt.Columns[j].ColumnName;
    32                     headerRow.CreateCell(j).SetCellValue(columnName);
    33                 }
    34 
    35                 for (int a = 0; a < dt.Rows.Count; a++)
    36                 {
    37                     DataRow dr = dt.Rows[a];
    38                     IRow row = sheet.CreateRow(a + 1);
    39                     for (int b = 0; b < dt.Columns.Count; b++)
    40                     {
    41                         row.CreateCell(b).SetCellValue(dr[b] != DBNull.Value ? dr[b].ToString() : string.Empty);
    42                     }
    43                 }
    44             }
    45 
    46             using (FileStream fs = File.Create(fileFullPath))
    47             {
    48                 workbook.Write(fs);
    49             }
    50         }
    51 
    52         public static List<DataTable> GetDataTablesFrom(string xlsxFile)
    53         {
    54             if (!File.Exists(xlsxFile))
    55                 throw new FileNotFoundException("文件不存在");
    56 
    57             List<DataTable> result = new List<DataTable>();
    58             Stream stream = new MemoryStream(File.ReadAllBytes(xlsxFile));
    59             IWorkbook workbook = new XSSFWorkbook(stream);
    60             for (int i = 0; i < workbook.NumberOfSheets; i++)
    61             {
    62                 DataTable dt = new DataTable();
    63                 ISheet sheet = workbook.GetSheetAt(i);
    64                 IRow headerRow = sheet.GetRow(0);
    65 
    66                 int cellCount = headerRow.LastCellNum;
    67                 for (int j = headerRow.FirstCellNum; j < cellCount; j++)
    68                 {
    69                     DataColumn column = new DataColumn(headerRow.GetCell(j).StringCellValue);
    70                     dt.Columns.Add(column);
    71                 }
    72 
    73                 int rowCount = sheet.LastRowNum;
    74                 for (int a = (sheet.FirstRowNum + 1); a < rowCount; a++)
    75                 {
    76                     IRow row = sheet.GetRow(a);
    77                     if (row == null) continue;
    78 
    79                     DataRow dr = dt.NewRow();
    80                     for (int b = row.FirstCellNum; b < cellCount; b++)
    81                     {
    82                         if (row.GetCell(b) == null) continue;
    83                         dr[b] = row.GetCell(b).ToString();
    84                     }
    85 
    86                     dt.Rows.Add(dr);
    87                 }
    88                 result.Add(dt);
    89             }
    90             stream.Close();
    91 
    92             return result;
    93         }
    94     }
    View Code

       好了,就说到这里吧,欢迎拍砖。

      

  • 相关阅读:
    51nod 1087 1 10 100 1000(找规律+递推+stl)
    51nod 1082 与7无关的数 (打表预处理)
    51 nod 1080 两个数的平方和
    1015 水仙花数(水题)
    51 nod 1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    51 nod 1001 数组中和等于K的数对
    51 nod 1081 子段求和
    51nod 1134 最长递增子序列 (O(nlogn)算法)
    51nod 1174 区间中最大的数(RMQ)
  • 原文地址:https://www.cnblogs.com/jellyzhang/p/5744465.html
Copyright © 2011-2022 走看看