2008-08-31

Enable FILESTREAM Feature in SQL 2008

如果在安裝的時候沒有 Enable FILESTREAM 功能的話, 可以在安裝完後, 按以下步驟執行:

image

image

image .

最後再執行以下句子就可以了!

EXEC sys.sp_configure N'filestream access level', N'0'
GO
RECONFIGURE WITH OVERRIDE
GO

keywords: sqlserver, sql2008, FILESTREAM

.NET 1.1 WebRequest KeepAlive 和 WebProxy.Credentials 的奇怪現象

發生在一個 .NET 1.1 的 App 上的問題, 簡化後的程式碼如下:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.KeepAlive = false;

request.Proxy = new WebProxy(proxyServer);
request.Proxy.Credentials = new NetworkCredential(userName, password);

HttpWebResponse response = request.GetResponse() as HttpWebResponse;
response.Close();

因為某種原因, 在一開始時刻意將 KeepAlive 屬性設為 false, 導致了這個奇怪現象的發生, 而且只會在 .NET 1.1 底下發生! 症狀是如果 KeepAlive 設為 false 的話, 就會丟出 407 Proxy Authentication Required 的例外, 可是同樣的程式在自家的環境內卻又測不出問題, 所以初步研判應該是 Proxy server 不同的原因所造成, 如果是在 Microsoft ISA Server 的環境中就會發生, 而在 Squid Proxy Server 則沒有這個問題, 這是什麼道理咧?!

道理說穿了很簡單, 因為 Squid Proxy Server 是採用 Basic 的驗證方式, 而 ISA Server 預設卻是 challenge-response 的驗證機制, Basic 的驗證方式是將帳號密碼以 base64 的方式編碼傳送出去, 所以和 server 不需要保持連線, 但是 challenge-response 則必需要保持連線才可以進行驗證, 這就是為什麼當 HttpWebRequest 的 KeepAlive 設成 false 的時候, 在 ISA Server 的環境一直驗證失敗的原因! 而 .NET 2.0 之所以不會發生這個問題是因為有針對這個情況做特別處理, 也就是在進行 challenge-response 驗證時, 會自動將 Proxy-Connection 的 Header 設為 Keep-Alive, 待驗證過後才再設為 Close, 所以不會出問題!

相關知識可以參考 Authentication in WinHttp, Challenge-response authentication 和一篇寫的很詳細的 blog 文章 WebProxy.Credentials does not work when KeepAlive = false in .NET 1.1

keywords: httpwebrequest, proxy, credentials, keepalive

SQL Server 2008 沒有 Surface Area Configuration Tool

好不容易等到 VS2008 SP1 出來, 終於可以順利安裝完 SQL 2008, 卻發現原來在 SQL 2005 內的兩個工具不見了, 它們是:

  • Surface Area Configuration for Services and Connections
  • Surface Area Configuration for Features

它們通常一個是用來設定開放外部電腦透過 TCP/IP 連線, 一個是用來開啟 clr 或是 database mail 的功能用的, 到了 SQL 2008 這個兩個工具都消失了, 那該怎麼做相關的設定呢?

關於第一個 Services and Connections 的設定, 現在可以在 SQL Server Configuration Manager 這個新工具中進行設定, 像 TCP/IP 的設定就可以在 SQL Server Network Configuration\Protocols for [MSSQLSERVER] (<--這個是 instance name) 底下找到!

至於第二個 Features 的設定, 則被移到了 SQL Server Management Studio (SSMS) 去了, 在 Server 上點右鍵, 打開 Facets, 視窗上方會有一個 Facet: 下拉選單, 選到 Surface Area Configuration 之後, 就會看到熟悉的選項了, 如圖:

image

keywords: sqlserver, sql2008, sac, surface area configuration

2008-08-09

透過 FontFamily.GetName 取得特定語系的字型名稱

一個簡單的列舉就可以找出系統內字型的特定語系名稱:

foreach (FontFamily f in FontFamily.Families)
{
    Console.WriteLine(f.GetName(0) + ":" + f.GetName(0x409));
}

在尋找答案的過程, 意外的多學了幾個關於 LanguageID 的小知識, 原來 language ID 是一個 16 bit 的值, 由兩個部分組成, primary language ID 和 secondary language ID, 結構示意圖如下:

image

其中 Sublanguage ID 僅佔了 6 bits, 一閞始困為沒注意到所以導致計算的結果有誤, 後來仔細看才發現原來兩部份的長度是不同的, 舉個實例來說明一下:

//  winnt.h
//
//  Primary language IDs.
#define LANG_CHINESE                     0x04
//
//  Sublanguage IDs.
#define SUBLANG_CHINESE_TRADITIONAL      0x01    // Chinese (Taiwan)

所以 Traditional Chinese 的 language ID 就等於 0x01 << 10 | 0x04 = 0x404

再繼續往下讀 winnt.h, 又出現了一個叫 locale ID 的東西, 順便也記一下!
image 
keywords: font, LanguageID, localeID

使用 ADO.NET 接回 SQL Server 的 PRINT Message

常看到有人被這個問題困擾, 自己以前也曾經被這個問題所苦, 可是其實這個問題是很容易解的, 看範例:

using (SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI"))
{
    conn.InfoMessage += new SqlInfoMessageEventHandler(SqlConnection_InfoMessage);

    conn.Open();
    SqlCommand cmd = conn.CreateCommand();
    cmd.CommandText = "DBCC CHECKIDENT ('HumanResources.Employee', NORESEED)";
    cmd.ExecuteNonQuery();
}

重點就是 SqlConnection.InfoMessage 事件, 可以在事件處理函式中以 e.Message 取得 SQL Server 所輸出的訊息!

順便介紹一個 DBCC 指令 "DBCC CHECKIDENT", 這個指令是用來檢視指定 Table 內有使用自動遞增欄位目前的值, 有需要知道或是想要重設序號為某一個新值的人可以參考該指令的用法!

SQL Server 2008 RTM 出現了

今天在逛微軟網站的時候, 突然發現上週還是 RC0 版本的 SQL Server 2008 的下載連結, RC0 的字樣不見了, 原本預計 7/31 發行的 RTM 版本, 在 8/6 出現在 MSDN 的下載區, 想要嚐鮮的朋友們可以去下載 180 天的試用版來玩玩了!