在單元測試專案使用 dynamic 出現 CSharpArgumentInfo.Create 錯誤
在自動測試專案加入使用 dynamic 型別的測試方法後,Visual Studio 2017 傳回編譯錯誤:Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'在 Microsoft Connect 查到相似錯誤回報,案例集中在微軟單位測試及 NUnit...
View Article【茶包射手日記】Visual Studio 編譯自動帶入相依 DLL 問題
同事報案,在 Visual Studio 從私有 NuGet 伺服器安裝我寫的共用元件,該元件參照了 Managed ODP.NET 但沒在 NuGet Package 宣告相依性,理論上不會一併安裝 Managed ODP.NET NuGet Package,但同事發現建置後 bin 目錄卻神奇地出現 Oracle.ManagedDataAccess.dll。試著在我的電腦演練相同操作,bin...
View Article筆記:C# 6.0 自動實作屬性初始化與運算式主體定義
專案裡有個在父類別宣告 virtual List<string> MyProp { get; } = new List<string>(); ,接著在子類別 override MyProp, Visual Studio 2017 自動帶出 List<string> MyProp => base.MyProp; 。(術語為 Expression Body...
View Article擴充方法參數傳入 dynamic 型別出錯
呼叫擴充方法時傳入 dynamic 型別參數,發生以下錯誤:'Blah' has no applicable method named 'ExtMethod' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider...
View Article程式範例-使用 Json.NET 將 Key/Value 陣列轉為物件屬性
專案遇到的需求:程式接收來自外界的 JSON 資料,物件之各屬性內容以 KeyValuePair<string, string> 陣列儲存,序列化結果如下:{"modType": [ {"Key": "I","Value": "獨立模組" }, {"Key": "J","Value": "聯合模組" } ], "source": [ {"Key": "I","Value": "內部"...
View Article方法多載(Method Overloading)與 dynamic
方法多載(Overloading)是指多個名稱相同但參數個數或型別不同的方法,編譯器依傳入參數的個數、型別與順序決定使用哪一個方法。概念上多載讓方法變得更彈性,能接受不同參數組合,符合更多應用情境。舉個常見的例子,Convert.ToByte() 可傳入 int, short, string, float, double, decimal, char… 等輸入值,將其轉成 byte,傳入...
View ArticleJson.NET 日期型別時區問題之終極解法
一直以來常被 JSON 日期序列化時區問題困擾,問題主要發生於從資料庫查詢日期欄位,轉為 .NET DateTime 型別時其 Kind 屬性為 Unspecified,而以 DateTime.Now、DateTime.Today 取得的日期物件,Kind 則為 Local,二者不一致可能導致前端出現 8 小時時差。為解決問題,先前想到的做法是先宣告...
View ArticleSQL 資料轉 INSERT 語法-使用 Visual Studio
將資料表內容轉成一連串 INSERT 語法,是蠻好用的跨伺服器搬資料表招式,之前我最愛用的工具是 SQL Dumper,但昨天聽到不幸消息:官方網站人去樓空,連註冊的 DNS 網域都已棄守。重新尋找替代方案,找到三種做法:SSMS 內建 Generate Script 功能 接著透過 Wizard 介面指定資料表並設定只輸出資料(Types of data to script: Data only)...
View Article古董點陣印表機套表列印經驗
工作多年,第一次遇到用撞針式印表機套表印單據的需求。身為具有30 年個人電腦使用資歷,MS-DOS 3.1 年代下海的老人,當然摸過用過還買過點陣式印表機,但都已 2017 年,便宜的黑白雷射印表機 2500 元就有,作業系統也來到 Windows 10,再回頭使用 20 年高齡的點陣式印表機,就是很新奇的體驗。題外話:講到點陣式印表機,就不免想起學生時代痴心妄想 DIY...
View Article再談集保罕用字集與 BIG5 造字區
同事遇到集保罕集問題,我試著解釋個中奧妙時冒出一堆「集保罕字的X」「Unicode標準字的X」「看起來一樣但編碼不同」把同事薰得七葷八素,感覺都快吐了… 嗯,寫篇文章細說從頭吧。很久很久以前,在 Unicode 還沒一統天下之前,BIG5是台灣地區的主流中文編碼,其中定義 13,053 個常用字與次常用字與 441...
View ArticleC# 連線 HTTPS 網站發生驗證失敗導致基礎連接已關閉
某台透過 .NET WebClient 物件爬網頁抓資料排程忽然出現:基礎連接已關閉: 傳送時發生未預期的錯誤。 ---> System.IO.IOException: 驗證失敗,因為遠端群體已經關閉傳輸資料流。 The underlying connection was closed: An unexpected error occurred on a send. --->...
View ArticleTIPS-調整 SQL Agent 作業記錄筆數限制
查詢 SQL Agent 排程執行問題時,發現一個狀況:使用 Log File Viewer 查詢作業記錄(Job History Log),大部分排程的執行歷程都是空的(如下圖),只有少數幾個排程有內容:研究後學到一件事-SQL Agent Job History 有預設筆數限制,預設值為所有排程作業總共 1000 筆,每項排程作業最多 100...
View Article筆記-T-SQL 分頁查詢並傳回總筆數
資料庫查詢結果要做分頁,我較常用的做法是拉到 C# 端將物件陣列或 List<T> 存入 MemoryCache,用 .Length 可以取總筆數,用 Skip(pageSize * (pageNo - 1)).Take(pageSize) 取回指定頁數資料,換頁或排序時從 MemoryCache...
View Article小技巧-使用匿名型別快速捏出指定JSON格式
同事有個小需求,已知城市、區域及郵遞區號要產生如下規格的 JSON 餵到前端:{"rows": {"row": [ {"City": "台北市","Area": "文山區","ZIP": "116" } ] }}先前介紹過 JObject 結合 dynamic 的花式玩法可以快速達成目標:staticvoid TestJObject(string city, string area, string...
View ArticleViewBag dynamic 特性導致無法使用 LINQ 語法
寫 ASP.NET MVC CSHTML 時,我很習慣用 ViewBag 將變數從 Controller 傳到 View 端,只是簡單傳遞幾個字串、數值,為此大費周章宣告 Model 型別有點殺雞用牛刀。我們都知道 ViewBag 是一個 dynamic 型別,而 dynamic 型別的屬性、方法也會被視為 dynamic,編譯階段不檢查,執行階段見真章。不過,最近學到一件事:一旦函式參數傳入...
View Articledynamic 參數之效能損耗實測
依據前篇文章:參數傳入 dynamic 會讓函式傳回值也變成 dynamic,導致無法使用 LINQ Lambda 運算式。文末提到,依據方法多載(Method Overloading)與 dynamic一文的研究心得,.NET 呼叫函式時若遇到參數為 dynamic 時,將改用System.Runtime.CompilerServices、System.CSharp.RuntimeBinder...
View ArticleReporting Service 報表 List 區塊使用多資料表
Reporting Service RDLC 報表設計進階議題一枚。先說情境,假設有技能專長與擅長語言兩個資料表,其中有每個人的資料,想在 RDLC 報表採以下形式呈現:先印出姓名,接著以表格形式分別列出技能清單與語言清單:這類需求,最直覺有效的做法是使用子報表!很不幸,同事嘗試用子報表解決卻踼到鐵板:明細資料總筆數約 2000 筆,拆成 500...
View ArticleDictionary 多執行緒存取衝突吃光 CPU
這是一個老鳥失足,程式沒寫好吃光 CPU 的故事。開始前推薦大家兩篇先修知識:WinDBG 應用實例:找出 ASP.NET CPU 100% 原因ASP.NET CPU 飆高問題之傻瓜分析工具-DebugDiag Tools接獲通報,某主機在離峰時段出現 CPU 維持 50% 高檔狀況,來源則是某個 ASP.NET AppPool Process。依照 SOP,先擷取 Memory Dump...
View Article小筆記-避免 ThreadAbortException 的Response.End() 替代寫法
一個古老問題,在 ASP.NET 呼叫 Response.End() 會觸發 ThreadAbortException,假警報常會干擾偵錯與問題追查,之前寫過文章但沒整理完整的替代方案,今天補上筆記。使用以下程式重現問題,WebForm 網頁包含一枚按鈕,按下時透過 AJAX 呼叫同一程式,Page_Load() 事件遇 Request["m"] == "ajax" 時...
View Article小技巧-當集合型別不支援 LINQ 擴充方法
用慣 LINQ 後不太能忍受回頭用 foreach 處理集合物件,List<T>、IEnumerable<T> 及物件陣列可直接 Where()、Select() ,基本上涵蓋大部分應用情境,但有些時候還是會遇到一些不支援 LINQ 擴充方法的集合物件。這篇筆記將介紹透過簡單轉換讓集合支援 LINQ 的小技巧。(別像我以前傻傻先 var list = new...
View Article