dotnet6 Dapper語法說明

目的 說明Dapper基本語法 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 Dapper Microsoft.Data.Sqlite 編輯WeatherForecastController檔案 將預設的API註解 基本設定 /// <summary> /// 初始化SQLite /// </summary> /// <returns></returns> private static async Task InitSqliteAsync() { //建立SQLite連線 using var conn = new SqliteConnection("Data Source=Student.sqlite"); var SQL = new StringBuilder(); //判斷是否有Student.sqlite檔案 if (!System.IO.File.Exists(@".\Student.sqlite")) { //新增一張表,就會建立.sqlite檔案 SQL.Append("CREATE TABLE Student( \n"); SQL.Append("Id INTEGER PRIMARY KEY AUTOINCREMENT, \n"); SQL.Append("Name VARCHAR(32) NOT NULL, \n"); SQL.Append("Age INTEGER) \n"); //執行sql語法 await conn.ExecuteAsync(SQL.ToString()); } //Task不建議使用void,當不需要回傳值時會改用Task.CompletedTask說明已經完成,可以下一個步驟了。 await Task.CompletedTask; } public class Student { public int Id { get; set; } //Name預設值為Billhuang,與以前建構子的寫法一樣,如下方寫法 //public Student(){Name="BillHuang";} public string Name { get; set; } = "BillHuang"; public int Age { get; set; } } ...

October 3, 2022

dotnet6 Dapper範例

目的 透過dapper對db做查詢,為了降低門檻採用SQLite當範例資料庫。 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 Dapper Microsoft.Data.Sqlite(微軟官方還是SQLite官方?黑暗執行緒前輩有做說明,我的選擇比較單純有微軟用微軟) 編輯WeatherForecastController檔案 將預設的API註解 寫新的對外API /// <summary> /// 檢查有沒有sqlite檔案,沒有就新增,並增加一筆資料 /// </summary> /// <returns></returns> [HttpGet("InsertAsync")] public async Task<IActionResult> InsertAsync() { //連接sqlite資料庫 using var connection = new SqliteConnection("Data Source=Student.sqlite"); var SQL = new StringBuilder(); //當找不到sqlite檔案時,建立新表,新表創建後就會產生sqlite檔案了 if (System.IO.File.Exists(@".\Student.sqlite")) { //組語法,新建名為Student的表 SQL.Append("CREATE TABLE Student( \n"); //Id欄位設定數字型別為PKey,並且自動遞增 SQL.Append("Id INTEGER PRIMARY KEY AUTOINCREMENT, \n"); //Name欄位設定為VARCHAR(32)不允許是null SQL.Append("Name VARCHAR(32) NOT NULL, \n"); //Age欄位設定為int SQL.Append("Age INTEGER) \n"); //執行sql語法 await connection.ExecuteAsync(SQL.ToString()); //清除字串內的值 SQL.Clear(); } //組語法 SQL.Append("INSERT INTO Student (Name, Age) VALUES (@Name, @Age);"); //建立SQL參數化要使用的變數 DynamicParameters parameters = new(); //參數1 parameters.Add("Name", "BillHuang"); //參數2 parameters.Add("Age", 20); //執行語法,insert一筆資料到Student var Result = await conn.ExecuteAsync(SQL.ToString(), parameters); //回傳執行成功的數量 return Ok(Result); } /// <summary> /// 取得Student所有資料 /// </summary> /// <returns></returns> [HttpGet("SelectAsync")] public async Task<IActionResult> SelectAsync() { //連接sqlite資料庫 using var conn = new SqliteConnection("Data Source=Student.sqlite"); var SQL = new StringBuilder(); //組語法 SQL.Append("select * from Student"); //執行,並且將執行結果存為強型別 var Result = await conn.QueryAsync<Student>(SQL.ToString()); //回傳結果 return Ok(Result); } public class Student { public int Id { get; set; } public string Name { get; set; } = "BillHuang"; public int Age { get; set; } } ...

October 2, 2022

dotnet6 EPPlus圖表範例

目的 使用epplus製作長條圖 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 Epplus 設定appsetting檔案 為了避免LicenseException,故需要在appsetting加入下列文字 "EPPlus": { "ExcelPackage": { "LicenseContext": "Commercial" //The license context used } } 編輯WeatherForecastController檔案 將預設的API註解 寫新的對外API [HttpGet(Name = "Import")] public ActionResult ImportExcel() { //建立excel所有操作的實例 using ExcelPackage excelPackage = new(); var ws = excelPackage.Workbook.Worksheets.Add("第一頁"); Random Random = new Random(); //ws.Cells[上下(row),左右(col)] ws.Cells[1, 2].Value = "第一季"; ws.Cells[1, 3].Value = "第二季"; ws.Cells[1, 4].Value = "第三季"; ws.Cells[1, 5].Value = "第四季"; ws.Cells[2, 1].Value = "A組"; ws.Cells[3, 1].Value = "B組"; ws.Cells[4, 1].Value = "C組"; ws.Cells[5, 1].Value = "D組"; for (int i = 2; i <= 5; i++) { for (int j = 2; j <= 5; j++) { ws.Cells[i, j].Value = Random.Next(70, 150); } } //建立長條圖 var BarChart = ws.Drawings.AddBarChart("BarChart", eBarChartType.ColumnClustered); //長條圖名稱 BarChart.Title.Text = "年度季報表"; //長條圖的位置 BarChart.SetPosition(6, 0, 6, 0); //長條圖大小 BarChart.SetSize(400, 400); //第一個顏色長條圖BarChart.Series.Add(數據區間,x軸名稱區間)=>數據區間從(2,2)到(2,5),X軸名稱(第一季、第二季、第三季、第四季) var Ateam = BarChart.Series.Add(ExcelCellBase.GetAddress(2, 2, 2, 5), ExcelCellBase.GetAddress(1, 2, 1, 5)); //第一條顏色的名稱(A組) Ateam.Header = ws.Cells[2, 1].Text; var Bteam = BarChart.Series.Add(ExcelCellBase.GetAddress(3, 2, 3, 5), ExcelCellBase.GetAddress(1, 2, 1, 5)); Bteam.Header = ws.Cells[3, 1].Text; var Cteam = BarChart.Series.Add(ExcelCellBase.GetAddress(4, 2, 4, 5), ExcelCellBase.GetAddress(1, 2, 1, 5)); Cteam.Header = ws.Cells[4, 1].Text; var Dteam = BarChart.Series.Add(ExcelCellBase.GetAddress(5, 2, 5, 5), ExcelCellBase.GetAddress(1, 2, 1, 5)); Dteam.Header = ws.Cells[5, 1].Text; //樣式使用1 BarChart.StyleManager.SetChartStyle(ePresetChartStyle.HistogramChartStyle1); //將檔案匯出 return File(excelPackage.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "製作長條圖"); } 範例太長,只擷取部分 ...

October 2, 2022

dotnet6 EPPlus範例

目的 將資料匯出成excel 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 Epplus 設定appsetting檔案 為了避免LicenseException,故需要在appsetting加入下列文字 "EPPlus": { "ExcelPackage": { "LicenseContext": "Commercial" //The license context used } } 編輯WeatherForecastController檔案 將預設的API註解 寫新的對外API [HttpGet(Name = "Import")] public ActionResult ImportExcel() { //建立excel所有操作的實例 using ExcelPackage excelPackage = new(); //properties為excel的屬性,開啟excel後要特別去查看屬性才能看到的資訊 excelPackage.Workbook.Properties.Author = "Bill Huang"; excelPackage.Workbook.Properties.Title = "範例檔案"; excelPackage.Workbook.Properties.Created = DateTime.Now; //建立第一頁工作表(下方所顯示的頁簽) ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add("第一頁"); int i = 1; foreach (var c in Summaries) { //選擇指定欄位將資料放入 worksheet.Cells[i,1].Value = c; i++; } //將檔案匯出 return File(excelPackage.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "excel檔案預設名稱"); } ...

October 1, 2022

dotnet6 更改回傳Json時為大駝峰命名

目的 將預設回傳的Camel-Case(temperatureCelsius)改為Pascal Case(TemperatureCelsius) 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 編輯WeatherForecastController檔案 將預設的API註解,寫入新的Action,預設不會引用System.Text.Json,記得在最上面using /// <summary> /// 反序列化 /// </summary> /// <returns></returns> [HttpGet("JsonDeserialize")] public ActionResult JsonDeserialize() { var options = new JsonSerializerOptions { PropertyNamingPolicy = null, }; var jsonString = @"{""Name"":""中文名"",""Age"":18,""TemperatureCelsius"":52}"; var Result = JsonSerializer.Deserialize<TestClass>(jsonString,options); return Ok(Result); } public class TestClass { public string Name { get; set; } public int Age { get; set; } public int TemperatureCelsius { get; set; } } ...

September 30, 2022

dotnet6 解決System.Text.Json序列化後會將所有非ASCII轉為Unicode

目的 序列化時不自動將非ASCII轉為Unicode 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 編輯WeatherForecastController檔案 將預設的API註解,寫入新的Action,預設不會引用System.Text.Json,記得在最上面using [HttpGet("JsonSerialize")] public ActionResult JsonSerialize() { var options = new JsonSerializerOptions { //美化輸出,會有空白字元 WriteIndented = true, //將所有語言都不進行轉換 Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) }; var Test = new TestClass() { Name = "中文名", Age = 18, }; var Result = JsonSerializer.Serialize(Test, options); return Ok(Result); } public class TestClass { public string Name { get; set; } public int Age { get; set; } } ...

September 29, 2022

dotnet6 Text.Json範例

目的 不使用Newtonsoft.Json,改採.net6內建的System.Text.Json System.Text.Json更著重在效能與安全性,大多數人應該都跟我一樣只會使用基本的序列化及反序列化。 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 編輯WeatherForecastController檔案 將預設的API註解,寫入新的Action,預設不會引用System.Text.Json,記得在最上面using /// <summary> /// 序列化 /// </summary> /// <returns></returns> [HttpGet("JsonSerialize")] public ActionResult JsonSerialize() { var Test = new TestClass() { Name = "中文名", Age = 18 }; var Result = JsonSerializer.Serialize(Test); return Ok(Result); } /// <summary> /// 反序列化 /// </summary> /// <returns></returns> [HttpGet("JsonDeserialize")] public ActionResult JsonDeserialize() { var jsonString = @"{""Name"":""中文名"",""Age"":18}"; var Result = JsonSerializer.Deserialize<TestClass>(jsonString); return Ok(Result); } public class TestClass { public string Name { get; set; } public int Age { get; set; } } ...

September 28, 2022

dotnet6 swagger授權

目的 在swagger內使用jwt token測試API 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 選擇.net6版本,支援OpenAPI支援一定要勾選,此選項.net5以後才會有,.net core 3.1並沒有此選項,需要從NuGet安裝,並點建立 專案基本設定 右邊紅框處專案檔點兩下,會開啟專案的xml檔案,額外加入兩行xml資料,目的是要透過編譯器產生文件檔案 <GenerateDocumentationFile>true</GenerateDocumentationFile> <NoWarn>$(NoWarn);1591</NoWarn> 加入前 加入後 編輯Program.cs檔案 修改program檔案內容,調整AddSwaggerGen的內容,目的是為了可以讀取我們所寫的註解 builder.Services.AddSwaggerGen(options => { // using System.Reflection; var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); }); 加入前 加入後 NuGet加入套件 透過NuGet安裝 JWT Microsoft.AspNetCore.Authentication.JwtBearer Microsoft.IdentityModel.Tokens System.IdentityModel.Tokens.Jwt 新增Helpers資料夾並在裡面新增JwtHelpers.cs類別檔案 jwt範例使用保哥範例來做修改,目的只是為了取得jwt token public class JwtHelper { private readonly JwtSettingsOptions _settings; public JwtHelper(IOptionsMonitor<JwtSettingsOptions> settings) { //注入appsetting的json _settings = settings.CurrentValue; } public string GenerateToken(string userName, int expireMinutes = 120) { //發行人 var issuer = _settings.Issuer; //加密的key,拿來比對jwt-token沒有 var signKey = _settings.SignKey; 建立JWT-Token var token = JwtBuilder.Create() //所採用的雜湊演算法 .WithAlgorithm(new HMACSHA256Algorithm()) // symmetric //加密key .WithSecret(signKey) //角色 .AddClaim("roles", "admin") //JWT ID .AddClaim("jti", Guid.NewGuid().ToString()) //發行人 .AddClaim("iss", issuer) //使用對象名稱 .AddClaim("sub", userName) // User.Identity.Name //過期時間 .AddClaim("exp", DateTimeOffset.UtcNow.AddMinutes(expireMinutes).ToUnixTimeSeconds()) //此時間以前是不可以使用 .AddClaim("nbf", DateTimeOffset.UtcNow.ToUnixTimeSeconds()) //發行時間 .AddClaim("iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds()) //使用者全名 .AddClaim(ClaimTypes.Name, userName) //進行編碼 .Encode(); return token; } } //將appsetting轉為強行別所使用 public class JwtSettingsOptions { public string Issuer { get; set; } = ""; public string SignKey { get; set; } = ""; } 因篇幅過長,只擷取JwtHelpers.cs部分內容,記得要using下列命名空間 ...

September 27, 2022

dotnet6 swagger範例

目的 每次要使用swaggerUI時候範例總是各式各樣,千奇百怪,下列範例是使用官方預設的Swashbuckle套件來教學。 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 選擇.net6版本,支援OpenAPI支援一定要勾選,此選項.net5以後才會有,.net core 3.1並沒有此選項,需要從NuGet安裝,並點建立 專案基本設定 右邊紅框處專案檔點兩下,會開啟專案的xml檔案,額外加入兩行xml資料,目的是要透過編譯器產生文件檔案 <GenerateDocumentationFile>true</GenerateDocumentationFile> <NoWarn>$(NoWarn);1591</NoWarn> 加入前 加入後 編輯Program.cs檔案 修改program檔案內容,調整AddSwaggerGen的內容,目的是為了可以讀取我們所寫的註解 program檔案與.net5以前不一樣,保哥的部落格有比較詳細的說明 builder.Services.AddSwaggerGen(options => { // using System.Reflection; var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); }); 加入前 加入後 編輯WeatherForecastController檔案 這裡有個重點,如果要增加下一個action時候,預設的範例檔案,需要調整route的設定,才能讀取到,不然會跳錯誤訊息 加入前 加入後 加入第二個方法 執行結果 就可以成功讀取到兩個方法了 參考 微軟官方 範例檔 GitHub

September 26, 2022

dotnet6 Telegram.Bot範例

目的 使用telegram做聊天機器人 建立新專案 選擇ASP.NET Core Web API專案範本,並執行下一步 設定新的專案 命名你的專案名稱,並選擇專案要存放的位置。 其他資訊 直接進行下一步 NuGet加入套件 Telegram.Bot 編輯WeatherForecastController檔案 將預設的API註解 寫新的對外API [HttpGet("Test")] public async Task<string> Test() { var botClient = new TelegramBotClient("前置作業給的機器人ID"); //取得機器人基本資訊 var me = await botClient.GetMeAsync(); //發送訊息到指定頻道 Message message = await botClient.SendTextMessageAsync( chatId: "前置作業給的頻道ID", text: "Trying *all the parameters* of `sendMessage` method"); //回傳取得的機器人基本資訊 return $"Hello, World! I am user {me.Id} and my name is {me.FirstName}."; } 執行結果 F5執行後,依照下列步驟操作,並確認結果 就可以看到telegram的機器人有發送一個訊息 參考 官方文件 holey’s Blog ...

September 25, 2022