Win10 64bit build 10586 印表機的一個預設啟動設定,預設印表機是最後一次使用的印表機
如下圖
這個設計對公司內 ERP 內的標籤機列印產生很大的影響,標籤列印是透過程式來選擇標籤機和紙張大小,因為預設印表機是最後一次使用的印表機,當使用者列印標籤後,要列印正常紙張(通常是 A4)時,應當從原本預設印表機進行輸出,但此時預設印表機已經變成標籤機,程式就會一直出現內容超過設定紙張的 Error,Orz。
星期二, 12月 29, 2015
星期六, 12月 19, 2015
星期五, 12月 18, 2015
[SQL] 擴充屬性
Turning 時,對 Index 進行修正,突然一個念頭是,該 Index 到底是甚麼時候建立、修改的,想要紀錄該時間點,才查到有擴充屬性(Extended Properties)可以使用
操作擴充屬性的三個功能,分別為 sp_addextendedproperty、sp_updateextendedproperty 和 sp_dropextendedproperty,在 MSDN 說明上,都會有 Level0、Level1 和 Level2 參數需要設定,以 sp_addextendedproperty 為例說明
在這篇文章 - Document Your SQL Server Databases with Extended Properties 內,有把三層 Level 的物件,利用圖表方式來表達,清楚明瞭,看完就知道 Level0、Level1 和 Level2 參數,要如何設定
操作擴充屬性的三個功能,分別為 sp_addextendedproperty、sp_updateextendedproperty 和 sp_dropextendedproperty,在 MSDN 說明上,都會有 Level0、Level1 和 Level2 參數需要設定,以 sp_addextendedproperty 為例說明
在這篇文章 - Document Your SQL Server Databases with Extended Properties 內,有把三層 Level 的物件,利用圖表方式來表達,清楚明瞭,看完就知道 Level0、Level1 和 Level2 參數,要如何設定
星期四, 12月 17, 2015
星期三, 12月 16, 2015
Microtek ArtixScan DI 2125c
測試 Microtek ArtixScan DI 2125c Win10 Driver 時,一直抓不到該 scanner,即使我上官網重新下載最新版本(Win7) Driver,也無法在 Win10 上驅動該 scanner,打電話訊問課服才發現,原來還有另外一個官網,Orz
在 Google 上輸入 Microtek 前兩個網址,都是 ww3 開頭
客服人員請我在 ww3 網頁上點選 Microtek logo 就可以進入最新官網,還很貼心地告知我,該 scanner 目前並沒有推出 Win10 Driver 用 Win7 的就可以,且安裝時 scanner 不要跟 PC 連接,安裝完成後重開機後,再連接 PC
兩個不同網址下載 Driver 分別為
在 Google 上打 Microtek 或全友,搜尋內容第一頁完全沒有 ww7 的影子,^^''
在 Google 上輸入 Microtek 前兩個網址,都是 ww3 開頭
客服人員請我在 ww3 網頁上點選 Microtek logo 就可以進入最新官網,還很貼心地告知我,該 scanner 目前並沒有推出 Win10 Driver 用 Win7 的就可以,且安裝時 scanner 不要跟 PC 連接,安裝完成後重開機後,再連接 PC
兩個不同網址下載 Driver 分別為
- ww3:swdi_3160_eu
- ww7:swdi_3670_eu
在 Google 上打 Microtek 或全友,搜尋內容第一頁完全沒有 ww7 的影子,^^''
星期二, 12月 15, 2015
星期二, 12月 08, 2015
[C#] 變更 MDI 父表單的背景顏色
根據這篇官方文章 如何變更 MDI 父表單中視覺化 C# 中的背景色彩 的練習筆記
把 IsMDIContainer 設為 True 之後,Form 會變成下圖
在 Form_Load 利用 C# Code 來變更 MDI 背景顏色
把 IsMDIContainer 設為 True 之後,Form 會變成下圖
在 Form_Load 利用 C# Code 來變更 MDI 背景顏色
namespace MDIBackGroundColor { public partial class MDIParent : Form { public MDIParent() { InitializeComponent(); } private void MDIParent_Load(object sender, EventArgs e) { foreach (Control ctl in this.Controls.OfType<MdiClient>()) { ctl.BackColor = Color.YellowGreen; } } } }執行後效果
星期四, 12月 03, 2015
[SQL] 權限設定
論壇問題:原 PO 對 db_datareader 和 db_datawriter 權限設定有疑慮,剛好拿來練習並驗證
建立 Login (LoginWrite) 和 User (UserWrite) 對 AdventureWorks2014 內的 Demo Table 進行不同權限設定的 SELECT、INSERT、UPDATE 和 DELETE,藉此觀察權限設定情況
建立 Login (LoginWrite) 和 User (UserWrite) 對 AdventureWorks2014 內的 Demo Table 進行不同權限設定的 SELECT、INSERT、UPDATE 和 DELETE,藉此觀察權限設定情況
USE [AdventureWorks2014]
GO
IF OBJECT_ID('Demo') IS NOT NULL
DROP TABLE Demo
-- 建立一個簡單 Table 來驗證,是否具備 Read 或 Write 權限
CREATE TABLE [dbo].[Demo](
[ID] [int] NULL
) ON [PRIMARY]
GO
IF EXISTS
(
SELECT 1
FROM sys.database_principals
WHERE Name = 'UserWrite'
)
DROP USER UserWrite
IF EXISTS
(
SELECT 1 FROM sys.sql_logins WHERE Name = 'LoginWrite'
)
DROP LOGIN LoginWrite
-- 建立 Login
CREATE LOGIN [LoginWrite]
WITH PASSWORD = N'P@ssw0rd',
DEFAULT_DATABASE = [AdventureWorks2014],
DEFAULT_LANGUAGE = [繁體中文],
CHECK_EXPIRATION = OFF,
CHECK_POLICY = OFF
GO
-- 建立 User 並指定預設 Schema
CREATE USER [UserWrite] FOR LOGIN [LoginWrite] WITH DEFAULT_SCHEMA = [dbo]
GO
-- 把 UserWrite 加入 db_datareader 內
EXEC sys.sp_addrolemember 'db_datareader' , UserWrite
-- 確認目前的 Login 和 User:
-- SUSER_SNAME():WIN2012R2\Administrator
-- USER_NAME() :dbo
SELECT
SUSER_SNAME() , -- Instance Level
USER_NAME() -- DB Level
-- 切換 Login 來進行測試
EXECUTE AS LOGIN = 'LoginWrite'
-- 確認目前的 Login 和 User:
-- SUSER_SNAME():LoginWrite
-- USER_NAME() :UserWrite
SELECT
SUSER_SNAME() , -- Instance Level
USER_NAME() -- DB Level
-- 權限測試
-- 對 Demo Table 進行 Select、Insert、Update 和 Delete
SELECT * FROM [AdventureWorks2014].[dbo].[Demo]
INSERT INTO [AdventureWorks2014].[dbo].[Demo] (ID) VALUES(1)
DELETE FROM [AdventureWorks2014].[dbo].[Demo]
UPDATE [AdventureWorks2014].[dbo].[Demo] SET ID = 2
-- 測試訊息
--(0 個資料列受到影響)
--訊息 229,層級 14,狀態 5,行 65
--結構描述 'dbo',資料庫 'AdventureWorks2014',物件 'Demo' 沒有 INSERT 權限。
--訊息 229,層級 14,狀態 5,行 66
--結構描述 'dbo',資料庫 'AdventureWorks2014',物件 'Demo' 沒有 DELETE 權限。
--訊息 229,層級 14,狀態 5,行 67
--結構描述 'dbo',資料庫 'AdventureWorks2014',物件 'Demo' 沒有 UPDATE 權限。
-- 返回 WIN2012R2\Administrator Login,後續要對權限進行設定 LoginWrite 和 UserWrite 並沒有授給權限的權利
REVERT
-- 確認目前的 Login 和 User:
-- SUSER_SNAME():WIN2012R2\Administrator
-- USER_NAME() :dbo
SELECT
SUSER_SNAME() , -- Instance Level
USER_NAME() -- DB Level
-- 授給 UserWrite 對 Demo Table 進行 INSERT 的權限
GRANT SELECT , INSERT
ON AdventureWorks2014.dbo.Demo
TO [UserWrite]
-- 切換 Login
EXECUTE AS LOGIN = 'LoginWrite'
-- 權限測試
-- 對 Demo Table 進行 Select、Insert、Update 和 Delete
SELECT * FROM [AdventureWorks2014].[dbo].[Demo]
INSERT INTO [AdventureWorks2014].[dbo].[Demo] (ID) VALUES(1)
DELETE FROM [AdventureWorks2014].[dbo].[Demo]
UPDATE [AdventureWorks2014].[dbo].[Demo] SET ID = 2
-- 測試訊息
--(0 個資料列受到影響)
--(1 個資料列受到影響)
--訊息 229,層級 14,狀態 5,行 96
--結構描述 'dbo',資料庫 'AdventureWorks2014',物件 'Demo' 沒有 DELETE 權限。
--訊息 229,層級 14,狀態 5,行 97
--結構描述 'dbo',資料庫 'AdventureWorks2014',物件 'Demo' 沒有 UPDATE 權限。
-- 返回 WIN2012R2\Administrator Login,後續要對權限進行設定 LoginWrite 和 UserWrite 並沒有授給權限的權利
REVERT
-- 把 UserWrite 加入 db_denydatawriter 內
EXEC sys.sp_addrolemember 'db_denydatawriter' , UserWrite
-- 切換至 LoginWrite
EXECUTE AS LOGIN = 'LoginWrite'
-- 權限測試
-- 對 Demo Table 進行 Select、Insert、Update 和 Delete
SELECT * FROM [AdventureWorks2014].[dbo].[Demo]
INSERT INTO [AdventureWorks2014].[dbo].[Demo] (ID) VALUES(1)
DELETE FROM [AdventureWorks2014].[dbo].[Demo]
UPDATE [AdventureWorks2014].[dbo].[Demo] SET ID = 2
-- 測試訊息
--(0 個資料列受到影響)
--訊息 229,層級 14,狀態 5,行 117
--結構描述 'dbo',資料庫 'AdventureWorks2014',物件 'Demo' 沒有 INSERT 權限。
--訊息 229,層級 14,狀態 5,行 118
--結構描述 'dbo',資料庫 'AdventureWorks2014',物件 'Demo' 沒有 DELETE 權限。
--訊息 229,層級 14,狀態 5,行 119
--結構描述 'dbo',資料庫 'AdventureWorks2014',物件 'Demo' 沒有 UPDATE 權限。
星期三, 12月 02, 2015
[Win10] build 查詢
Win10 查詢 build 資訊
開啟後在系統內,就可以找到,功能表 => 說明 => 關於 Windows 選項
- 方法一:利用指令
- 方法二:檔案總管功能表
檔案總管 => 檢視 => 選項 => 檢視 Tag 內勾選 "一律顯示功能表"
開啟後在系統內,就可以找到,功能表 => 說明 => 關於 Windows 選項
- 結果:上述二種方法,都可以開啟 "關於 Windows" 並查詢 build 資訊
- 20170313 方法三:關於
星期一, 11月 30, 2015
自動倉儲監控軟體安裝
老大決定要淘汰自動倉儲監控備品 NT4.0 PC,因此要多弄台 XP PC 來當備品,一波三折的過程,>.<
N 年前在 XP 上安裝時,完全沒有任何印象有遭遇任何困難,在 XP 上設定好 ODBC、安裝好監控軟體,很順利地就上線,安裝的筆記重點也只有要注意該 PC 需要兩個 COM Port
執行監控軟體出現的錯誤訊息
檢查方向
Uptech UT300 RS-232 擴充卡,COM Port Number 竟然是 3 和 4,Orz
把三個 COM Port Number 都調整一下,讓該擴充卡是 COM1 和 COM2
監控軟體就順利 run 起來
N 年前在 XP 上安裝時,完全沒有任何印象有遭遇任何困難,在 XP 上設定好 ODBC、安裝好監控軟體,很順利地就上線,安裝的筆記重點也只有要注意該 PC 需要兩個 COM Port
執行監控軟體出現的錯誤訊息
執行階段錯誤 '8002': 不正確的連接埠代號
檢查方向
- 因為 SQL Server Port 不是預設的 1433,所以看見該訊息第一直覺是 ODBC 沒有設定好,但在 XP 內測試都是正常的阿,
- 想到不會是該軟體用到的 MDAC 版本比較低,所以才出問題,也不是它,暈
- 軟體安裝完成後的設定檔,利用 KDiff 軟體比對一下是否和線上 PC 的一致,完全一模一樣
Uptech UT300 RS-232 擴充卡,COM Port Number 竟然是 3 和 4,Orz
把三個 COM Port Number 都調整一下,讓該擴充卡是 COM1 和 COM2
監控軟體就順利 run 起來
星期五, 11月 27, 2015
星期六, 11月 21, 2015
ASUS BM1AF 網路卡 Driver
嘗試要把這台 ASUS 商用機從 Win7 升級為 Win10,採用先把 Win7 還原到新 Disk 後,再升級為 Win10 的方法,萬一升級失敗,至少原 Disk 還在,不會影響使用者作業。
升級成 Win10 後,就發現到網路卡異常,雖然在裝置管理員上顯示有驅動,但右下角網路圖示上就是一直有個三角形驚嘆號在上面,且也無法對外連線,Orz
後來發現到升級過程,有安裝 MS Driver,從 ASUS 官方網站上找到 Win10 Driver,重新更新就 OK 啦
我看 Driver 還是通通用官方的好了,^^''
升級成 Win10 後,就發現到網路卡異常,雖然在裝置管理員上顯示有驅動,但右下角網路圖示上就是一直有個三角形驚嘆號在上面,且也無法對外連線,Orz
後來發現到升級過程,有安裝 MS Driver,從 ASUS 官方網站上找到 Win10 Driver,重新更新就 OK 啦
- 原 Win7 上網路卡 Driver
- 升級 Win10 後變成 MS Driver
- 改安裝官方 Win10 Driver
我看 Driver 還是通通用官方的好了,^^''
- 20151125
星期五, 11月 20, 2015
硬體檢測
備品 PC 原是另一台設備的 PC,因為工業設備被淘汰掉,PC 就被拿來當成備品使用,每次線上 PC 出問題,就把它直接拿上去,沒有出現任何問題過,所以也從來沒有檢查過它,這次因為線上 PC 有異常,有使用到它,就突然一個念頭想檢查它,一檢查下去才發現是未爆彈,Orz
備用 PC 零件
找顆 Disk 利用 Ghost 還原系統後,在進入 BIOS 時都會有 Memory 異常的訊息,用 MemTest 一起檢查三隻 SDRAM 是正常,直到在 OS 中出現藍色死亡畫面,錯誤訊息是 Beginning dump o physical memory,這就真的很肯定 SDRAM 一定有問題
單獨測試 SRAM 並插到不同的槽位檢查,果然有一隻出問題,MemTest 一 run 就一直錯誤
一隻 SDRAM 掛掉就算還發現主機板記憶體第二槽有問題,Orz
不知道公司內的備品零件,可不可以撐到該設備淘汰,^^''
備用 PC 零件
- 主機板:PII
- Disk:Quantum 15G
- Memory: SDRAM 64M *1 + SDRA 32M * 2,共 128M
- OS:NT4.0
找顆 Disk 利用 Ghost 還原系統後,在進入 BIOS 時都會有 Memory 異常的訊息,用 MemTest 一起檢查三隻 SDRAM 是正常,直到在 OS 中出現藍色死亡畫面,錯誤訊息是 Beginning dump o physical memory,這就真的很肯定 SDRAM 一定有問題
單獨測試 SRAM 並插到不同的槽位檢查,果然有一隻出問題,MemTest 一 run 就一直錯誤
一隻 SDRAM 掛掉就算還發現主機板記憶體第二槽有問題,Orz
不知道公司內的備品零件,可不可以撐到該設備淘汰,^^''
星期四, 11月 19, 2015
星期三, 11月 18, 2015
[Win] 排程未啟動
Win2008R2 搭配 SQL Express,因此必須依賴 Windows 排程來進行自動化維護,發現刪除備份檔案的排程沒有動作,原來是排程設定後,沒有啟動,Orz
- 該排程沒有下次執行時間
- 編輯觸發程序中,沒有勾選 "已啟用"
- 啟動該排程後,就可以看見下次執行時間
星期二, 11月 17, 2015
子母接頭 Power
整理 Power 時發現這顆有歷史的子母接頭 Power,之前故障時還拜託老大要採買這類 Power,才知道老早就停產,市面上根本買不到,^^''
公司最後一顆,拍張相片紀念一下,以後也不會有了
公司最後一顆,拍張相片紀念一下,以後也不會有了
- 20160613
星期三, 11月 04, 2015
[SQL] Database Mail 搭配 Gmail 發信
之前是透過 Windows SMTP 來發信,想說利用 Gmail 來試看看,設定後發送測試信一直失敗,錯誤訊息是
20210413 設定時出現下列錯誤訊息
訊息郵件伺服器失敗,所以無法將郵件傳送給收件者。 (使用帳戶 4 (2015-11-04T17:59:19) 傳送郵件。例外狀況訊息: 無法傳送郵件到郵件伺服器。 (SMTP 伺服器需要安全連接,或用戶端未經驗證。 伺服器回應為: 5.5.1 Authentication Required. Learn more at)。Google 一堆資料都看不出是哪裡設定錯誤,最後靈光一閃想到,該 Gmail 帳號有設定二階段驗證,應該是這樣才一直驗證不過,改用另一個不需要驗證的 Gmail 來測試就成功,Orz
- 透過 Gmail 設定畫面
- 收到的測試信
郵件伺服器失敗,所以無法將郵件傳送給收件者。 (使用帳戶 2 (2021-04-13T11:29:52) 傳送郵件。例外狀況訊息: 無法傳送郵件到郵件伺服器。 (SMTP 伺服器需要安全連接,或用戶端未經驗證。 伺服器回應為: 5.7.0 Authentication Required. Learn more at)。 )確認後發現,Gmail 上要開啟 [低安全性應用程式存取權]
發現沒有收到 Windows 事件檢視器和 SQL Server 錯誤記錄檔訊息,一查發現 Google 安全性上有作改變,現在就真的只能使用應用程式密碼來達到發信功能囉
取得應用程式密碼,詳見 [SQL] Database Mail 搭配 Gmail 發信 - 應用程式密碼
- 參考資料
- Transact-SQL Database Mail 實戰篇
- How to configure SQL Server Database Mail to send email using your Windows Live Mail Account or your GMail Account
- Setup SQL Server Database Mail to use a Gmail, Hotmail, Yahoo or AOL account
- Setting up Database Mail to use Gmail account for Presentations
- Setting up SQL Server Database Mail with gmail
- 在郵件用戶端內設定 POP
- [SQL] Database Mail 設定 - 設定 Office 365 來發信使用
- [廚餘回收] 解決 Gmail 不支援應用程式或裝置透過簡易郵件傳輸通訊協定(SMTP)傳送電子郵件
星期五, 10月 30, 2015
星期四, 10月 29, 2015
[HyperV] 虛擬交換器
觀看 Windows Server 2012 R2 Hyper-V 深入探索 影片時,老師介紹虛擬交換器時,提到下面圖片是虛擬化化戰士考題,搞懂這題應該就搞懂虛擬交換器,拿來練習
考題,從課程 PowerPoint 中抓出來的
VM 網路卡 IP 設定,練習完要寫筆記時才發現,VM5 的 IP 順序反過來了,^^''
考題,從課程 PowerPoint 中抓出來的
VM 網路卡 IP 設定,練習完要寫筆記時才發現,VM5 的 IP 順序反過來了,^^''
星期二, 10月 27, 2015
[HyperV] 辨別多張網路卡
觀看 Windows Server 2012 R2 Hyper-V 深入探索 影片時,老師提到 VM OS 內多張網路卡時,不要採用網路卡預設值,不容易分辨,VM OS 內的網路卡名稱要清楚明白
紅框內是 VM OS 內網路連線的預設名稱、橘框是 HyperV 管理員內的網路卡,兩者無法對應
在 Hyper-V 管理員下有個 網路功能 Tag,會記載該 VM 上有那些網路卡,重點是有網路卡 Mac 資訊
VM OS 命令提示字元內輸入 ipconfig /all 就可以找出網路卡 Mac 資訊
兩者互相搭配就可以找出 Hyper-V 網路卡和 VM OS 網路卡的對應
更名後,紅框和橘框就一目了然啦
最後要注意多張網卡情況下,Hyper-V 內設定的網路卡順序,並不一定就是 VM OS 內的網路卡順序
紅框內是 VM OS 內網路連線的預設名稱、橘框是 HyperV 管理員內的網路卡,兩者無法對應
在 Hyper-V 管理員下有個 網路功能 Tag,會記載該 VM 上有那些網路卡,重點是有網路卡 Mac 資訊
VM OS 命令提示字元內輸入 ipconfig /all 就可以找出網路卡 Mac 資訊
兩者互相搭配就可以找出 Hyper-V 網路卡和 VM OS 網路卡的對應
更名後,紅框和橘框就一目了然啦
最後要注意多張網卡情況下,Hyper-V 內設定的網路卡順序,並不一定就是 VM OS 內的網路卡順序
星期三, 10月 21, 2015
[SQL] Linked Server 使用資料表值函數
論壇問題
搜尋到這篇文章時 Remote table-valued function calls are not allowed 還想說,2008 的版本應該就不會有這個問題,實際在 2014 上測試,這問題來是存在
利用 Linked Server 呼叫資料表值函數建立一個資料表值函數來測試
CREATE FUNCTION dbo.GetDepartment(@DepartmentID smallint)
RETURNS TABLE
AS
RETURN
(
SELECT
GroupName ,
DepartmentID ,
Name
FROM Adventureworks2014.HumanResources.Department
WHERE DepartmentID = @DepartmentID
)
GO
利用 Linked Server(已事先建立,名稱為 HyperV)四部份名稱來呼叫資料表值函數SELECT * FROM HyperV.Adventureworks2014.dbo.GetDepartment(1)
GO
會得到下面錯誤訊息訊息 4122,層級 16,狀態 1,行 22改利用 OPENQUERY() 來呼叫
不允許遠端資料表值函數呼叫。
SELECT *
FROM OPENQUERY
(
HyperV,
'SELECT * FROM AdventureWorks2014.dbo.GetDepartment(1)'
)
搜尋到這篇文章時 Remote table-valued function calls are not allowed 還想說,2008 的版本應該就不會有這個問題,實際在 2014 上測試,這問題來是存在
- 延伸閱讀
- [SQL] 使用者自訂函數
星期二, 10月 20, 2015
星期三, 10月 14, 2015
[SQL] 警示應用 - 常見硬體錯誤訊息
學習 Alert 時,閱讀網路文章,有人把 823、824 和 825 這三個 Error 列為必設的 Alert,當時只知道是硬體錯誤相關,了解 DBCC CheckDB 和閱讀 王者歸來 SQL Server 2012 實戰指南 ch10 之後,就比較清楚 823、824 產生原因,且 DBCC CheckDB 通常不會是每日執行的檢查項目之一,搭配 Alert 來捕捉較常見的 Error,期望可以在最短的時間內知道資料庫毀損並進行處理
- 建立 Alert
星期二, 10月 13, 2015
[SQL] DBCC CheckDB 發信通知
破壞 DB 後,利用 DBCC CheckDB 來檢查 AdventureWorks2014,發現錯誤就發 mail 通知
在網路上看見有人用 TRY CATCH 來捕捉 DBCC CHECKDB 產生的錯誤,試過發現 TRY CATCH 沒有辦法捕捉,只能用 @@ERROR 來判斷
DBCC CHECKDB('AdventureWorks2014') WITH PHYSICAL_ONLY
IF @@ERROR > 0
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Database Mail Profile' ,
@recipients = '收寄人 Email' ,
@subject = 'SQL Server 通知 - DBCC CheckDB 發現錯誤' ,
@body = 'AdventureWorks2014 資料庫,DBCC CheckDB 發生異常' ,
@body_format='TEXT'
END
收到的 Mail 通知在網路上看見有人用 TRY CATCH 來捕捉 DBCC CHECKDB 產生的錯誤,試過發現 TRY CATCH 沒有辦法捕捉,只能用 @@ERROR 來判斷