星期日, 5月 31, 2020

[EF] Code First 變更 Table Schema 觀察

延續該筆記 Entity Framework Code First 產生 Table,好奇 EF Code First 是如何變更 Table Schema,把連線轉向 MS SQL 並利用 SQL Server Profile 來觀察

直接修正 Author Table 的 Name 欄位,利用 Data Annotations 來指定資料欄位和長度

Author Name 欄位為 nvarchar(max)
using System.ComponentModel.DataAnnotations;

public class Author
{
    public int AuthorId { get; set; }
    [Required]
    public string Name { get; set; }
}
修正 Author Name 欄位為 nchar(20)
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

public class Author
{
    public int AuthorId { get; set; }
    [Required]
    [Column(TypeName = "nchar")]
    [MaxLength(20)]
    public string Name { get; set; }
}
SQL Server Profiler 觀察

EF Code First 變更 Table Schema 觀察

星期六, 5月 30, 2020

[EF] Code First 產生 Table

練習 ASP.NET Web API 2 中的屬性路由建立 REST API 時,第一個步驟是利用 EF Code First Migration 來建立 DB 和 Table,重點畫面截圖紀錄一下

建立一個空白 WebAPI 專案

預設是會啟動 HTTPS,練習用就把它取消

Entity Framework Code First 產生 Table-1

星期六, 5月 16, 2020

[WebApi] 專案起始動作

學習 WebApi2 時,發現每次啟動都會呼叫瀏覽器,並給出 403,在 Project 屬性內找到設定,可以變更該行為

建立一個只有 WebApi2 的空專案

[WebApi] 專案起始動作-1

一執行就可以看到瀏覽器上拋出 403

[WebApi] 專案起始動作-2

在 Project 屬性 => Web => 起始動作內,可以修改該設定,設定 [不要開啟頁面,等待來自外部外部應用程式的要求],當然還有其他選項可以設定,端看個人需求

[WebApi] 專案起始動作-3

再次執行時,一開始就只有看見診斷工作在那跑

[WebApi] 專案起始動作-4

利用 Postman 打進去,會看見輸出視窗會開始動起來

[WebApi] 專案起始動作-5

星期四, 5月 14, 2020

Godex G530 列印異常

使用者回報 Godex G530 列印異常,碳帶會破裂,輸出的 QRCode 則是一團亂

碳帶破裂

Godex G530 列印異常-1

輸出異常
Godex G530 列印異常-2

找些可能性來測試過後,最後是修改標籤機設定來修正,就不要用預設的 [明暗度] 就解決該問題,該標籤機應該也是差不多了,輸出時超大聲的

Godex G530 列印異常-3

星期六, 5月 09, 2020

[SQL] UNION ALL 發生隱含轉換 2

以前遇到的隱含式轉換都跟資料型別轉換有直接轉換關係,EX:char 轉為 int、bit 轉為 int,但這次是型別沒有變化,是型別大小造成的隱含式轉換 char(11) 被轉為 char(16)

在 TempDB 內建立 tblMaster、tblDetail1、tblDetail2 來模擬實務情況,這三個 Table 都只有一個 NO 欄位,只有 tblDetail2 是開 char(11),其他兩個 Table 都是 char(16)

CREATE TABLE [dbo].[tblMaster]
(
  [NO16] [char](16) NOT NULL, -- char(16)
  CONSTRAINT [PK_tblMaster] PRIMARY KEY CLUSTERED ([NO16] ASC)
)
GO

CREATE TABLE [dbo].[tblDetail1]
(
  [NO16] [char](16) NOT NULL, -- char(16)
  CONSTRAINT [PK_tblDetail] PRIMARY KEY CLUSTERED([NO16] ASC)
)
GO

CREATE TABLE [dbo].[tblDetail2]
(
  [NO11] [char](11) NOT NULL, -- char(11)
  CONSTRAINT [PK_tblDetail2] PRIMARY KEY CLUSTERED([NO11] ASC)
)
GO

模擬實務上 TSQL 語法並觀察執行計畫
SELECT *
FROM tblMaster AS M
  JOIN
    (
      SELECT
        [NO16] AS [NO]
      FROM tblDetail1
      UNION ALL
      SELECT 
        [NO11]
      FROM tblDetail2
    ) AS D ON M.[NO16] = D.[NO]

從執行計畫中可以看出,tblDetail1 是 Index Seek [綠框]、tblDetail2 是 Index Scan [紅框] 來搜尋資料

[SQL] UNION ALL 發生隱含轉換 2-1

SELECT 操作子內的警告

[SQL] UNION ALL 發生隱含轉換 2-2

tblDetail2 Predicate 關於隱含轉換的訊息

[SQL] UNION ALL 發生隱含轉換 2-3

另外測試兩種情況,想驗證看看是否會發生隱含轉換,結論:不會有隱含轉換

測試一:直接對 tblDetail1 和 tblDetail2 UNION ALL
SELECT
  [NO16]
FROM tblDetail1
UNION ALL
SELECT 
  [NO11]
FROM tblDetail2

[SQL] UNION ALL 發生隱含轉換 2-4

測試二:tblMaster 直接和 tblDetail2 JOIN

SELECT *
FROM tblMaster AS M
  JOIN tblDetail2 AS D ON M.[NO16] = D.[NO11]

[SQL] UNION ALL 發生隱含轉換 2-5

以上模擬和測試跟實務結果是一致,記錄一下