# [112]天方科技 ASP.net core 教育訓練 1120316(c#教材簡介、SQL Server使用) ## C#微軟官方教材章節簡介 以WPF(Windows Presentation Foundation)為主,會與Web注重點略有不同 ![](https://i.imgur.com/fZEbRew.png) ![](https://i.imgur.com/88b2DQr.png) ### Module 1-Module 5 是C#程式語言說明 ### Module 1 C#語法簡介 ### Module 2 建立方法/函式 例外狀況處理:錯誤訊息回報 應用程式監控:紀錄程式運作log ### Module 3 圖形介面的事件處理 ### Module 4 建立型別 型別安全集合:泛型 ### Module 5 建立類別階層─使用繼承 物件導向特性─ 封裝:資料保存於物件內部,透過特定程序操作 繼承:一個類別會有**子類別**,子類別比父類別要更加具體化,類別只能繼承自一個類別,但是實作時可以多數,例犬(父)→中華田園犬(子) 多形:以一個基礎型別,操作所有繼承自此基礎型別的特定類型,各類型對相同訊息,做出不同動作 ### Module 6之後是使用.NET提供的物件做資料存取 ### Module 6 本地端資料讀寫 ### Module 7 存取資料庫 ### Module 8 遠端存取資料:透過Http、Client、Web Request等方式,存取遠端Json、XML、Html資料 ### Module 9 同**Module 3**進階語法使用 ### Module 10 改善應用程式效率─同步、非同步、多工等 ### Module 11 介紹不受控碼(Unmanned code):不受 .NET Framework環境管理的程式 參考: [**什麼是 Managed 程式碼?**](https://learn.microsoft.com/zh-tw/dotnet/standard/managed-code) ### Module 12 可重複使用型別 組建:使用VS建立專案時,編譯後會產生 .exe或者 .dll檔,這兩個檔案是 .NET執行時的基本單位,每個獨立編譯的檔案,都可以透過 .exe/.dll 合成組建成應用程式,本章介紹不透過VS工具如何製作程式產生器 ### Module 13 介紹 .NET資料加密/解密 參考: [**微軟官網學習C#**](https://learn.microsoft.com/zh-tw/dotnet/csharp/) ## SQL Server ### Table關聯圖建立 ![](https://i.imgur.com/frJTZNu.png) ### 選擇table ![](https://i.imgur.com/b4cl4PN.png) ![](https://i.imgur.com/kYQIvLB.png) ### 關聯F Key,將主資料表要關聯的欄位點擊拖曳至目標資料表(無須對準欄位) ![](https://i.imgur.com/8XUrM8q.png) ### 欄位名稱一樣會自動鎖定欄位 ![](https://i.imgur.com/1NOHhJc.png) ![](https://i.imgur.com/3Tk3rMT.png) ### 完成 ![](https://i.imgur.com/3ZaqNti.png) ### F Key有設定會影響EF Core Tool 的反向工程結果,DbContext增加此設定 ![](https://i.imgur.com/sdXrzyX.png) ![](https://i.imgur.com/3jHmGej.png) ### 主資料表(s30_student)設定增加與目標資料表的關聯 ![](https://i.imgur.com/RW0Tz7y.png) ![](https://i.imgur.com/pueDf8n.png) ### 目標資料表(s90_class)增加主資料表設定 ![](https://i.imgur.com/nmKM1jG.png) ![](https://i.imgur.com/faHke8S.png) ### DB刪除F Key後,專案設定不改,依然可以正常運作 ![](https://i.imgur.com/V66nCGJ.png) ### 要Get兩個資料表的資料,在專案有使用F Key的設定下,可使用`Include()`語法 ```csharp= //s30_studentController.cs [HttpGet] public async Task<ActionResult<IEnumerable<s30_student>>> Gets30_student() { if (_context.s30_student == null) { return NotFound(); } return await _context.s30_student.Include(a => a.cls).ToListAsync(); //cls是s30_student.cs內的屬性 } ``` ```csharp= //s30_student.cs public virtual s90_class cls { get; set; } ``` ![](https://i.imgur.com/ZP63wpd.png) ### 此時使用Swagger測試Get功能,出現產生Json時有無窮迴圈的error 因為在EntityType s30_student和s90_class裡都有去撈取對方資料的屬性,所以執行Get動作時,就會不停互相取資料 ```csharp= //s30_student.cs public virtual s90_class cls { get; set; } ``` ```csharp= //s90_class.cs public virtual ICollection<s30_student> s30_student { get; } = new List<s30_student>(); ``` ![](https://i.imgur.com/REv4ZT6.png) ### 解決方法是在Program.cs檔加入以下程式碼 ```csharp= //取代原先builder.Services.AddControllers() builder.Services.AddControllers().AddJsonOptions(x => x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles); //AddControllers():.NET Core Controllers路徑處理方式 //AddJsonOptions:產生Json的相關選項 //JsonSerializerOptions:Json序列化選項 //ReferenceHandler:Json序列化參考處理器 //IgnoreCycles:忽略迴圈 ``` ![](https://i.imgur.com/wM3j8oc.png) ![](https://i.imgur.com/zCUg939.png) ### SQL Server→管理→SQL Server記錄檔,可查看Log檔 ![](https://i.imgur.com/WQWQT9Y.png) ### 紀錄連線相關訊息,例如某帳號登入失敗,可檢查是哪個帳號,且原因為何 ![](https://i.imgur.com/Kvn4aiZ.png) ### SQL Server→安全性→登入→選擇帳號右鍵→屬性 ![](https://i.imgur.com/oSbQfoA.png) ### 登入屬性→使用者對應,可設定帳號對資料庫的使用權限 ![](https://i.imgur.com/uvG1UZz.png)