發表文章

目前顯示的是 2011的文章

用捷徑方式執行需帶入命令列參數的Windows Form程式

圖片
假設我們有個需要在執行時帶入一些命令列參數的Windows Form程式的話,以前我的做法就是會另外寫一個批次檔來呼叫這個Windows Form程式,並寫好所需的命令列參數。例如: <Test.bat> TITME Test Test.exe –debug 這種方式雖然可以正常地執行,但就是會再多一個命令列視窗出現,只有在那個它所執行的Windows Form程式被關閉時,這個執行批次檔而產生的命令列視窗才會一併被關閉。 於是我就想說是不是有其它方式可以達到同樣的目的,但又可以不用出現那個多餘的命令列視窗。 後來想到說在捷徑中好像可以指定命令列參數的樣子,或許用捷徑是可行的。於是就開始測試。 首先先在你要執行的程式上按右鍵,並選擇「建立捷徑」。此時檔案總管會幫你建一份捷徑出來。 在新建的捷徑上按右鍵,選「內容」來進行修改。在「目標」中加上你需要的命令列參數。 按下「套用」後,直接執行這個捷徑就可以達到我們一開始的目的了,在執行Windows Form程式時帶入所需的命令列參數。
上次找到 免費的UML 軟體BOUML,可是後來才發現,原來它不支援中文。 只好再找其它的軟體來試用看看了。 ArgoUML 這套也是免費的UML軟體,不過安裝後,還真的不太會使用。而且它好像只支援到UML 1.4的版本。 JUDE 這套是一開始Java人士愛用的一最UML軟體了。不過,後來就沒有再持續開發。但是它倒是改名稱了。改叫 Astah 。一樣也有免費版本( astah community )。只要上網註冊就可以下載及使用了。 這套是目前我試到最好用的一套了: 支援UML 2.0 支援中文 介面好看 免費^^

UML免費軟體--BOUML

圖片
最近開始整理一些程式碼,發現有些流程需要使用到UML中的順序圖來表示。於是就打開了Office 2007的Visio。畫了一下,發現如果有個函式呼叫要,要再呼叫自己這個物件的某個函式,而這個函式又要再呼叫到其它物件的函式時,這樣那個「啟動」的區塊很難去表示。 一開始我是直接再多拉一個「啟動」的區塊,並將它接到原來的那個「啟動」區塊上,只是偏一邊這樣。雖然是可以接得上,可是在要選擇呼叫的函式時,發現是無法選擇的。因為這個另外加上去的「啟動」區塊,並不知道它對應的類別是哪個。 查了一下網路,發現在UML 2.0以上的規格中,應該就是可以支援這樣的表示方式才對。但是我在Visio 2007中找不到可用的方式。 於是,只好在網路上搜尋一下免費的UML軟體。以前知道 StarUML 是套免費的UML軟體,原本想要用這套的,但是發現它最新的版本是2005年更新的。這…不是表示它不再被維護了嗎。所以又再找其它可用的軟體。 最後,發現有一套新的軟體: BOUML 。它目前還有在更新版本中。看來也是可以支援我需要的順序圖表示方式。只是它是英文版本的。不過,可以表示我需要的功能就好。

Fedora 15安裝Git

在Fedora 15上安裝Git的指令:  su yum install git   git的使用  使用手冊 http://schacon.github.com/git/user-manual.html  用git commit去加入檔案 如果有不想要加入的項目,可以在專案根目錄中新增一個.gitignore的文字檔,裏面寫上不想要用git管理的檔案名稱樣式。  用以下的指令重新commit:  git rm -r --cached git commit 在windows中使用git tortoisegit TortoiseGit使用  http://www.mrmu.com.tw/2011/05/06/git-tutorial-for-beginner/

Google Data API 的原始程式碼搬家了

最近想研究一下 Google Data API ,看了一下網路上的說明,想要找它的程式碼範例來看一下時,發現網站上說要去安裝API的路徑下找一個Sources的目錄。可是我安裝後發現找不到這個目錄。又重新安裝了一次,在安裝過程中也沒有選項說要不要安裝程式碼範例。 後來想說它會不會安裝到使用者的「文件」這個目錄中了。 找了一下,果然是放到本機上的使用者「文件」資料夾中了。

Android Game

遊戲名稱 :Inotia3: Children of Carnia 檔案大小 :17MB 系統需求 :Android 1.6 以上 Android Market 下載連結 : 點這裡 或掃描下面的 QR Code 來源

VS2010的Console專案無法引用System.ServiceModel.Web

圖片
最近要實作一個WCF RESTful的伺服器,發現在新增一個Console專案時,要為它加入System.ServiceModel.Web的參考,以便使用WebServiceHost來啟動伺服器時,發現在引用的項目中找不到System.ServiceModel.Web。  後來才知道,原來是專案的建置屬性中,在.NET Framework的設定下預設是設成.NET Framework4 Client Profile。這組應該是精簡設定模式,所以不會有System.ServiceModel.Web可以引用。 解決方式就是將「目標Framework」改設定成.NET Framework4就好了。

新版的Blogger有文章檢視計數器耶

圖片
新版的Bloogger介面真是不錯,可以看到每篇文章被檢視的次數。雖然都沒有留言,但有人看就是不錯了啦。

WCF主機端跟用戶端安全性設定不符

圖片
最近突然想到快兩年前試寫過的WCF程式好久沒拿出來玩玩了。沒想到今天一拿出來,剛執行後就給我來個錯誤訊息。 忘了之前是不是也有發生過這樣的問題了,真覺地想說應該是安全性設定的問題(其實它上面就有提到了)。於是就去看了一下WCF Client端的安全性設定。 在app.config中有一段是有關安全性設定的:security。 看了一下目前的設定,發現它所使用的安全性認証模式是Transport。接著又去看了一下WCF Host端的app.config中的安全性設定,發現它設定的是None。兩邊所使用的方式不同,應該就是問題的所在了。於是就將WCF Client端的安全性設定改得跟WCF Host端一樣。這樣一來兩邊的資訊就能互通了。

使用自訂的MP3作為Android手機鈴聲

http://maketecheasier.com/add-custom-alarm-ringtone-in-android/2010/01/08

更新Android SDK

最近突然想到好久沒有再打開Eclipse來玩玩Android了,所以就開啟Eclipse來看看,想說應該有新版的Android SDK可以更新才對,就開啟「Window->Android SDK and AVD Manager」來查詢一下是否有新版的SDK。 一查果然是有新版的,於是就開始進行安裝。沒想到安裝時都一直出現「存取被拒」的錯誤。仔細看了一下,發現它都要將下載來的SDK安裝到C:\Program Files目錄中。我想應該是執行時的身份沒有權限可以存取這個目錄。 於是就改用管理員的身份來執行Eclipse,再進行SDK更新時,就一切正常了。

Update配合JOIN

最近看到一篇文章, 作者用SSIS的方式更新某個資料表的內容 ,只是在更新時,必須再配合另一份對照表來進行更新。 雖然用SSIS來設計這種更新方式也是很快,但直接下Update配合JOIN的指令,其實也是可以達到相同的目的的。只是一般人在使用Update指令時,大都是使用基本的型式。很少會用到配合JOIN的。連我自己有時要使用時也要回想一下。所以利用這次機會,就記錄一下囉。 select * FROM Test_A update Test_A set Name = d.NewName, [Desc] = d.[Desc] from Test_A left join MappingTable d on d.OldName = Test_A.Name select * FROM Test_A Update配合JOIN時,無法為主要資料表取別名,這點是比較可惜的,如果資料表的名稱比較長的話,那就要打不少字了。

XmlSerializer需要宣告所有衍生型別

圖片
以前一直以為只要寫好Class的宣告,再用XmlSerializer::Serialize()及XmlSerializer::Deserializer()就可以很簡單地將物件轉成xml格式來匯出及匯入。沒想到,有一次在使用時,只是多加了一個衍生類別,就造成匯出xml時出現例外錯誤。 錯誤訊息如下: 看來是說不需要我新加的衍生類別,但又說要使用XmlInclude。於是就查了一下XmlInclude,原本如果有新增的衍生類別(有一個以上的衍生類別)的話,就要在基底類別加上用XmlInclude宣告的屬性。 如果不想要宣告在基底類別的話, 可以用另一個XmlSerializer的建構子,傳入所要使用的衍生類別的型別 。 使用第二種方式的好處是,當你自行再衍生出其它新的類別,而不是當初已知的類別時,就可以用第二種方式來 動態地 加入新的衍生類別。

建立遠端伺服器時出現「沒有對應到本機使用者」的錯誤

圖片
最近在幫兩台SQL Server間建立遠端伺服器時出現了一個奇怪的錯誤訊息。主要是: 解密期間發生錯誤。在遠端伺服器xxxx沒有對應到本機使用者'(null)'的遠端使用者xxxx。錯誤代碼為15466 。 已經確認所使用的帳號/密碼都是正確的,但就是突然無法建立兩端的連結。一開始用這段中文的錯誤訊息去查詢相關資訊時,都無法查到可用的解決方案。後來就試著改成英文的方式來查詢:linked server local user null之類的,總算是查到一些可能的解法,主要就是要重新產生解密所用的key,需使用到以下的T-SQL指令: ALTER SERVICE MASTER KEY FORCE REGENERATE 果然執行之後再去建立遠端伺服器連結就正常了。

用VirtualSVN Server架Subversion,用MSBuild取出程式碼

最近想放棄VSS,改用SubVersion。所以就找了一個專案來試一下。要用SubVersion來管理程式碼是蠻簡單的。如果你是用Visual Studio的話,可以使用Ankh。它可以整合到Visual Studio中並使用SubVrsion來管理程式碼。 至於SubVersion的Server端,最方便使用的應該就是 VirtualSVN Server 了吧。只要下載並安裝就可以了。 如果要使用MSBuild來進行專案建置的話,原本的MSBuild並不支援SubVersion,其實就連VSS它也不支援。這些都必須取得第三方套件來用,才能由這些程式碼管理工具中取得程式碼來進行編譯。所以可以去取得 MSBuildTasks 套件來安裝使用。 老實說在MSBuildTasks中的說明文件,它只有說明這些套件的一些屬性及方法。完全沒有範例。實在很難體會如何去使用它來透過SubVersion Server下載程式碼。所以就到網路上找了一些資料,可是 這篇文件中的MSBuild專案檔好像也是不行 。因為它沒有指定Svn.exe的路徑,可能是因為它不是用VirtualSVN Server吧。 後來才發現, 原來要指定這個路徑才行 。改了一下果然就可以下載了。只是一開始以為要用SvnUpdate這個指令,因為我只是想更新程式碼,而不是想要簽出。但後來發現要取得程式碼的話,還是要用 SvnCheckout才行。 MSBuild xml檔如下: < Project xmlns ="http://schemas.microsoft.com/developer/msbuild/2003" > <!-- Version : 1.0 Revision: --> < PropertyGroup > < RootDir > ./ </ RootDir > < SlnName > TX4 </ SlnName > < ExtProgramPath > D:\Ext Programs\ </ ExtProgramPath > < SvnVersion ></ SvnVersion > <

加速開啟SQL Management Studio的速度

在網路上看到有人說可以 加快開啟SQL Management Studio速度 的方式。試了一下還真的可以很快地開啟SQL Managment Studio。它的方式是在hosts檔案中加入一行: 127.0.0.1  crl.microsoft.com 看來就是讓有需要查詢crl.microsoft.com的程式,直接就連回本機了。 只是 查詢crl.microsoft.com的用意為何 呢? One issue that can cause this problem is that if the server does not have access to the internet, then the .NET framework can't access the crl.microsoft.com website to verify that the digital signatures used to sign the binaries for managed applications are valid.  看來是為了要驗証數位簽章的正確性。如果你確定是正確的,那就不用去檢查了吧。或是你根本就無法查詢crl.microsoft.com的話,那也不用查了。可省下開啟的時間。

實作C# Form的登出再重新登入功能

一般在開發應用程式時都會在執行程式時先顯示一個對話視窗要求使用者輸入登入資訊。正確後再登入到主畫面中。 在主畫面中也會登供一個登出的功能,以便讓使用者重新登入。看是用其它的使用者帳號登入或是登入到不同的環境中。 不過在C#中好像沒有辦法直接支援這種登出登入模式。所以必須自行實作。目前我實作的方式就是在主視窗中宣告一個公用變數來記錄是否要進行重新登入,並接收FormClosiing事件詢問使用者是否要重新登入。 程式碼如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace TestFormLogout { public partial class Form1 : Form { /// <summary> /// 記錄是否要進行重新登入 /// </summary> public bool isReLogin = false ; public Form1() { InitializeComponent(); } private void btnLogout_Click( object sender, EventArgs e) { this .Close(); } private void OnClosing( object sender, FormClosingEventArgs e) { if (MessageBox.Show( "是否重新登入?" , "重新登入" , MessageBoxButtons.YesNo) == DialogResult.Yes)

使用T4範本產生器讀取資料庫時指定所要使用的SMO版本

圖片
在使用T4範本產生器讀取資料庫的資訊時,一般可能都會用如下的引用方式: <#@ template language="C#" debug="True" hostspecific="True" encoding="0"#> <#@ output extension=".cs" #> <#@ assembly name="System.Data" #> <#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #> <#@ assembly name="Microsoft.SqlServer.Smo" #> <#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #> <#@ assembly name="System.Xml" #> <#@ import namespace="System.IO" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Data.SqlClient" #> <#@ import namespace="Microsoft.SqlServer.Management.Smo" #> <#@ import namespace="Microsoft.SqlServer.Management.Common" #> 其中在引用有關 M icrosoft® SQL Server® 2008 R2 共用管理物件 時,大部份都直接寫Assembly的名稱。但是如果您的開發環境中安裝了兩種以上的SQL Server版本時,這時會取用註冊在GAC中的哪一種版本,可能就會取決於您目前所使用的Visu

將資料表中某欄位值串接成字串

圖片
今天在逛網站時,突然看到有人在介紹SQL Server新的T-SQL指令PIVOT。大致上就瞭解及試了一下這種PIVOT的用途。在試過語法後,發現要使用PIVOT語法時,必須明確地知道所需要的橫向欄位有多少。 例如: -- Pivot table with one row and five columns SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, [0], [1], [2], [3], [4] FROM (SELECT DaysToManufacture, StandardCost     FROM Production.Product) AS SourceTable PIVOT ( AVG(StandardCost) FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) ) AS PivotTable; 這個來 自MSDN上的PIVOT範例 。執行結果如下: 由上面的範例來看,PIVOT可以將原本是直行的查詢結果,轉換成橫向的查詢結果。不過,這樣的語法使用上就是必須事先知道所要的橫向欄位有哪些。如果一開始不確定PIVOT中要的橫向欄位有哪些的話,那該如何是好。 最好的方式就是這些橫向欄位是可以由另外一份清單來取得。不過,在PIVOT中它無法再支援子查詢的方式,也就是不能寫成: PIVOT ( AVG(StandardCost) FOR DaysToManufacture IN ( select * FROM xxxx ) ) AS PivotTable; 可能的作法就是要自已動態組合SQL指令,再來執行了。執行的方式可以用: execute sp_executesql @SQLCmd 如何組合出動態PIVOT橫向欄位 在網路上找到一篇有關 如何將資料表中的資料組成一組串列 的方式,不過,這篇文章中的組合方式好像有點問題。那篇文章中作者使用到 COALESCE() 這個T-SQL指令。COALESCE()指令的用法是將兩個參數中不為NULL的那個傳回。最後組出來的字串中,第一個字串前面也會多了一個','。所以我就改寫了一下語法,不使用COALESCE()

C# Controls相關文章

EasyProgressBar

自訂Wordpress右邊日曆小工具樣式

圖片
最近在設定我的Wordpress網站時,找到一個不錯的佈景主題(Theme):Ramiro。套用後大致上的樣式都OK,但就是右邊有設定的「日曆」小工具會超出原本佈景主題所設定的範圍。 當然Wordpress有支援可以在管理介面中去修改這些Theme的樣式。一開始想說是不是在一些控製邊欄的.php檔中。可是找了一下,也沒有找到。去查了一下Wordpress有關Theme製作上,如果要顯示這個日曆的話,好像是要用get_calendar()的函式。可是發現我使用的Theme中並沒有呼叫到這個函式。 後來沒辦法,想說那不然就直接看看網頁的原始程式碼好了。 發現原來在這個區域是屬於「right」所控管的。所以就到這個佈景主題的樣式表中去查詢。發現是有這個ID,但裏面並沒有特別去控制日曆相關的樣式。也就是沒有去設定以下這些ID的樣式: calendar_wrap wp-calendar 我猜想應該是沿用了「right」區的字型造成日曆的顯示超出邊界了。於是就開始動手加入有關上述這兩個ID的樣式表。 最主要的改善方式就是將字型由1.5em改為0.5em。這樣就可以了。 不過,上面這樣看起來有點美中不足的就是整個日曆有點偏右。沒關係,只要再加上margin : -10px。就好了:

研究Wordpress的主題製作

Wordpress的主題製作除了使用許多的CSS外,另一部份就是要動態地由資料庫中查詢所以的資料來呈現。這些查詢的功能在Wordpress中叫作 Template Tag 。

VS2010目前還無法開發ReportingService專案

原本想說安裝了VS2010,再安裝SQL Server 2008 R2 Express(ADV)版後,就可以在VS2010中開發Reporting Service的報表專案了。沒想到目前 VS2010還未整合Reporting Service 的部份。所以暫時是不可行的了。還是得用VS2008來進行開發。

實作資料表分割

圖片
當某個資料表中的資料快速累積到一定程度時,對這樣龐大的資料表進行查詢或新增、刪除等動作都會相當地費時。如果能將這個資料表分割成數個區塊來進行查詢及維護,對效能應該會有所幫助。 在SQL Server 2008以前要實作出資料表分割的概念的話,可能就是真的要建立數個不同名稱,但具有相同的資料表表網的資料表。並利用某個預先定義好的分割函式來將資料表中的內容加以分割,放置到個別的資料表中。 要查詢時,再利用View的方式JOIN成一個資料表檢視來進行查詢。或是在查詢前利用相同的資料分割函式決定出要查詢的區塊,再到那個區塊所對應的資料表中進行查詢。不過,這種方式都是需要使用者能明確地事先依資料分割函式來計算所要取用的資料區塊才行。 在SQL Server 2008版中,它真接內建了 資料表分割的功能 。只要您提供所需的 資料表分割函式 ,以及 資料表分割表綱(SCHEMA) ,就可以將資料表進行分割了。 要實作資料表分割的話,如果您一開始還沒有建好資料表,那當然可以先建好資料表分割函式、資料表分割表綱後再來建立資料表。不過,如果要針對既有的資料表進行資料表分割的話,應該也是有相對應的SQL指令可以來完成,但在SQL Server 2008的管理工具中已經有提供介面化的方式來讓您為即有的資料表進行資料表分割的設定。 以下說明如何利用SQL Server管理工具的介面來進行資料表分割。 首先找到您要進行分割的資料表,在這個資料表上按下右鍵,會出現一個選單,其中有一項是:儲存體。在儲存體中有個「建立資料分割」的功能,這個功能就是用來製作分割資料表的工具。 一開始會出現說明的畫面: 接著會出現這個資料表的所有欄位資訊,主要就是要選定一個欄位來作為資料表分割的依據。 選好欄位後,接下來就是要提供用來分割資料用的函式。這個函式可以新增,或是利用原本來已經產生好的函式也可以。 接著就是要指定所要使用的資料表分割表綱: 選好資料表分割表網後,會出現一個設定檔案群組的介面。在這個介面中是指定用所選的資料表分割表綱中每個分割區塊所要放置的檔案群組。檔案群組可以都放在同一個,或是都各自給一個不同的檔案群組。在此我採用的方式是將舊資料表放到一個新增的檔案群組中。而將目前會使用到的資料則維持在預設的PRIMARY檔案群組中。 一切都設定好後

用DataBaseMail寄件時使用Global Temporary Table

圖片
有時候我們會需要建立一個資料庫排程來檢查資料庫中的某些資料是否存在,當有問題時,可以利用DataBaseMail的方式來寄送警告信件。 不過,在寄件時有時又需要將查詢到的資訊附件信件中。雖然在用DataBaseMail寄信時可以指定要使用一段SQL指令查詢資料並作為信件內容。但在這段查詢指令中,並無法使用暫存表。正確來說是無法使用Local Temporary Table。 例如以下的方式是在將查詢的結果儲存到Local Temporary Table (#tmp)中,並試著在寄送mail時將這個暫存表的內容附加到mail中。結果就出現錯誤訊息:無效的物件名稱#tmp。這是因為在寄送mail時,它執行的是另一段session,在其它的session中是無法看到目前session中的暫存表的。 為了要在寄送mail時可使用到原本session中的查詢結果,我們改用Global Temporary Table(##tmp),這樣就可以正常寄送mail了。

VS2010好用套件

圖片
Indent Guide:讓程式碼中的縮排能自動配對顯示

設定資料表分割表綱時出現錯誤訊息

我要新增一個資料表,並指定使用分割資料表模式時,語法如下: CREATE TABLE xxxx ON PartitionSchema 結果出現如下的錯誤訊息: 訊息 2726,層級 16,狀態 1,行 2 資料分割函數 'StatusSplitFunc_3' 使用 1 個資料行,這和用於分割資料表或索引的資料分割資料行數目不符。 查了一下沒有看到有人有過這樣的錯誤訊息。後來才知道,原來是在ON 的後面的分割資料表表網中,要指定所要使用的參數。 例如: ON PartitionSchema(txdate)這樣。

解決未取消Event註冊時造成物件無法被回收的議題

當我們將A物件的某函式掛勾到B物件的某個事件上時,如果沒有將B物件的事件函式中有關A物件的掛勾關聯取消的話,就算A物件已不在可用範圍,需要被進行回收的話,因為它還存在著B物件對它的參考,會造成A物件一直無法被回收。也就是所謂的memory leaking。 要解決這個問題,可以參考: Simple effective Weak Event Dispatcher in C#
在一台Window Server 2008 x64上安裝的 SQL 2008 R2 x64資料庫中,要利用遠端連接的方式去查詢一台較古老的SQL 2000的資料庫時,雖然有設定好遠端連接伺服器,但還是出現了以下的錯誤訊息: 連結伺服器 "xxx" 的 OLE DB 提供者 "SQLNCLI10" 傳回訊息 "無法指出的錯誤"。 連結伺服器 "xxx" 的 OLE DB 提供者 "SQLNCLI10" 傳回訊息 "無法在伺服器中找到完成此操作所須的預存程序。請連絡您的系統管理員。"。 訊息 7311,層級 16,狀態 2,行 1 無法為連結伺服器 "xxxx" 的 OLE DB 提供者 "SQLNCLI10" 取得結構描述資料列集 "DBSCHEMA_TABLES_INFO"。提供者支援介面,但在使用時傳回失敗碼。 查了一下,有人說要在SQL 2000上昇級到SP3或SP4。但我看昇級的部份已經有了。後來才知道原來昇級完後,還要 自行執行預存程序的昇級動作 才行。 我使用的方式是在SQL 2000的本機上執行以下的指令: osql -E -S 10.6.xx.xx -i "C:\Program Files\Microsoft SQL Server\MSSQL\Install\instcat.sql" 其中要指定的就是原本SQL 2000的IP位址。這樣就可以正常查詢了。

SQL Profiler應用

最近因為資料庫的效能出現瓶頸,所以開始學習用 SQL Profiler來記錄某段時間的資料庫使用狀況。只是SQL Profiler記錄下來的資料有一大堆,要如何從中找出感興趣的部份,也是一件要學習的工作了。 用SQL Profiler記錄下來的資料,可以先儲存成檔案,副檔名為.trc。再 將它匯入到資料表 中。用如下的指令: SELECT * INTO trace1108 FROM ::fn_trace_gettable('E:\Test.trc', default) 因為已經匯入成資料表了,所以要查詢所需的資訊就可以用SQL指令來進行查詢。 不過要注意幾點: 1) Duration的單位 在SQL Profiler中所顯示的Duration單位是千分之一秒,而用儲存過的檔案匯入到資料表中所用的單位是百萬分之一秒。 2) 在EventClass這欄原本SQL Profiler中顯示的是文字資料,但匯入到資料表後所使用的是原本的 分類代碼 。是整數的資料。

批次設定執行預存程序的權限給特定使用者

圖片
最近在更動資料庫的權限設定,發現有個帳號的權限設成是 db_owner,所以它有權限可以新增、刪除資料庫裏的資料表。權限有點過大。所以就將它改成只有db_datareader及db_datawriter的權限。 但後來發現原本這組帳號也需要可以執行所有的預存程序。一但改為只有db_datareader及db_datawriter的話,就沒有權限可以去執行預存程序了。但如果要透過MS SQL管理介面來設定的話,又要一個個進去設定,相當費時間。 於是就開始尋找看是否有T-SQL的指令可以批次來設定預存程序的執行權限給某組帳號。發現MS SQL本身並沒有函式可用來批次設定。但找到有一位提供的解答是 用T-SQL指令來產生所需的GRANT指令 。 大致上的方式是用查詢資料庫預設資料表 INFORMATION_SCHEMA.ROUTINES 來找出目前使用的資料庫中所建立的所有預存程序資訊。 可以用如下的指令來產生所需的T-SQL指令: SELECT 'GRANT EXEC ON ' + QUOTENAME(ROUTINE_NAME) + ' TO ' FROM INFORMATION_SCHEMA.ROUTINES 不過,後來發現並不是所有的預存程序都可以指定EXEC的權限,有些預存程序如果是函數型,且傳回值為一個TABLE的話,那這種預存程序就只能指定授權SELECT的權限而已。 所以比較正確的指令應該是如下。分成兩種模式。一種是授權EXEC;另一種授權SELECT。 SELECT 'GRANT EXEC ON ' + QUOTENAME(ROUTINE_NAME) + ' TO user-account' FROM INFORMATION_SCHEMA.ROUTINES where DATA_TYPE <> 'TABLE' OR DATA_TYPE is NULL SELECT 'GRANT SELECT ON ' + QUOTENAME(ROUTINE_NAME) + ' TO user-account' FROM INFORMATION_SCHEMA.ROUTINES where DA

NuGet 簡化.NET專案中引用第三方函式庫

網路上有許多好用的.NET第三方函式庫,不過在使用這些函式庫時,一般都需要一些安裝的步驟才能正常地使用。有時還需要再去取得它所引用的其它函式庫。這樣的步驟是相當繁鎖的。為了簡化這樣的安裝步驟,我們可以使用 NuGet 這個套件來協助。

SQL 2008不支援Backup的Truncat_Only選項

以前要將資料庫的交易記錄檔截斷並縮小的話,都是使用以下的指令: -- 備份資料庫,並壓縮log檔 use TestDB BACKUP LOG TestDB WITH TRUNCATE_ONLY DBCC SHRINKFILE ('TestDB_Log', 2) GO 可是在換到SQL 2008之後,執行上面的指令會出現以下的錯誤訊息: 'TRUNCATE_ONLY' 不是可辨識的 BACKUP 選項 看來是SQL 2008不再支援TRUNCATE_ONLY的選項了。 那要截斷交易記錄檔的話,要如何進行呢? 可以參考這篇文章 。 主要的原理是在將資料庫的備份模式切換到簡易模式(SIMPLE)時,它就會自動地截斷交易記錄檔。但就算是載斷了交易記錄檔,原本log檔的大小還是不會改變,所以要再加上使用DBCC SHRINKFILE()來縮小log檔。 完整的指令如下: use TestDB -- 備份資料庫,並壓縮log檔 /* 當資料庫使用簡單復原模式時,便會自動截斷交易記錄。 如果您必須從資料庫中移除記錄備份鏈結,請切換到簡單復原模式。 */ --01 將資料庫 Northwind 切換為「簡單復原模式」,便會自動截斷交易記錄。 ALTER DATABASE TestDB SET RECOVERY SIMPLE WITH NO_WAIT GO DBCC SHRINKFILE ('TestDB_Log', 2) GO --02 若決定要備份交易記錄檔(*.ldf),再將資料庫 Northwind 切換回「完整復原模式」 ALTER DATABASE TestDB SET RECOVERY FULL WITH NO_WAIT GO

將SQL2005的作業排程昇級到SQL2008時發生錯誤

最近試著將SQL 2005的作業排程利用產生SQL指令的方式要昇級到SQL 2008時,出現以下的錯誤訊息: 訊息 515,層級 16,狀態 2,程序 sp_add_job,行 137 無法插入 NULL 值到資料行 'owner_sid',資料表 'msdb.dbo.sysjobs'; 資料行不得有 Null。INSERT 失敗。 陳述式已經結束。 查了一下,在MSDN中好像有說這是 因為SQL 2008本身沒有建sa的問題 。最好的方式是要昇級到SQL 2008 SP1

讀取另一個Process的stdout及stderr

有時候我們在程式中會再使用System.Diagnostic.Process來去執行另一個程式,而且也可能會有需要去接收這個被我們執行的程式的輸出資訊,不論是正式的輸出(來自stdout)或是錯誤資訊的輸出(來自stderr)。 這些相關的技術可以參考: Solving Problems of Monitoring Standard Output and Error Streams of a Running Process

Word 2007 技巧

利用Word自動編號事半功倍,以Word2007為例

QuickSort實作(用C#)

最近跟同事討論到QuickSort這個演算法,因為網路上找到的範例好像都有些問題,就自已試著實作一次來瞭解一下QuickSort的原理。 正好手邊有一本「 演算法之道:讓你學不會演算法都難 」裏面有講到這個排序演算法,實作一下,還真的可行。 以下是實作的程式碼: public class QuickSort { public static void SortCore( ref int [] src, int start, int len) { if (start < len) { DumpArray( "Start sort" , src); int pivotPos = Partition( ref src, start, len); SortCore( ref src, start, pivotPos); // 對左邊的資料排序 SortCore( ref src, pivotPos + 1, len); // 對右邊的資料排序 } } protected static int Partition( ref int [] src, int start, int len) { string msg = string .Format( "Partition From {0} to {1}" , start, len); if (start >= len) return start; // 不用排序 int pivotPos = start; int pivotValue = src[pivotPos]; int i = pivotPos;

Server 2008 R2 x64 上的IIS 7無法執行.NET Framework 4.0的ASP.NET網站

圖片
在設定好伺服器,且將網站部署到伺服器上後,發現還是無法正常執行網站。會出現如下的錯誤: 一開始以為是IIS 7的設定問題,可是如果是用單純的網頁來測試的話,又可以正常地執行。所以就仔細看了一下錯誤的訊息。其中「最有可的原因」中的第一點是說可是ASP.NET未安裝完全。於是就到網路上查詢相關的資訊。我查詢的方式是直接查詢錯誤訊息:•使用 Managed 處理常式,卻未安裝 ASP.NET,或安裝不完整。 查到一篇相關的文章,正好其中提到 如何確認你的IIS是否可以支援.NET 4.0 。原來是要到「處理常式對應」中確認是否.aspx的檔案有.NET 4.0的對應設定。 像這樣就是沒有對應的處理函式: 解決的方式就是重新安裝.NET 4.0的套件。安裝完成後,會看到出現正確的對應。

讓IIS 7.0支援VS2010的網站發行功能

圖片
在VS2010中的網站發行功能有了新的發行方式。只要在網站的專案中按下右鍵,選擇「發行」,且只要要部署的伺服器有設定好相關的設定,就可以很簡單地完成網站的部署了。 不過,伺服器要如何設定,才能支援VS2010的網站發行功能呢? 首先,在你的伺服器中,要先安裝「管理服務」。安裝的方式: 1. 先開啟伺服器管理員,再到「角色」中去「新增角色服務」 安裝完成後,可以到「IIS管理員」中點選左邊樹狀圖的「你的電腦名稱」,並在右邊的頁面中下方看到「管理服務」的功能圖示 2. 安裝 WebDeploy 套件 3. 確認以下兩種服務都已啟動: 有了以上兩種服務,就可以 使用VS2010的網站發行功能來發行你的網站 了。

eclipse如何停止除錯

圖片
最近開始用eclipse學習寫android程式。在除錯時,一直找不到如何停止除錯的方式。每次都是要讓它一直執行,直到畫面出現後,再到android的模擬器上終止程式。 後來發現,原來要在eclipse中停止除錯的話,是要在「debug」模式下,先在左上方的debug視窗中,找到樹狀結構中的最上層那個,再點選它,之後再按下右方中間的停止鈕,這樣就可以立即停止除錯了。

DOS Batch指令檔中如何記錄log資訊

最近在用DOS的batch指令檔來批次編譯專案。執行程式時如果有錯誤大部份都會傳回非零值的錯誤代碼,要取用這個錯誤代碼的話,在DOS Batch中可以用如下的指令: IF %ERRORLEVEL% 1 GOTO xxxx 或是 IF %ERRORLEVEL% NEQ 0 GOTO xxxx 使用上述的方式就可以來控制執行的流程。只是除了控制執行的流程外,我們還希望能將一些資訊記錄下來。在DOS的Batch指令檔中,可以用ECHO > file.txt的方式來記錄資訊。 例如: @ECHO Build Failed > log.txt 上面的指令中,@ECHO是說不要將這段顯示在DOS命令列視窗中。並且將訊息"Build Failed"寫入到log.txt檔案中。不過,其中使用的是「>」,它的作用是會覆寫檔案的內容。如果想要將文字附加到log檔中的話,可以改用「>>」。

利用改寫要執行的Target的方式讓後來的人可以改變流程

最近在使用MSBuild的專案批次建置專案時,發現有些專案中,它會需要一些特別的流程。例如在引用的DLL中,大部份都是需要xxx.DLL,但可能有某個特別的專案,就是要引用到其它名稱的DLL。這樣的特例可能就無法寫在固定的流程中給所有要編譯的專案來執行了。 那要怎樣才能讓每個專案在要進行編譯前,可以準備好自己所需要參考到的檔案呢(這裏說檔案是因為不一定就是DLL,可能是其它種類的檔案) 目前我的作法就是在既定的編譯流程中,加入一個叫作SlnBeforeBuild的target。如果要編譯的專案沒有自已要特別執行的作業的話,就不用改寫這個target。 例如我有個編譯用的MyBuild.proj,在MyBuild.proj會去引入DefaultSlnBeforeBuild.proj。而DefaultSlnBeforeBuild.proj的程式碼大致上如下: < project xmlns ="http://schemas.microsoft.com/developer/msbuild/2003" > < target name ="SlnBeforeBuild" > < message text ="Default sln BeforeBuild" > </ message ></ target > </ project > 在DefaultSlnBeforeBuild.proj中定義了一個叫作SlnBeforeBuild的target。這個Target在MyBuild.proj時會被執行到。 一般的狀況下都不用改寫SlnBeforeBuild這個target。但如果有需要時,可以在每個專案的proj中,在它引用了MyBuild.proj後,再寫一段自已的SlnBeforeBuild的target。這樣就可以達到改寫的功能,當MyBuild.proj中要呼叫到SlnBeforeBuild這個target時,就會改執行新改寫的內容了。 會有這樣的結果,我猜應該是MSBuild在執行時,所引入的專案中的任何資料,都是以最後的為主。也就是後面的會蓋掉前面的。

ubuntu 10.10 安裝無蝦米

最近試用Ubuntu 10.10,因為本身是使用無蝦米輸入法,所以就查了一下如何在Ubuntu 10.10上安裝無蝦米。 一開始有看到一些介紹,都是要自行下載字碼表,再加工及安裝。後來看到有一篇是使用內建預設的輸入入ibus的安裝方式,而且已經 打包成安裝檔 了。只要下載並執行安裝,就可以使用了。真是太方便了。

SQL Server遠端伺服器連線失敗

圖片
錯誤訊息: 連結伺服器 "10.6.228.43" 的 OLE DB 提供者 "SQLNCLI" 傳回訊息 "登入逾時終止"。 連結伺服器 "10.6.228.43" 的 OLE DB 提供者 "SQLNCLI" 傳回訊息 "建立連線至伺服器時發生錯誤。連線至 SQL Server 2005 時,發生此失敗,可能是因為在預設設定下,SQL Server 不允許遠端連線。"。 訊息 65535,層級 16,狀態 1,行 0 SQL 網路介面: 從登錄取得已啟用的通訊協定清單時發生錯誤 [xFFFFFFFF].  解決方式:開啟SQL Server Configuration Manager,到「用戶端通訊協定」中,開啟TCP/IP的通訊方式。

Windows系統路徑及C#存取方式

圖片
在Windows系統中有許多常用的路徑,但是Program Files或System32等等。這些路徑其實Windows系統本身有提供 路徑環境變數 ,可在命令列視窗中使用。 在C#中也可以利用 Environment這個類別 來存取及轉換這些特別的路徑。 還有介紹如何 在PowerShell中取得這些特別路徑 的方式。

在用DatabaseMail寄送郵件時,如何在內容加入斷行字元

可以用 set @MailBody = 'xxxx' + char(13) + char(10) + 'yyyy' 的方式。 如果是用 set @MailBody = 'xxx' + '\r\n' 是不行的。

用PowerShell監控磁碟空間

在伺服器上經常會執行一些程式,這些程式或多或少都會需要將一些執行的過程記錄在log檔中。如果沒有定期去清除這些log檔的話,時間一久伺服器上的磁碟空間就會被用光。 不過,因為是伺服器上的自動排程程式,所以一般人一旦設定好就不再會去管理。久而久之可能就在某一天發生磁碟空間不足,造成程式無法執行的問題。 我想要監控伺服器的磁碟空間的應用程式應該是不少,不過最好的方式當然是能用Windows Server本身內建的功能是最好。 最近微軟提供了PowerShell的指令集工具。這個工具有很多的伺服器管理功能。當然也可以用來監控磁碟空間了。找了一下網路上,果然有人在分享已寫好的 用PowerShell監控磁碟空間的程式碼 。 即然有現成的當然就拿來改一下使用看看囉。 要執行的話,需要在PowerShell的命令列視窗中輸入 .\ 。要加個「.\」。不然,直接打檔名是無法執行的。 如果第一次執行有問題的話,應該也是 安全性的問題 。就要先執行以下的指令: Set-ExecutionPolicy RemoteSigned 如果你的WinServer 2008找不到PowerShell,是因為預設上是沒安裝的,請自行 由伺服器管理員安裝PowerShell 。 如果直接用命令列執行PowerShell指令檔,而不用先進入PowerShell的方式如下: powershell -command "& './CheckQuota.ps1'" 原本的版本中只能寄警告信通知一位管理員,後來我修改了一下,可以讀取一份清單,以便將警告訊息傳給多位管理員。程式碼如下: $computers=(Get-Content CheckComputerList.txt) #單位是MB $WARING='5000000000' $SMTP='email.polaris.com.tw' $TO='justin_Lin@polaris.com.tw;justin1021@gmail.com' $FROM='FMSQLAdmin@polaris.com.tw' $MonitorList=(Get-Content MonitorManager.txt) for

mantisbt session 儲存失敗

圖片
最近安裝了臭蟲追蹤系統。一開始的使用都還正常,但沒多久在執行登入時,就出現以下的警告訊息。看來應該是指定用來儲存PHP Session資訊的路徑有問題。 要修正這個問題,就是要去修改PHP伺服器上的設定檔,將session.save_path的參數指定到正確的位置,再重啟Apache就好了。 session.save_path = "C:\AppServ\php5\SessionDB"

解決SQL2008無法用ManagementStudio遠端登入的問題

圖片
最近在一台裝有Windows Server 2008 R2(x64)的伺服器上安裝了SQL 2008。安裝完後,在那台服器上使用ManagementStudio都一切正常。可是當我要用我的PC上的ManagementStudio來遠端登入時,就發生錯誤。 後來才知道 是防火牆的問題,要設定TCP/UPD port 。基本上只要設定好開啟所需的Port就可以正常地連線了。以下是如何在Win Server 2008 R2(x64)中設定防火牆的Port的方式。 以下是正常的連接方式: 但在未開啟防火牆時,就會發生無法連上資料庫伺服器的錯誤。