quartznet 上篇說到quartznet這個東東,topshelf+quartznet有很多不錯的文章,可以查看七七同學的文章(http://www.cnblogs.com/jys509/p/4628926.html)。這裡我主要說說cron表達式,如果玩過linux下定時任務的肯定不陌生。 ...
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)
官方實例
Expression | Meaning |
---|---|
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優勢:
- 輕量。只有一個文件(SqlMapper.cs),編譯完成之後只有120k(好象是變胖了)
- 速度快。Dapper的速度接近與IDataReader,取列表的數據超過了DataTable。
- 支持多種資料庫。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
- 可以映射一對一,一對多,多對多等多種關係。
- 性能高。通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象,性能不錯。
- 支持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
好了,就說到這裡吧,歡迎拍磚。