星期六, 10月 23, 2021

[C#] NumericUpDown

根據 NumericUpDown 文章範例再加上常用功能的筆記
using System;
using System.Windows.Forms;

namespace NnumericUpDownSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // 輸入法切換回英數,且停用輸入法切換
            numericUpDown1.ImeMode = ImeMode.Disable;

            // 設定初始值、最大值和最小值
            numericUpDown1.Minimum = -9999999;
            numericUpDown1.Maximum = 9999999;
            numericUpDown1.Value = 9999;
        }

        #region 全選
        private void SelectAll()
        {
            numericUpDown1.Select(0, numericUpDown1.Text.Length);
        }

        private void numericUpDown1_Enter(object sender, EventArgs e)
        {
            SelectAll();
        }

        private void numericUpDown1_MouseDown(object sender, MouseEventArgs e)
        {
            SelectAll();
        }
        #endregion

        private void chkDecimalPlaces_CheckedChanged(object sender, EventArgs e)
        {
            if (numericUpDown1.DecimalPlaces > 0)
            {
                numericUpDown1.DecimalPlaces = 0;
                numericUpDown1.Value = Decimal.Round(numericUpDown1.Value, 0, MidpointRounding.AwayFromZero);
            }
            else
            {
                numericUpDown1.DecimalPlaces = 2;
                numericUpDown1.Increment = 0.25M;
            }
        }

        private void chkThousandsSeparator_CheckedChanged(object sender, EventArgs e)
        {
            numericUpDown1.ThousandsSeparator = !numericUpDown1.ThousandsSeparator;
        }

        private void chkHexadecimal_CheckedChanged(object sender, EventArgs e)
        {
            numericUpDown1.Hexadecimal = !numericUpDown1.Hexadecimal;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            string info = string.Empty;
            info += $"Value:{numericUpDown1.Value}" + Environment.NewLine;
            info += $"Text:{numericUpDown1.Text}";
            lblInfo.Text = info;
        }
    }
}
[C#] NumericUpDown-2

NumericUpDown.Text Property

官方文件上就可以知道 Text Property 不會出現在屬性視窗內,但是 Code 內是可以直接叫用,透過 Text Property 來自訂全選功能 

  [C#] NumericUpDown-1

ImeMode.Disable

NumericUpDown 為輸入數字使用,因此把強制切換成英數並關閉鍵盤切換輸入法

星期五, 10月 15, 2021

LinqPad - 中斷點

在 LinqPad 下中斷點竟然停不下來,後來開啟一個新的 Query 再下中斷點時,跳出下面的提醒訊息
LinqPad - 中斷點-1

根據訊息 Optimization 可以在兩個地方設定,分別為

1. Edit => Preferences => Query => Query Optimization Default

LinqPad - 中斷點-2

2. 右下角 statusbar 快捷功能

LinqPad - 中斷點-3

猜測是不小心點到右下角的圖式,開啟 optimize+ (等同於 release mode) 才停不下來,手殘

星期六, 10月 09, 2021

[SQL] 交易式複寫-建立訂閱

該筆記延續 [SQL] 交易式複寫-設定發行,根據 教學課程:設定兩個完全連線的伺服器之間的複寫 (異動) 文章來設定散發,該文章作法是利用複寫精靈來設定訂閱

建立交易式發行集的訂閱

SSMS => 複寫 => 發行集 => 新增訂閱

[SQL] 交易式複寫-建立訂閱-1

啟動訂閱精靈

[SQL] 交易式複寫-建立訂閱-2

選擇發行者、資料庫與發行集

[SQL] 交易式複寫-建立訂閱-3

散發代理程式位置,官方文章 訂閱發行集 內的簡易說明
  • 發送訂閱:「訂閱者」不需發出請求,「發行者」便會將變更傳播給「訂閱者」
  • 提取訂閱:「訂閱者」必須請求傳送「發行者」中的變更。 
[SQL] 交易式複寫-建立訂閱-4

加入訂閱者 => 加入 SQL Server 訂閱者

[SQL] 交易式複寫-建立訂閱-5

新增 Node2\SQL2019 訂閱並新增訂閱資料庫 - ProductReplica DB,設定完成後會在 Node2\SQL2019 上新增 DB,如截圖

[SQL] 交易式複寫-建立訂閱-6

散發代理程式安全性

[SQL] 交易式複寫-建立訂閱-7

使用 Node1\repl_distribution Windows 帳號
 
[SQL] 交易式複寫-建立訂閱-8

散發代理程式安全性設定完成

[SQL] 交易式複寫-建立訂閱-9

同步排程:代理程式排程設定是對應 Job 排程類型,圖是把精靈步驟和 Job 截圖疊在一起說明

代理程式排程設定Job 排程類型
連續執行當 SQL Server Agent 啟動時自動啟動
僅在需要時執行執行一次
定義排程重覆執行

[SQL] 交易式複寫-建立訂閱-10

初始化訂閱

[SQL] 交易式複寫-建立訂閱-11

完成訂閱精靈設定並產生 Script

[SQL] 交易式複寫-建立訂閱-12

指定 Script 存放位置

[SQL] 交易式複寫-建立訂閱-13

完成精靈

[SQL] 交易式複寫-建立訂閱-14

訂閱建立完成

[SQL] 交易式複寫-建立訂閱-15

在 SQL Server Agent 內可以看見有 Node1\SQL2019-AdventureWorks2019-Adworkproducttrans-Node2\SQL2019,而該 Job 名稱,根據 指定同步處理排程 文章內容,規則為 <Publisher>-<PublicationDatabase>-<Publication>-<Subscriber>-<integer>

[SQL] 交易式複寫-建立訂閱-16

Script 內容
-----------------開始: 在發行者 'NODE1\SQL2019' 端執行的指令碼-----------------
use [AdventureWorks2019]
exec sp_addsubscription 
	@publication = N'Advworksproducttrans', 
	@subscriber = N'NODE2\SQL2019', 
	@destination_db = N'AdventureWorks2019', 
	@subscription_type = N'Push', 
	@sync_type = N'automatic', 
	@article = N'all', 
	@update_mode = N'read only', 
	@subscriber_type = 0

exec sp_addpushsubscription_agent 
	@publication = N'Advworksproducttrans', 
	@subscriber = N'NODE2\SQL2019', 
	@subscriber_db = N'AdventureWorks2019', 
	@job_login = N'Node1\repl_distribution', 
	@job_password = null, 
	@subscriber_security_mode = 1, 
	@frequency_type = 64, 
	@frequency_interval = 0, 
	@frequency_relative_interval = 0, 
	@frequency_recurrence_factor = 0, 
	@frequency_subday = 0, 
	@frequency_subday_interval = 0, 
	@active_start_time_of_day = 0, 
	@active_end_time_of_day = 235959, 
	@active_start_date = 20211005, 
	@active_end_date = 99991231, 
	@enabled_for_syncmgr = N'False', 
	@dts_package_location = N'Distributor'
GO
-----------------結束: 在發行者 'NODE1\SQL2019' 端執行的指令碼-----------------
在訂閱者端設定資料庫權限


在 Node2 上授予 repl_distrubution 為 ProductReplica DB 的 db_owner 角色

[SQL] 交易式複寫-建立訂閱-17

檢視訂閱的同步處理狀態

[SQL] 交易式複寫-建立訂閱-18

[SQL] 交易式複寫-建立訂閱-19

交易式複寫執行結果

Node2 上的 ProductReplica.Production.Product 資料欄位沒有看見 StandardCost 和 ListPrice 兩個欄位

   [SQL] 交易式複寫-建立訂閱-20

SafeStockLevel > 500 資料並沒有同步過來 Node2

[SQL] 交易式複寫-建立訂閱-21

其他觀察

快照資料集初始化

[SQL] 交易式複寫-建立訂閱-24
Node2 上也會有對應的訂閱

[SQL] 交易式複寫-建立訂閱-23

SQL Server Agent 作業活動監視器內,有交易式複寫相關的 Job 一覽表,可以透過 [類別目錄] 欄位資訊來了解 Job 存在目的

[SQL] 交易式複寫-建立訂閱-22


星期五, 10月 08, 2021

[SQL] 交易式複寫-設定發行

該筆記延續 [SQL] 交易式複寫-設定資料庫權限,根據 教學課程:設定兩個完全連線的伺服器之間的複寫 (異動) 文章來設定散發,該文章作法是利用複寫精靈來設定發行集

建立發行集並定義發行項

SSMS => 複寫 => 本機發行集 => 滑鼠右鍵 => 新增發行集
 
[SQL] 交易式複寫-設定發行-1

發行集精靈說明

[SQL] 交易式複寫-設定發行-2

設定發行集資料庫,已事先還原 AdventrueWorks2019 至 Node1 上

[SQL] 交易式複寫-設定發行-3

設定發行集類別,選擇 [交易式發行集]

[SQL] 交易式複寫-設定發行-4

發行項 (Articles),選擇 Product Table 並排除 StandardCost 和 ListPrice 欄位

[SQL] 交易式複寫-設定發行-5

篩選資料表的資料列,可以設定資料條件,只發行符合條件的資料

[SQL] 交易式複寫-設定發行-6

篩選條件:SafeStockLevel < 500 的資料

[SQL] 交易式複寫-設定發行-7

篩選條件設定完成

[SQL] 交易式複寫-設定發行-8

快照集代理程式,根據 Techdays Taiwan 2013 - 跨洲際多點同時服務的資料庫解決方案,使用SQL Server 點對點的資料同步 內,老師說明大型資料庫都是透過備份來進行快照集初始化,但這篇練習是使用 [立即建立快照集,並保留快照集為可使用狀態,以初始化訂閱] 選項來進行

[SQL] 交易式複寫-設定發行-9

代理程式安全,選擇 Snapshot Agent 和 LogReader Agent 帳號,並取消 [使用快照集代理程式的安全性設定]

[SQL] 交易式複寫-設定發行-10

以 LogReader Agnet 設定為例說明, Snapsot Agent 就省略囉
 
[SQL] 交易式複寫-設定發行-12

設定結束後進行動作,順道產生 Script 來了解

[SQL] 交易式複寫-設定發行-13

設定產生 Script 的位置

[SQL] 交易式複寫-設定發行-14

發行集精靈設定完成

[SQL] 交易式複寫-設定發行-15


[SQL] 交易式複寫-設定發行-16

SQL Server Agent 內會多出兩個 Job,分別為
  • NODE1\SQL2019-AdventureWorks2019-1:LogReader 使用
  • NODE1\SQL2019-AdventureWorks2019-Advworksproducttrans-1:Snapshot 使用
    [SQL] 交易式複寫-設定發行-22

精靈產生的 Script 檔案
-- 正在啟用複寫資料庫
use master

-- 在 AdventureWorks2019 上啟用交易式複寫
exec sp_replicationdboption 
	@dbname = N'AdventureWorks2019', 
	-- optname 參數為 merge publish、publish、subscribe 和 sync with backup
	@optname = N'publish', 
	@value = N'true'
GO

-- 執行 sp_addlogreader_agent 來建立 Agent Job
exec [AdventureWorks2019].sys.sp_addlogreader_agent 
	@job_login = N'Node1\repl_logreader', 
	@job_password = null, 
	-- 預設使用 Windows 整合驗證連發行者
	@publisher_security_mode = 1
GO

-- 建立交易式發行集
use [AdventureWorks2019]
exec sp_addpublication 
	@publication = N'Advworksproducttrans', 
	@description = N'來自發行者 ''NODE1\SQL2019'' 的資料庫 ''AdventureWorks2019'' 交易式發行集。', 
	@sync_method = N'concurrent', 
	@retention = 0, 
	@allow_push = N'true', 
	@allow_pull = N'true', 
	@allow_anonymous = N'true', 
	@enabled_for_internet = N'false', 
	@snapshot_in_defaultfolder = N'true', 
	@compress_snapshot = N'false', 
	@ftp_port = 21, 
	@ftp_login = N'anonymous', 
	@allow_subscription_copy = N'false', 
	@add_to_active_directory = N'false', 
	-- continuous 和 snapshot,continuous 為預設值
	@repl_freq = N'continuous', 
	@status = N'active', 
	@independent_agent = N'true', 
	@immediate_sync = N'true', 
	@allow_sync_tran = N'false', 
	@autogen_sync_procs = N'false', 
	@allow_queued_tran = N'false', 
	@allow_dts = N'false', 
	@replicate_ddl = 1, 
	-- 指出訂閱者是否可以從備份(而不是初始快照集)初始化
	@allow_initialize_from_backup = N'false', 
	@enabled_for_p2p = N'false', 
	@enabled_for_het_sub = N'false'
GO

-- 執行訂閱初始化
exec sp_addpublication_snapshot 
	@publication = N'Advworksproducttrans', 
	@frequency_type = 1, 
	@frequency_interval = 0, 
	@frequency_relative_interval = 0, 
	@frequency_recurrence_factor = 0, 
	@frequency_subday = 0, 
	@frequency_subday_interval = 0, 
	@active_start_time_of_day = 0, 
	@active_end_time_of_day = 235959, 
	@active_start_date = 0, 
	@active_end_date = 0, 
	@job_login = N'Node1\repl_snapshot', 
	@job_password = null, 
	-- 預設使用 Windows 整合驗證連發行者
	@publisher_security_mode = 1

-- 將 SQL Login 加入發行集存取清單 (PAL)
exec sp_grant_publication_access @publication = N'Advworksproducttrans', @login = N'sa'
GO
exec sp_grant_publication_access @publication = N'Advworksproducttrans', @login = N'NODE1\Administrator'
GO
exec sp_grant_publication_access @publication = N'Advworksproducttrans', @login = N'NT SERVICE\Winmgmt'
GO
exec sp_grant_publication_access @publication = N'Advworksproducttrans', @login = N'NT SERVICE\SQLWriter'
GO
exec sp_grant_publication_access @publication = N'Advworksproducttrans', @login = N'NT Service\MSSQL$SQL2019'
GO
exec sp_grant_publication_access @publication = N'Advworksproducttrans', @login = N'NT SERVICE\SQLAgent$SQL2019'
GO

exec sp_grant_publication_access 
	@publication = N'Advworksproducttrans', 
	@login = N'distributor_admin'
GO

-- 加入交易式發行項
use [AdventureWorks2019]
exec sp_addarticle 
	@publication = N'Advworksproducttrans', 
	@article = N'Product', 
	@source_owner = N'Production', 
	@source_object = N'Product', 
	@type = N'logbased', 
	@description = N'', 
	@creation_script = N'', 
	@pre_creation_cmd = N'drop', 
	@schema_option = 0x000000000803509F, 
	@identityrangemanagementoption = N'manual', 
	@destination_table = N'Product', 
	@destination_owner = N'Production', 
	@status = 24, 
	@vertical_partition = N'true', 
	@ins_cmd = N'CALL [sp_MSins_ProductionProduct]', 
	@del_cmd = N'CALL [sp_MSdel_ProductionProduct]', 
	@upd_cmd = N'SCALL [sp_MSupd_ProductionProduct]', 
	@filter_clause = N'[SafetyStockLevel] < 500'

-- 正在加入發行項的分割區資料行
exec sp_articlecolumn 
	@publication = N'Advworksproducttrans', 
	@article = N'Product', 
	@column = N'ProductID', 
	@operation = N'add', 
	@force_invalidate_snapshot = 1, 
	@force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'Name', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'ProductNumber', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'MakeFlag', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'FinishedGoodsFlag', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'Color', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'SafetyStockLevel', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'ReorderPoint', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'Size', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'SizeUnitMeasureCode', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'WeightUnitMeasureCode', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'Weight', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'DaysToManufacture', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'ProductLine', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'Class', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'Style', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'ProductSubcategoryID', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'ProductModelID', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'SellStartDate', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'SellEndDate', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'DiscontinuedDate', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'rowguid', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1
exec sp_articlecolumn @publication = N'Advworksproducttrans', @article = N'Product', @column = N'ModifiedDate', @operation = N'add', @force_invalidate_snapshot = 1, @force_reinit_subscription = 1

-- 加入發行項篩選
exec sp_articlefilter 
	@publication = N'Advworksproducttrans', 
	@article = N'Product', 
	@filter_name = N'FLTR_Product_1__55', 
	@filter_clause = N'[SafetyStockLevel] < 500', 
	@force_invalidate_snapshot = 1, 
	@force_reinit_subscription = 1

-- 加入發行項同步處理物件
exec sp_articleview 
	@publication = N'Advworksproducttrans', 
	@article = N'Product', 
	@view_name = N'SYNC_Product_1__55', 
	@filter_clause = N'[SafetyStockLevel] < 500', 
	@force_invalidate_snapshot = 1, 
	@force_reinit_subscription = 1
GO

檢視快照集產生的狀態

[SQL] 交易式複寫-設定發行-17

[SQL] 交易式複寫-設定發行-18

將散發代理程式新增至發行集存取清單 (PAL)

[SQL] 交易式複寫-設定發行-19

[SQL] 交易式複寫-設定發行-20

[SQL] 交易式複寫-設定發行-21