Topshelf+Quartz.net+Dapper+Npoi(二)

来源:http://www.cnblogs.com/jellyzhang/archive/2016/08/06/5744465.html
-Advertisement-
Play Games

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)

  官方實例 

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

 

   好了,就說到這裡吧,歡迎拍磚。

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 運行環境:CentOS6.7 故障原因: 昨天線上執行命令yum -y update 在命令執行途中,強制中斷並直接運行poweroff命令關機。再次開機出現如圖所示故障指示: 根據提示信息分析,可能因為執行更新命令未完成導致系統內核信息混亂。 故障解決方案: 插入系統光碟,修改主板BIOS從光碟機引 ...
  • Linux學習筆記——基於鳥哥的Linux私房菜 ***** ARM與嵌入式linux的入門建議 (1) 學習基本的裸機編程:ARM7或ARM9,理解硬體架構和控制原理 (這一步是絕對的根基) (2) 使用Linux系統進行一些基本的實驗 (3) 研究完整的Linux系統的運行過程 : 完整Linu ...
  • 在WEB開發時,網站是以 的用戶運行的,而我在本地是以 的用戶編輯的。這就帶來一個問題:如果所有文件屬於 ,那麼網站運行需要寫文件時就因 無許可權而失敗 ;如果所有文件屬於 ,那麼 則需要 獲取許可權才能寫進去 。最鬱悶的是使用git合併的時候,如果忘了加 ,就會因許可權不足提示大量的合併失敗,需要先回滾 ...
  • 第一步:安裝anaconda anaconda自帶一系列科學計算包 下載鏈接:http://pan.baidu.com/s/1b4jWlg 密碼:fqq3 接著配置環境變數:如我安裝在D盤下 試一下命令行啟動,確保ipython從anaconda啟動 第二步:安裝spark(需要提前安裝JDK) 到 ...
  • 使用Symantec Backup Exec將幾台Linux伺服器上的RMAN備份收帶時,偶爾會遇到作業備份失敗的情況,檢查Job History,就會發現有“Access denied to directory u05/backup/backupsets" 這類錯誤,當然實際路徑為/u05/bac ...
  • 本萌新剛學習到如何os x跳轉頁面 先創建一個項目 選擇os x 創建一叫skip的項目 打開Mai.storyboard,拉入一個view controller 拉入一個button ,然後按著control 然後顯示出,我選擇modal,(這些你們慢慢試,我也不太知道) 選擇後就會出現 點擊bu ...
  • 用nopcomerce3.8版本的同行註意了,前2天發佈3.8正式版後,作者收到一些BuG,作者修複後重新提供了一個源代碼包下載地址,不是github上的那個鏈接。去作者官網論壇我那個鏈接地址,或關註微信公眾號aspnetcore發消息獲取鏈接地址。我們只能幫你到這了 原文地址:http://www ...
  • MVVM學習筆記 1、MVVM的簡介 MVVM模式是Model-View-ViewModel模式的簡稱,也就是由模型(Model)、視圖(View)、視圖模型(ViewModel),其目的是為了實現將業務和界面分開,降低耦合度。 2、示例(綁定TextBox和Combox控制項) 總體結構: View ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...