Pages

2016-11-24

建立目錄與VSTS Git版控服務的綁定教學

Visual Studio Team Services網站(以下簡稱VSTS)提供Git Private Repository免費空間服務,在VS2015下可以使用Team Explorer與專案建立連結。然而我們的專案目錄通常不只存放一個Solution方案,也會放置專案文件,因此會以上一層目錄為Git Working Directory,就無法使用VS2015的Team Explorer工具來設定了。以下示範如何在Windows系統下不透過VS2015工具,直接綁定某目錄與VSTS Git Repository的綁定教學.

  1. 登入Visual Studio Team Services網站,建立一個以Git版本為主的Team Project目錄。
    網址: https://XXX.visualstudio.com/  (XXX = VSTS申請的名稱)
    Create Team Project
  2. 系統安裝TortoiseGit, 建立一個空目錄ZZZ,在該目錄下按右鍵選擇「Git Clone」功能。
    Git Clone ContextMenu
  3. 設定Git clone設定:
    VSTS的GIT Remote URL網址為:  https://XXX.visualstudio.com/DefaultCollection/_git/YYY (XXX = VSTS申請的名稱, YYY = Project名稱)
    Git Clone Setting
    按下OK後它會進行與遠端VSTS服務的登入驗證及綁定工作。
  4. 成功綁定後,把VS2015的專案目錄移入該ZZZ目錄下,再右鍵選擇「Git Commit」把新目錄寫入VSTS遠端即可。
    Git Commit Git Linked Status
  5. 開啟ZZZ目錄下的任何VS2015 Solution方案檔,專案自動都跟VSTS的Git版控進行良好的結合了。
    VS Solution Explorer
  6. 某些不需要版控的目錄,如obj/, publish/輸出目錄,可以設定「Add to ignore list」。
    Ignore List

2016-10-19

SQL Server版號對照表

SQL Server的版號不只有受主版本及Service Pack (SP)才會異動,平時的Windows Update補丁若有修正SQL Server的,也會改變。下表列出主要的SQL版本號碼,要配合現在DB版本,只要選擇最接近的低版本即可相容。

image

資料來源: http://sqlserverbuilds.blogspot.tw/

2016-10-12

掛載USB隱藏分區(Hidden Partition)

要將PE系統製作至一個USB開機碟時,通常它會分成兩個分區(Partition),分別為下圖編號1的資料區(Data)及及編號2開機區(Boot, Hidden),並且把開機區設定隱藏+活動(Active+Hidden),如此插入USB碟時,系統只會出現Data區。

Partition List

Partition Unhide

要升級PE工具的新版本,一般做法是直接替換開機區內的*.wim (Windows Image Manager)系統映像檔即可。但是開機分區雖能夠取消隱藏,卻無法掛載盤符至系統裏來操作,因為一般分區工具只允許磁碟第1主分區位置才能掛載盤符。為了解決這問題,我們可以使用BOOTICE工具來掛載任一隱藏分區至系統。

操作步驟為:

  1. 開啟BOOTICE工具,選擇「Physical disk > Destination Disk > Parts Manage」,然後選擇
    BOOTICE Parts
  2. 選擇隱藏分區,點擊「Assign Drive Letter」按鈕,即可在系統載掛此分區。
    BOOTICE Assign Drive
  3. 解開新版PE ISO檔,將boot.wim覆蓋掉隱藏區的舊檔,再點擊BOOTICE裏的「Remove Drive Letter」按鈕即可恢復隱藏。
    BOOTICE Remove Drive
  4. 完成隨身碟的PE版本升級。

2016-10-07

鴻象電子式定時器的電池缺點

鴻象電子式定時器是我在2012年於COSTCO購入而接觸使用的電子產品,它採用絕對時間制用來控制夜燈的定時開關很便利,運作一直也相當穩固。發現它的內建充電電池是它的優點也是缺點,只要電池老化或長時間不充電,當電池進入低電位無法復位就整組壞掉了,使用年限約4年。

拆開插座內部,其電路版的結構很乾淨紮實,通常穩固的電子產品看電路版就知品質了。箭頭處應該是充電電池的位置,但它被焊死無法更換了。以這個產品的紮實感應該是可以用得更久,可惜受限在一個電池壽命非得棄全身,相當可惜。

image

不禁讓人思考,很多電子產品的設計,廠商會以商業考量用某短壽命零件的避免產品長壽命,但這就像一個健康的青壯年人死於某小器官的癌症,以生命本身的價值非常不忍心,而電子產品的丟棄則不環保。雖然很多人都會用價錢/年限比來衡量值不值得,但假如一個產品的設計不要綁死在短壽命的零件上,或許能讓USER更相信電子產品的穩定性,如同大同電鍋能用上十年前不壞而獲得用戶喜愛。

每種產品設計都有其考量立場,就像手機使用不能拆換電池的設計,有其輕薄機身構造優點,及減低頻繁拆換電池可能造成的損傷之理由,但廠商至少能像蘋果手機保證官方電池換修的年限,會更合理一些。當我們在設計創造作品時,常以「生命會找到出路」這句話來讚嘆生命變化的驚喜,但若在裏頭埋入一個顯著短期必死的炸彈,這等於是扼殺了這句話的精神,共勉之。

2016-06-15

建立WinPE工具多重開機系統

以前在Linux系統流行放入一個Live CD光碟片就可以運行一個微型OS系統,Windows也有這樣一個稱為PE (Preinstall Environment)的微系統,就是安裝Win7/Win10時的那簡易UI環境,用來作系統備份及救援非常好用。大陸網上有各式各樣的自製PE系統,目前大都是使用Win8核心,其中我個人覺得「無垠PE组合工具」最為優秀,它除了有Ghost備份還原工具外,還有ATI (Acronis True Image)備份工具可以排除某目錄,也提供網路驅動的機制,雖然整個ISO檔肥了一點(540MB),但以現在新電腦的硬件規格,運行大PE系統輕而易舉。

WinPE Snapshot

自製PE系統的發佈通常是以ISO光碟檔發佈,常被製成USB開機碟進入系統,若想把PE裝入目前的Win7/Win10作業系統裏並行,李培聰的WePE工具有提供EXE安裝版(簡體介面)最為方便。它其實是把PE ISO解壓縮至C:\WinPE目錄,並自動新增一個Windows的BCD (Boot Configuration Data)開機選單項目指到該WinPE目錄裏的WIM映像檔,並作隱藏。

簡單來說,BCD開機項目就是指定到一個WIM (Windows Image Manager)系統映像檔,裏面存放各種免安裝綠化工具,而一般的ISO檔就是內含這樣的WIM檔及開機組態設定。BCD開機項目也可以指定一個到ISO光碟檔,這樣會更方便替換新的PE ISO檔。

以下介紹如何在Win7/Win10現行系統下,製作平行的多開機PE系統。

  1. 請從ZD243網站下載最新版無垠PE工具ISO檔,以避免下載到假檔。它區分無網路及有網路驅動的ISO檔,我們當然選擇最強大的網路版ISO,將它放在C:\WinPE目錄裏。
  2. 下載EasyBCD開機管理工具,它是一套綠化免安裝免費軟件。以Run as Admin方式運行EasyBCD.exe,依下圖步驟編號,新增一個BCD開機項目。
    EasyBCD Add New Entry
  3. 新增後選擇「Edit Boot Menu」,取消「Metro bootloader」的勾選及設定倒數為3秒。Metro Boot Loader就是Win10開機時使用淺藍色美化過的開機選單畫面,它不僅會拖慢開機速度,而且在Metro畫面下選擇進入PE工具系統得重開機一次,因此不要勾選它。Win2008 Server的開機選單預設就是不使用Metro介面,以加快開機速度。
    EasyBCD Edit Boot Menu
  4. 儲存後退出EasyCD,即可Reboot重開機看看效果。以上的教學流程,你也可以在VM虛擬機器上測試。BCD項目指到ISO檔時會先Loading內容到記憶體,這段ISO載入時間時間並不長,雖然比直接指定WIM檔慢一點,但使用ISO方式比較好更換新版PE。
    Windows Boot Manager
    讀取ISO內容至記憶體需一小段時間,對於不常進PE系統的實務,這點等待時間是可接受的。
    image
  5. 你可以把C:\WinPE目錄設為隱藏,也可以不管,下次有新的PE ISO檔發佈,直接蓋ISO檔即可。

2016-06-08

網站w3wp.exe強佔Access denied解法

當我們把一個圖庫目錄上傳至網站,透過匯入程序將圖片歸類要移至正確目錄位置時,通常會出現「Path XXX access denied」錯誤。在IIS6/2003時代,這通常是指該目錄沒有Network Service角色寫入權限,但在IIS7.5/2008後,ASP.NET的執行權限是由AppPool角色來決定,即使使用最高權限「LocalSystem」,一樣會有w3wp.exe強佔匯入目錄的問題。

w3wp.exe Lock

上圖是透過Lock Hunter軟件顯示該目錄被強佔的資訊,須要手動解除鎖定。爬過很多網文及嘗試皆無法有效解除w3 worker process佔住的問題,只要有切入該目錄或顯示File List就會強佔,跟是否using/Dispose()或Web.config/runAllManagedModulesForAllRequests皆無關。一開始我的思路是它既然能透過軟件強制解除強佔,是否只要讀出其Handle ID/Process ID皆可批次解除,但最後發現即使透過外掛程式要Kill掉主機端程序不是那麼容易及即時,因此此方法受堵。

相信大家在Windows系統裏,都曾有刪除某目錄卻因在使用中無法刪除的經驗,但其實刪除其內的檔案卻是允許的!因此我們的解決思路,可以使用二段式。當圖庫目錄讀取歸類後先「複製」至正確位置,然後只刪除其內的圖檔,讓它變成一個空目錄,你也可以寫個「已匯入完成.txt」標記來提醒使用者。另外撰寫另一個網頁程式專門來清除這些特殊空目錄的存在,因此當User執行別的網頁時,發現w3wp.exe就不會再強佔該目錄了。

這是一個迂迴的二段式解法,專門用來處理網頁檔案上傳時的強佔問題。建議作法上是先放在Temp臨時目錄,再使用複製目錄來歸檔,這些殘留下來的目錄,可以等下次執行時清除1天前殘存資料即可,這段間隔時間也夠IIS AppPool行程Recycle回收,保證不會被強佔住的。

2016-06-01

製作自己的jQuery Plugin套件

在Web設計的事件點擊(Event Handler)裏,使用link會比button更好用,因為它有hover事件,要用css換底圖都方便。

LinkButton UI

簡單的Design Pattern就是以下的範例,透過jQuery讀取id作switch判斷。

LinkButton Switch

優質的LinkButton,還要避免短時間雙擊(double click)的問題,這可以透過在click()事件前後埋入data-clicked+setTimeout()來判斷短時間點擊。另外也要避免URL#的問題,這只要記得傳回event.preventDefault()及return false即可。

總是有一些小細節要處理,而且又要重複使用,最好的作法就是包裝成jQuery Plugin。官方的Plugin教學比較陽春一點,此篇中文框架教學比較平易近人,文中不懂的關鍵字查GOOGLE就會有衍生的教學。

比較好的jQuery Plugin框架,應該是要能傳入options設定值,而且也能獨立呼叫裏面的methods才對。例如

LinkButton Init

建立jQuery Plugin的思路及方法,可以閱讀這篇文章,作者使用plugin prototype來擴增方法,不過它比較不好理解,我會建議觀看jQuery EasyUI LinkButton 的Plugin框架來寫作比較好理解(請自行下載查看其SRC源碼)。雖然EasyUI是一個重度自生html的套件,裏頭寫得很複雜,不過它的Plugin建構式架構是挺好的學習參考,用來實作自己的Plugin很棒。

為了促進對它的Plugin框架初始化的理解,我把它抽取出來去掉不必要的東西,整理如下圖。若你看不懂它在寫什麼,可能是對jQuery API還不甚熟悉,那就先仿照其他別的Plugin框架來實作也是可以的。

LinkButton Framework

最後值得一提的是,包裝jQuery Plugin要注意this的問題,除了$.fn.XXX()這個函式的this是指向jQuery物件外,其餘大部分的this都是指DOM物件。因為DOM物件是JS標準,所以要用它來作內部函式及外部的參數傳延溝通,而不是用jQuery Object來便宜行事.

2016-05-25

MVC Razor迴圈分組顯示

在MVC Views (*.cshtml)裏要將一個資料集合作loop迴圈分組顯示,一般正規的Razor程式寫法如下圖:

Rzaor Regular Grouping

應用在Table裏,它就可以輸出下圖行列的分組效果。

Razor Regular Output

但是一個View裏可能會存在多個群組顯示,若每個區塊都放上述的Razor源碼,不僅容易變數衝突,也缺乏程式ReUse的精神,所以我們可以利用C# Action Delegate把需要客制化的部分抽取出來,下圖函式內部裏的StringBuilder可以省略掉,以適應更多的變化:

Action Method

日後在Razor View裏,就可以輕易輸出Grouping HTML自訂字串了。
Razor Custom Grouping

MVC最主要精神就是不要在View裏寫複雜的邏輯程式判斷,應該要將這些分組寫法放到Model去,再包一層Method來簡化呈現參數,例如只提供群組數量就好。

2016-05-18

ASP.NET MVC的執行亂碼訊息

在使用VS2015開發ASP.NET MVC5 Web Application時,若要一步步偵錯當然是執行Debug模式,但它的執行速度比較慢,而且進入點不好控制。所以若很複雜的偵錯,我通常直接使用Release模式(Ctrl+F5)來測跑結果,有錯誤訊息再修改就好。畢竟程序寫久有經驗了,通常只是打錯字而己。

我的習慣是修改後,直接在View的頁面(*.cshtml)視窗按滑鼠右鍵,選擇「View in Browser」來作執行測試:

View in Browser

當cs源碼裏執行有錯誤時,卻發現它出現是亂碼,即使在Web.config設定<customErrors>也無法正常顯示錯誤訊息。偶然一次機會裏,在執行jQuery AJAX存取某頁面View時,我發現在js裏可以讀出正常編碼。

因此我安裝Chrome Postman這個套件,使用GET方式貼上測試頁面的網址(下圖編號2),即可產生正確的錯誤訊息。從此,這樣的方式就是我慣用的MVC專案除錯模式了。

Chrome Postman

在ASP.NET 4.6.1的MVC5 「Web Application」裏,每當異動了cs程式碼,均需重新Build Project,沒有「Website」專案自動編譯的方便功能,可惜MVC5並不完整支援Website專案。值得慶幸的是,WebApp正佈網站時,日後的cs異動只需要直接覆蓋主要的DLL即可,不需要像Website須重新Publish,算是功過相抵能接受。

2016-05-11

使用Docker執行本機端Mono程序

Docker 和傳統虛擬化方式的不同之處,在於少了Guest OS這層,除了大幅減少磁碟空間,最重要是獲得本機的執行效能,直接使用本地主機的作業系統。詳細介可,可閱讀這份教學文件
Docker vs VM

一般而言,我們會在Docker Container虛擬環境中運行獨立服務,透過IP Port對映與外界Host溝通互動。在VMware裏有個Unity功能,可以把Guest VM虛擬環境下的視窗,拉到外面Host運行,感覺就像Host執行一個視窗程式一樣。

Docker也可以透過共用目錄(Docker Volume)讓Host與Guest VM共用同一個資料夾,讓Guest VM去執行共用的程式碼,產生最後結果,再以TTY Console回報至Host,宛如是在本地Host端執行程序一樣。

以下是示範步驟:

  1. 在Ubuntu Linux下安裝Docker:
    # apt-get install docker.io
    約45.4MB
    # docker -v
    Docker version 1.10.3, build 20f81dd
  2. 到Docker Hub尋找官方mono image:

    下載官方mono映像檔image:
    # docker pull mono
    Pull Mono Image
    查看該image資訊
    # docker images
    Docker Images
  3. 在建立mono container之前,我們先建立一個host與container共用目錄(Docker Volume)。
    # mkdir /opt/hello
    建立host本地目錄,應用程式依常規放在/opt/下面(相當Windows的C:\Program Files\XXX)。

    # nano /opt/hello/hello.cs
    建立主程式CS源碼。
    Hello SourceCode
  4. 建立以mono image為主的container, 並掛載/opt/hello這個分享共用目錄。
    # docker run --name mono_container -v /opt/hello:/opt/hello -d -i -t mono /bin/bash
    --name: 命名該container名稱
    -v: 建立分享Volume目錄,指定目錄的對應關係 host_path:container_path
    -d: 該Container以Daemon方式運行,避免建立container時初始狀態為Exited。
    - i –t: 以-i (Interactive)互動方式及獲取-t (TTY)運行container中的/bin/bash環境。
    mono: 指定Image name或ID.
    Container Run
    使用 docker ps -a查詢目前container狀態,此container(mono_container)虛擬環境正在運行中。
  5. 日後要呼叫此container下的虛擬環境及服務,只需要在Host本機輸入docker exec指令即可。
    # docker exec mono_container mono -V
    查詢container下的mono版本資訊
    Mono Version

    因此,編譯及執行Host端的/opt/hello/hello.cs源碼檔,意義和修改Guest VM端裏的檔案是同一份的。
    # docker exec mono_container mcs /opt/hello/hello.cs
    它會編譯hello.cs,並產生hello.exe這個IL檔。
    Docker Exec

    日後在host環境,要執行NET程式,使用以下指令即可:
    # docker exec mono_container mono /opt/hello/hello.exe
    Docker Mono
  6. 若主機reboot重開機,該docker container不會自動運行,可加入rc.local自動運行:
    # vi /etc/rc.local
    加入此行指令即可。
    docker start mono_container

2016-05-04

LINQPad Command Script自動化

我使用LINQPad不是用來查LINQ或SQL,而是把它當作程式產生器,增加編程的工作效率。後來發現它有提供Command-Line的執行模式(lqrun.exe),可以讓伺服器主動透過Schedule排程,定期自動執行一些管理工作,例如每日備份資料庫,FTP上傳到異地備援主機,並刪除超過30天前的舊檔案。你不再需要學習語法難用的Batch File或其他Shell Script,單單純純地執行C# Script即可。

LINQPad免費版本在執行階段沒什麼限制,放在伺服器端跑Task Scheduler批次工作,十分完美搭配。

"C:\LINQPad\lprun.exe" "C:\Task\hello.linq"

Task Scheduler Action

關於更多LINQPad內建功能,請詳見以下連結:

LINQPad Command-Line and Scripting
http://www.linqpad.net/lprun.aspx

LINQPad Extension Methods - Stack Overflow
http://stackoverflow.com/questions/3555317/linqpad-extension-methods

2016-04-29

System UpTime系統已運行時間

在Win7/2008以後,使用Task Manager可以查看系統已運行時間統計,但舊系統XP/2003系統裏必須使用指令systeminfo查看開機時間,此指令也會因執行權限而有所受限,只能靠微軟提供的外掛Command指令uptime工具。
image
為了簡化流程,因此開發了一個簡單的UI工具來查詢系統已運行時間。顯示介面支援多國語言顯示框架,用戶可以自行擴充其他語言及字詞(在Language子目錄仿作)。
  image
為了能讓UI介面高客製化,相關設定皆定義在Config.json檔中,您可自行修改。例如畫面的長寬、重疊置頂(TopMost)、字體Size皆能調整,並支援畫面上的時間字串格式化顯示、自動刷新間隔秒數。
image

Version History:

2016/04/29:
  1. 設計此工具的專屬Web網站,提昇軟件品質形象,也方便用戶查看及下載。
  2. Config中的下載網址異動默認值,相容最小版次值為20160429。
2016/04/22:
  1. 將畫面自訂長寬Size調整納入「Save Preferences」的儲存範圍內,它會自動計算表單的Width/Height Offset的值。
  2. 表單預設寬度,由原本3位數的Days,縮減至2位數的寬度。

Download: (.NET 4.6.1 Required, 綠化免安裝)

前往下載頁面

2016-04-27

免費Free Private Git Server

GIT是一種分散式控本控管工具,適用程式源碼或者任何多次多次編改的文件管理。Git入門教學,很推薦林慶哲先生所寫的「開始進入GIT世界 | GIT教學」文章。強烈建議您一定要從打git command指令來入門(教學文章裏有批次指令可複製貼上,不需死記但要測試效果),才能理解不同git指令之間的差異,等學會之後才使用UI工具「TortoiseGit」。因為遠端GIT Server服務頁面都會提供git該如何存取它的指令,假如不懂指令架構,又如何理解UI工具上的名詞所代表的背後git動作呢?

要架設Private Git Server服務,目前沒有像VirualSVN Server這樣容易架設SVN服務的整合型軟件,而知名的GitHub服務要建立Private Repository是要付費的,因此我根據以下的網路討論串,試用了各種被推薦免費的免費 Private Git雲端服務:

Revision Control Systems: What is the best free service that hosts private Git repositories? - Quora
https://www.quora.com/Revision-Control-Systems-What-is-the-best-free-service-that-hosts-private-Git-repositories

依其服務功能、限制性及有前景不易倒閉的前提下,擇出兩個較佳Private Git雲端服務:

  1. 微軟Visual Studio Team Services (VSTS)的免費Git服務:
    免費無限制的Private Repository,但Free Users限5人. 由於VS2015內建這樣的服務及git工具,因此若開發團隊人數不多的話,會優先推薦使用這個,雖然不是很喜歡它的遠端管理介面。實測它的上傳速度最快約為每秒300KB左右。
    image
  2. GitLab雲端服務:
    GitLab雲端免費服務基本沒什麼限制,且提供自架伺服器軟件GitLab Community Edition (Linux Platform based),而且專案網址很短,管理介面比較像GitHub一樣簡潔清楚。
    image

以上就依自己的需求來選擇Git雲端服務商,在免費的前提下,Public Repository我會優先使用GitHub, 個人獨用的NET專案會使用微軟VSTS,若是和別人合作開發的Private專案,則會使用GitLab服務。

至於另一種透過DropBox分享和別人同步Git目錄的方式並不推薦,因此一般免費帳號才2GB空間,專案不僅只會放程式碼,還會放文件或圖檔的,這點小小空間實在不夠用。

2016-04-20

完美將TXT轉成電子書epub/mobi檔

要將TXT轉換成epub/mobi電子書格式,很多人一開始會選用online-convert, Convert.Files等線上轉換服務,但它轉換速度不快,對章節擷取不一定正確,也有人用Clibre這套Windows下知名的電子書閱讀軟件來轉換,但它內建的轉換操作介面太過複雜。因此我推薦使用EasyPub這個綠化工具程式,只需要幾個很簡單的步驟,就能把TXT純文字檔轉成高品質、排版性佳的epub/mobi電子書格式。
以下是轉換步驟:
  1. 網上搜尋被推薦的書名,並下載該書TXT純文字檔案,很多網上連載小說網站均有提供。
  2. 利用ConvertZ中文繁簡工具,將TXT檔案BIG5/GB2312轉成UTF8編碼的格式(檔案Size會變大)。
  3. 開啟下圖EasyPub工具,拉入或指定來源TXT檔案(編號1),輸出副檔名(編號2)預設是.epub檔,若想轉成Kindle格式,改成.mobi檔即可。
    image
  4. 具有章節索引對於電子書查閱很重要,先打開TXT檔我們發現下圖40行的章節寫法規則,是前面有空白字元,接著「第X章 章節名稱」,因此它的編寫規則都是上圖編號3的方式,點擊編號4按鈕「章節編輯」來預覽判讀結果。
    image
  5. 程式會依章節規則取出符合的項目名稱,但此TXT檔例子它的每個章節都有重複名,因此可以勾選下圖編號2,凡該章節下的內文不超過1行則刪除,即可呈現不重複的章節項目(下圖編號1)。
    image
  6. 針對這本書的相關規則設定,你都可以儲存起來(*.epsav),若該TXT檔是連載中的小說,你就可定期依以上步驟快速產生完美的轉換過程。最後回到主畫面,點擊「開始轉換」按鈕,就可以產生epub及mobi檔案。
  7. 使用Clibre閱讀程式來觀看效果,章節判讀很正確,下圖編號3章節名稱呈現會有區塊底色,但實際在手機電子書軟件「Moon+ Reader」或Kindle實際閱讀時,均不會有這樣礙眼的底色。頁面的配色效果,也可以在EasyPub工具的「定製CSS」中自訂。
    image

2016-04-10

資料庫好幫手SqlDbUtility工具

SQL Server雖然已是一個很友善操作的資料庫(以下簡稱DB),不過其管理工具SQL Server Management Studio(簡稱SSMS)裏的某些Task操作流程過於冗長,我將其比較常用的功能寫成一個Console獨立程式,它可被第三方陰影備份工具或自動化批次檔呼叫使用,比起受限在SSMS的排程工具,多了一些寬廣的選擇。

App Usage

以下介紹它的指令功能 (請使用*.bat批次檔來執行它,省得每次重複打字)

DB終止使用中連線Kill
SSMS裏很多動作在未強制踢出使用連線,是無法進行操作的,此工具會將該DB所有的SPID (Server Process ID)強制踢除,以進行後續工作。
App.exe -d tempdb -x killspid

指定Config內ConnectionString的Key值
為了在同一個bat批次檔執行不同的DB連線,可以在App.config內設定不同的connectionStrings值,再利用-k參數來指定DB連線字串的KeyName,預設值為Default。
App.exe -d tempdb -x killspid -k "Local"
ConnString


DB離線Offline
要替換不同版本的DB內容,不須Detach/Attach資料庫,只需把DB執行離線Offline動作,其MDF/LDF資料檔就不會呈現In Used,可以直接蓋檔。然而,在SSMO下若該DB有人連線使用中,離線指令會失敗,因此本工具會先踢出該DB連線ID, 再執行離線指令。
App.exe -d tempdb -x offline

DB上線Online
未online的DB無法後續操作,因此替換MDF檔案後可啟用。
App.exe -d tempdb -x online

DB備份Backup
自從知道offline DB能換MDF檔後,已很少使用Backup指令了。輸出檔名支援NOW時間格式字串。若未指明路徑,會在Working Directory下建立以DB+日期為名的備份檔。
App.exe -d tempdb -x backup -f "D:\db_{0:yyyyMMddHHmmss}.bak"

DB還原Restore
此指令是以覆蓋Replace方式還原DB,其bak中記錄的MDF/LDF路徑,因此要注意這些細節。若是重要的DB還原,還是透過SSMS工具比較清楚安全。
App.exe -d tempdb -x restore -f "D:\db_{0:yyyyMMddHHmmss}.bak"

DB壓縮Shrink
對DB進行最小資料壓縮,保留可用空間0%。
App.exe -d tempdb -x shrinkdb

DB清空表格內資料Truncate
清除DB內所有Table裏的資料內容,個人喜歡用Truncate Table指令,因為它會Reseed Identity欄位。單一表格時清除資料,可能因為正規化Constraint限制而無法執行,因此提供了一道清除DB內所有表格資料的強制指令,它會避開Constraint/Trigger等限制。
App.exe -d tempdb -x truncateTable -t TABLE_NAME  // 依正規化清除單表資料
App.exe -d tempdb -x truncateTable -t *   // 避開正規化清除所有表格資料


SQL Script檔案執行
執行SQL Script檔案內容,不回傳結果。
App.exe -d tempdb -x sqlExec -f "D:\in.sql"

SQL Script檔案查詢
執行SQL Script檔案內容,並將查詢結果顯示console上,也可以把結果輸出至CSV檔案。
App.exe -d tempdb -x sqlQuery -f "D:\in.sql"
App.exe -d tempdb -x sqlQuery -f "D:\in.sql" > "D:\out.csv"

image

清除表格/欄位的註解資訊Description
Table欄位有附上註解是好事,尤其在EF架構裏能被引入,對於開發階段很有幫助。若在發行Client單機板程序時,可以清除這些註記,達到保護用途。
App.exe -d tempdb -x clearDesc

重置表格內Identity欄位值為目前最大值
Table的Identity欄位值若想重置(Reseed)為目前欄位的最大值,可以使用這指令來重設,例如Seed值為1000,但實際最大值為50,經過重置後Seed值會變成50。
App.exe -d tempdb -x identMax -t "Table1" -c "Column1"

刪除表格 DropTable

支援刪除多個Table表格(支援*號),可鎖定在某schema owner上。
App.exe -d tempdb -x dropTable -t "a*" [-s "SchemaName"]
Changed database context to 'tempdb'.
DROP TABLE [dbo].[a1]... [OK]
DROP TABLE [dbo].[a2]... [OK]
DROP TABLE [dbo].[a3]... [OK]
Total 3 tables has dropped.


修改表格Schema擁有人
修改多個Table表格(支援*號)的Schema Owner,方便調測用戶權限。
App.exe -d tempdb –x altTableSchema -t "Table1*" -s "OldName,NewName"

取得目前Client連線數量

App.exe -x cltConnCount
3

取得目前Client連線狀態
App.exe -x cltConnStatus
Status      Count    AppName
sleeping    1        Microsoft SQL Server Management Studio
sleeping    1        Microsoft SQL Server Management Studio - Query
running     1        SqlDbUtility


查看SQL Server引擎版本

App.exe -x version
Microsoft SQL Server 2014 - 12.0.4100.1 (X64)
        Apr 20 2015 17:29:27
        Copyright (c) Microsoft Corporation
        Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


檢查資料庫完整性CheckDb
檢查訊息可在Console呈現,也可寫入文字檔案。
App.exe -d tempdb -x checkDb > “D:\health.txt”



更新記錄:

2016/03/26 Version History:

  • 新增「刪除表格DropTable、修改表格Schema」等2道Table操作指令。
  • 新增「讀取Client連線數量/狀態, 查看SQL Server版本, 檢查CheckDb完整性」等4道DB資訊指令。
  • 調整指令說明及語法範例的顯示,指令改斷義首字大寫說明,但大小寫不影響執行結果。

    2016/01/05 Version History:

  • 調整執行指令的參數為x,取代之前的c值。
  • 調整命令「shink」為「shinkdb」。
  • 調整c參數意義為Column Name。
  • 調整restore命令,加入執行前先踢除使用中連線,並能讀取日期格式化字串檔名。
  • 新增指定app.config內的connectioin string鍵值(-k參數)。
  • 新增s參數為讀取相關string字串(未來用途)
  • 新增重置Reseed表格Identity值為目前的最大值的新命令(identmax)。 

    2014/08/23 Version History:

  • 初版Release,下載含本文Help說明件.
  • 發佈前因停電導致程式源檔損毀,無奈下重寫主程序,也相較之前版本增加了4道指令。

     

    程式下載:(.NET 4.0 Required, Portable, Size: 140KB)
    [百度雲盤: SqlDbUtility_20160326.rar]