星期五, 3月 29, 2024

HP M506 - 預設紙張

現場使用者回報報表破版,橫向報表會往整個往右偏移,花了段時間沒有查出問題是甚麼,後來老大出手才發現到,預設紙張跑掉,原本是 A4 現在變成 Letter,修正回來就正常,直印其實也會偏移,只是直印報表偏移並沒有達到破版地步,也就以為是正常狀態

下圖左方為 A4 測試頁,右邊為 Letter 測試頁

星期三, 3月 27, 2024

[SQL] timestamp_utc

sys.fn_xe_file_target_read_file 在 SQL Server 2017 提供 timestamp_utc datetime2 資訊,根據文章範例去進行測試發現,篩選不到資料
SELECT *
FROM sys.fn_xe_file_target_read_file('system_health*.xel', NULL, NULL, NULL)
WHERE timestamp_utc > DATEADD(DAY, -1, GETUTCDATE());
在網路文章上有提到該欄位篩選有問題,要對欄位進行轉型才會正常
SELECT *
FROM sys.fn_xe_file_target_read_file('system_health*.xel', NULL, NULL, NULL)
WHERE CONVERT(datetime2(7), timestamp_utc) > DATEADD(DAY, -1, GETUTCDATE());
目前使用版本為 SQL Server 2019

星期二, 3月 26, 2024

[.NET] 在 Windows Service 內使用 EFCore

把 BackgroundService 安裝成 Windows Service 實際上線時,遇上下列三種跟 EFCore 相關問題,分別為
  • 抓取 appsettings.josn
  • SQL Server 連線驗證方式
  • Microsoft.Data.SqlClient 安裝

抓取 appsettings.josn

一開始沿用該筆記內容 - [EFCore] 在 Console 專案上安裝設定,使用 Directory.GetCurrentDirectory() 來取得,但當變成 Windows Service 後,回傳值會變成 C:\Windows\system32,完整錯誤訊息如下
The configuration file 'appsettings.json' was not found and is not optional. The expected physical path was 'C:\Windows\system32\appsettings.json'.
最後修正為使用 AppContext.BaseDirectory 才正確取得執行檔案資料夾位置,參考資料
SQL Server 連線驗證方式

因為是使用 Windows 驗證,在 VS 上測試時是使用 [Windows 登入帳號],但當變成 Windows Service 後,變成為 NT AUTHORITY\SYSTEM,看是要在 SQL Server 內允許帳戶有存取權限或是該使用 SQL 驗證來存取

一開始收到的錯誤訊息如下,完全不知道為什麼要設定 EnableRetryOnFailure
An exception has been raised that is likely due to a transient failure. Consider enabling transient error resiliency by adding 'EnableRetryOnFailure' to the 'UseSqlServer' call.
Windows 服務 => Windows Service 內查詢使用帳號


SQL Server => 安全性 => 報表 => 標準報表 => 登錄失敗



Microsoft.Data.SqlClient 安裝

執行時拋出該錯誤訊息
The type initializer for 'Microsoft.Data.SqlClient.TdsParser' threw an exception.
關鍵字明確,去 nuget 上把 Microsoft.Data.SqlClient 安裝起來就解決

星期一, 3月 25, 2024

[EFCore] Contain

在官方文件 - Contains 在 LINQ 查詢中,可能會停止在舊版 SQL Server 上運作 上有特別提到,Linq Contain 會使用 TSQL OPENJSON 語法,而 OPENJSON 是從 2016 (相容性層級 130) 才開始支援,就無法支援每一個 SQL Server 版本,來驗證並筆記

EF Core 8 使用 Linq Contain 語法連結 SQL Server 2022 (相容性層級 160) 
namespace ContainIssue
{
    internal class Program
    {
        static void Main(string[] args)
        {
            using var context = new AdventureWorks2022Context();

            string[] lastNames = new string[] { "Alberts", "Bennett" };
            var source = context.People
                .Where(w => !lastNames.Contains(w.LastName));
            
            Console.WriteLine("TSQL 語法:");
            Console.WriteLine(source.ToQueryString());
            Console.WriteLine("-----------");
            Console.WriteLine($"資料筆數:{source.Count()}");

        }
    }
}

執行結果


故意切換至 SQL Server 2016 前版本,執行會出現下面錯誤訊息

星期三, 3月 20, 2024

[SQL] 避免 Order By

Order By 在 MS SQL 內算是高成本 operator,看情況是否可以拉到 AP 端來處理,寫個簡易範例紀錄
use AdventureWorks2022
GO

DROP INDEX IF EXISTS IX_Person_LastName ON Person.Person
GO

CREATE INDEX IX_Person_LastName ON Person.Person (LastName)
GO

SELECT LastName , COUNT(*)
FROM Person.Person
WHERE LastName IN ('Diaz' , 'Hernandez')
GROUP BY LastName 

SELECT LastName , COUNT(*)
FROM Person.Person
WHERE LastName IN ('Diaz' , 'Hernandez')
GROUP BY LastName 
ORDER BY COUNT(*)


星期二, 3月 12, 2024

[SSRS] 格式化 - 數字

在 SSRS 上格式化數字,以往都是使用內建功能就可以達到效果,但這次要透過自訂運算來達到,需求如下
  • 資料單純是整數就不顯示小數點,EX:999.00 顯示 999
  • 有小數點情況下要完整顯示,最後一位是 0 不移除,EX:123.40 顯示 123.40,而不是 123.4
以小數點兩位來呈現效果,內建設定效果如下



自訂運算式語法如下
=IIf(
     Fix(Fields!ItemCount.Value) = Fields!ItemCount.Value, 
     Format(Fields!ItemCount.Value, "#,0"), 
     Format(Fields!ItemCount.Value, "#,0.00"))
SSRS 函數 Fix 說明


自訂運算式報表效果



星期五, 3月 08, 2024

[SQL] 授權查詢

看見 Line 社群上討論,在 SQL Server 2019 上使用 TSQL 查詢授權,結果會是 Disabled,TSQL 如下
SELECT 
    ServerProperty('LicenseType') , 
    ServerProperty('NumLicenses')

剛好自家 Product 環境也是 2019 就好奇去查詢看看,一查發現也是 Disabled,但是它已經跑三年左右,要出問題應該老早就爆。

在這兩篇舊討論找到結論
SQL Server 2000 年代會把授權寫進系統 registry 內,可以透過 ServerProperty 的 LicenseType 和 NumLicenses 取得,但在 SQL Server 2005 就不在寫進 registry,所以 ServerProperty 就一律回傳 Disabled

星期三, 3月 06, 2024

[SSRS] 群組和總計

根據官方文章 - 新增群組和總計 的練習,該報表資料來源設定部分,請參考該篇筆記 - [RV] 逐步解說:ReportViewer 報表,該篇筆記就不在紀錄,該報表效果要包含整個報表統計 (Grand Total)、每日訂單統計(Daily Total)、訂單統計 (Order Total) 和訂單明細,下圖為官方文章最後呈現報表


星期二, 3月 05, 2024

[VS] Show Missing Files 2022

公司分支合併時,WinForm Solution 內常常發生檔案不包含在 Project 內的情況,有些功能因為是使用 Reflection 關係沒有被 VS 檢查到,導致上線後就炸掉啦,同事找到該 VS 功能 - Show Missing Files 可以避免檔案不在 Project 內,build 時就會提出錯誤且只要按 [Include file in project] 就可以把檔案抓進 Project 內,算是可以無腦使用