修正一個 FCKeditor.Net 2.6.3 的 Bug

我們有個網站,每次當頁面載入 FCKeditor 的時候,全公司就只有我的電腦可以正常執行,其他的開發人員都無法正確載入 FCKeditor,都會出現【'this.LinkedField.value' 是 null 或不是一個物件】的錯誤訊息(如下圖),這真的又是一件很詭異的事,且又再度證明一點,電腦其實是會挑人出問題的!(註:好幾次客戶打電話來問我問題時,電腦都會在我接起電話的當下自動恢復正常)

JavaScript 錯誤:'this.LinkedField.value' 是 null 或不是一個物件 

即便我更新 FCKeditor.Net 組件到 2.6.3 目前的最新版,還是一樣有這個問題。這個問題也是另一個累積好幾個星期的問題,我也是一直沒時間看,到昨天才靜下心來把問題給解決。

問題是這樣的,FCKeditor 在載入的時候,會透過一個 iframe 載入編輯器,語法如下:

<iframe id="ctl00_main_DetailsView1___內文_FCKEdit___Frame" 
    src="/js/fckeditor/editor/fckeditor.html?InstanceName=ctl00_main_DetailsView___內文_FCKEdit&amp;Toolbar=FullPage" 
    width="100%" height="600px" 
    frameborder="no" scrolling="no"></iframe>

由以上範例得知,於我們的欄位有用到中文,不過因為我們整個網站的網頁、CSS與JavaScript全部都用 UTF-8 編碼,照理說不會有這個問題,像我的 IE 就無此問題,且在 Firefox 中也從未發生過問題過,但是我在這個 iframe 中的 src 屬性看出了端倪,因為載入 fckeditor.html 的時候有載入幾個 QueryString,其中的 InstanceName 參數並沒有用 UrlEncode 編碼過,我就猜想應該是這裡誤判了!

因為 FCKeditor.Net 是 Open Source 的產品,所以我就將原始碼抓回來小改了一下,就真的把問題給徹底解決了!

首先,先下載 FCKeditor.Net_2.6.3.zip 回來,找到 FCKeditor.cs 檔案的第 359 行,將此行改成以下即可:

sLink += "editor/" + sFile + "?InstanceName=" + HttpUtility.UrlEncode(this.ClientID);
其實也只是將 this.ClientID 加上 HttpUtility.UrlEncode() 而已。

FCKeditor.cs 檔案的第 359 行,將 this.ClientID 加上 HttpUtility.UrlEncode() 即可

將 QueryString 的參數加以編碼(UrlEncode)是個好習慣,各位應該盡量用網路最標準的方式開發網站,比較不會遇到這類的問題。

  

此文章由 will 發表於 2008/7/31 上午 10:29:13

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET | JavaScript

標籤: , ,

收藏:

如何在 SQL 2005 中設定連結的伺服器(Linked Server)

今天在嘗試設定 SQLEXPRESS 中的「連結的伺服器(Linked Server)」功能,不知道是 Management Studio 翻譯的不清楚還是怎樣,試了好多次才成功,以下是我設定「連結的伺服器」的心得。

先開啟 Microsoft SQL Server Management Studio 工具,找到「伺服器物件」下的「連結的伺服器」,按滑鼠右鍵選「新增連結的伺服器(N)...」選項。

先開啟 Microsoft SQL Server Management Studio 工具,找到「伺服器物件」下的「連結的伺服器」,按滑鼠右鍵選「新增連結的伺服器(N)...」選項。

然後這頁就是重點了,讓我試了好幾次才成功的,即便我按了 F1 看線上說明我還是看不懂應該怎麼輸入。

新增連結的伺服器 / 一般頁籤

底下是各欄位的說明,部分是從 SQL Server 2005 線上叢書摘錄下來的,並另外加上我個人的說明:

  • 連結的伺服器
    • 提供用來參考此連結之伺服器的名稱。
    • 為此「連結的伺服器」設定一個名稱,未來可以在 T-SQL 的時候使用。
  • SQL Server
    • 將連結的伺服器識別為 Microsoft SQL Server 的執行個體。如果您使用這個定義 SQL Server 連結之伺服器的方法,[連結的伺服器] 中所指定的名稱就必須是伺服器的網路名稱。另外,從伺服器擷取的任何資料表,都會是來自已連結伺服器上之登入所定義的預設資料庫。
  • 其他資料來源
    • 指定 SQL Server 以外的 OLE DB 伺服器。按一下這個選項會啟動在它下面的選項。
  • 提供者
    • 從清單方塊中選取 OLE DB 資料來源。在登錄中,OLE DB 提供者是使用給定的 PROGID 註冊。
    • 如果你要連結到 SQL 2000 的資料庫,可以選擇 Microsoft OLE DB Provider for SQL Server 或是 SQL Native Client
  • 產品名稱
    • 輸入 OLE DB 資料來源的產品名稱,以加入成為連結的伺服器。
    • 隨便輸入一個名字都可以,這是用來辨識來源的資料庫是用何種產品用的,類似註解欄位。
  • 資料來源
    • 依 OLE DB 提供者所解譯的,輸入資料來源的名稱。
    • 這裡可以輸入遠端的 IP 位址(TCP/IP),或輸入具名連線位址(Named Pipe),或輸入檔案的完整路徑(Excel or Access file)。
  • 提供者字串
    • 輸入對應至資料來源之 OLE DB 提供者的唯一程式設計識別碼 (PROGID)。
    • 這就是我看不懂的地方了,其實這裡就是輸入完整的連線字串(Connection String)啦!!
  • 位置
    • 依 OLE DB 提供者的解譯,輸入資料庫的位置。
    • 這我也看不懂,應該是依據不同的 OLE DB 會有不同的用途吧,等以後有用到時在去查及可。
  • 目錄
    • 輸入連接到 OLE DB 提供者時,要使用的目錄名稱。
    • 這裡可以選擇性的輸入「資料庫名稱」,也可以不用輸入,如果你是要連結到 SQL Server,設定這個欄位好像也沒什麼用。

接下來,還要輸入「安全性」頁籤中的登入資訊,比較簡單的作法就是直接設定「使用此安全性內容建立(M):」的「遠端登入」(帳號) 以及「指定密碼」即可。

輸入「安全性」頁籤中的登入資訊,比較簡單的作法就是直接設定「使用此安全性內容建立(M):」的「遠端登入」(帳號) 以及「指定密碼」即可。

之後按下「確定」鍵,如果沒出現錯誤訊息,那就是成功啦。

不過我也發現,當你是使用 SQLEXPRESS 的時候,新增完「連結的伺服器」後,幾乎就沒什麼功能了,無法查看遠端的連結伺服器有什麼資料庫,也無法在新增完「連結的伺服器」後測試連接是否成功。但若你用的是 SQL Server 2005 且更新到 Service Pack 2 的話,您就可以透過 GUI 介面測試是否能連接到連結伺服器。你可以在 [物件總管] 中,以滑鼠右鍵按一下連結伺服器,然後按一下 [測試連接]。

若你用的是 SQL Server 2005 且更新到 Service Pack 2 的話,您就可以透過 GUI 介面測試是否能連接到連結伺服器。你可以在 [物件總管] 中,以滑鼠右鍵按一下連結伺服器,然後按一下 [測試連接]。

若連接成功,會得到以下畫面:

連結的伺服器 (Linked Server) 連接成功

如果連接失敗也會得到錯誤訊息,不過回應的訊息也可能是由遠端伺服器傳過來的,所以訊息描述的清楚與否取決於遠端回傳的資料說明詳細與否。

 如果連接失敗也會得到錯誤訊息,不過回應的訊息也可能是由遠端伺服器傳過來的,所以訊息描述的清楚與否取決於遠端回傳的資料說明詳細與否。

那如果要下 T-SQL 查詢連結的伺服器中資料庫的資料,就可以用以下語法直接查詢:

-- TEST 代表「連結的伺服器」
-- Northwind 代表「連結的伺服器中的資料庫名稱」
-- dbo 代表「連結的伺服器中的資料庫的結構描述」
-- Categories 代表「連結的伺服器中的資料庫中的表格名稱」
select * from TEST.Northwind.dbo.Categories

那如果要下 T-SQL 查詢連結的伺服器中資料庫的資料,就可以用以下語法直接查詢:

如果你要連接到不同類型的資料庫或檔案,可以參考以下連結:

其他相關連結

  

此文章由 will 發表於 2008/7/30 上午 09:22:34

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: SQL Server

標籤:

收藏:

在寫 ASP.NET 的時候要謹慎使用靜態(static)欄位

最近發現了一個之前開發過的網站,大約兩、三天就會發生「已經開啟一個與這個 Command 相關的 DataReader,必須先將它關閉。」的錯誤訊息,整個網站可以正常編譯,代表語法沒問題,測試的時候可以正常執行也不會發生 Exception,但只要一到了客戶那邊的主機執行個幾天就會開始出現問題,但通常多 reload 幾次網頁就會正常執行就好了,完全是一個很詭異的狀況。

程式碼很簡單,如下:

public class Counter
{
    protected static ExtensionDataSetTableAdapters.ClickBlogCounterTableAdapter 
        ClickBlogCounterTA = new ExtensionDataSetTableAdapters.ClickBlogCounterTableAdapter();

    public static int getClickBlogCount()
    {
        return (int)ClickBlogCounterTA.getCount();
    }
}

錯誤出現在 "return (int)ClickBlogCounterTA.getCount();" 這一行,其中 ClickBlogCounterTA 是在 Typed DataSet 中的一個 TableAdapter 物件,而這個靜態方法是在 App_Code 底下的一個類別中。

完整的錯誤訊息如下:

System.Web.HttpUnhandledException: 已發生類型 'System.Web.HttpUnhandledException' 的例外狀況。 ---> System.InvalidOperationException: 已經開啟一個與這個 Command 相關的 DataReader,必須先將它關閉。
   於 System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
   於 System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
   於 System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
   於 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
   於 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   於 ExtensionDataSetTableAdapters.ClickBlogCounterTableAdapter.getCount() 於 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\bcc246a4\3746b4ea\App_Code.eopvwaqp.10.cs: 行 8729
   於 Counter.getClickBlogCount() 於 c:\AAA\BBB\App_Code\Counter.cs: 行 62
   ......

這段 Code 不是我寫的,加上最近有點忙,所以問題一直擱著,但我找了個幾個朋友讓他們看 Code 請他們找出問題所在,但他們也都覺得這段 Code 沒問題,大家也提出一些「想法」與「解決方案」,大多人提供兩點建議:

  1. 加上 try / catch 就好啦:基本上,這是最爛的答案了,這等於是逃避問題嘛!不過這也是最懶、最快、最省事、也最輕鬆的解決方案了,但這不是我要的選項。
  2. 這一看就知道是微軟的問題嘛,錯誤是在 Typed DataSet 自動產生的程式碼中出錯的啊:ㄟ...,我也曾經一度懷疑啦,不過就以往的經驗來說,通常都是自己寫的程式錯誤的機率比較高,這應該是排在最後的一個選項了,若真的是這樣,就只好用第一點的建議了。^_^

就因為錯誤不容易重現,程式碼又可以正常執行,我昨天花了些時間仔細推敲程式碼的結構,最後終於看出問題所在,並將這個問題徹底解決了。

首先有個很重要的觀念需要說明,若你在 ASP.NET 中使用靜態欄位(static field)的話,這個靜態欄位物件會一直留存在 ASP.NET 的應用程式中 (HttpApplication),也就是說當 ASP.NET 頁面處理完成之後,該物件還是一樣存在 HttpApplication 中,並且所有 HTTP Request 都會共用這個靜態欄位變數,所以只要網站流量變多的時候就很有可能會發生資源衝突的情況,導致 TableAdapter 在進行資料處理的時候因為只共用一條連線,而造成連線狀態彼此衝突而混亂的情況。

我個人在寫 ASP.NET 就是因為知道會有這種狀況,所以本身就很少用 static 宣告變數,除非你真的很清楚使用 static 變數的時機與潛在會發生的問題,就可以大膽去用啦。

講到這裡,讓我想到一個好玩的排行榜,就是當程式不會動或有問題的時候,通常程式設計師的回答如下:

  • 第 20 名:這很奇怪喔。
  • 第 19 名:以前從來不會這樣啊!
  • 第 18 名:昨天明明會動的啊!
  • 第 17 名:怎麼可能~
  • 第 16 名:這一定是機器的問題。
  • 第 15 名:你到底是打了什麼才讓程式當掉的?
  • 第 14 名:一定是你的資料有問題。
  • 第 13 名:我已經好幾個禮拜沒碰那一段程式了。
  • 第 12 名:你一定是用到舊版了。
  • 第 11 名:一定是巧合!為什麼這種壞運氣只讓你碰上。
  • 第 10 名:我不可能什麼功能都測試到吧,有 bug 是正常的!
  • 第 9 名:這個不可能是那個的原始碼!
  • 第 8 名:這程式應該是會動的,只是我寫好後還沒做測試。
  • 第 7 名:可惡!一定有人改了我的程式。
  • 第 6 名:你有檢查過你的電腦有沒有病毒嗎?
  • 第 5 名:儘管這功能還不能動啦,你覺得他如何?
  • 第 4 名:在你的系統不能用那一個版本的程式啦!
  • 第 3 名:你幹嘛要那樣操作,都是你的問題。
  • 第 2 名:程式發生問題時你在哪裡?
  • 第 1 名:在我的機器明明就可以動啊!
  • 萬用答案:電腦請重開,應該就會好了!

另外,工程師常說的話還有以下幾項,你也可以看看你常說哪幾項:

  • 25.都這樣了,還不work,搞什麼?
  • 24.你可能中毒了喔。
  • 23.一定是有人改了我的程式。
  • 22.已經可以了,不過還沒測試過喔。
  • 21.都好了啊,還沒測試過就是了。
  • 20.我不是已經修好了嗎?
  • 19.這個不能那個。(THIS can't do THAT.)
  • 18.我一個人又測不完!
  • 17.怎麼這麼衰!
  • 16.沒問題,馬上好!
  • 15.當然,當然,我再修一修就可以了。
  • 14.快好了,快好了。
  • 13.好啦,只不過一個小功能嘛!
  • 12.你拿錯執行檔了。
  • 11.可以,可以,來得及。
  • 10.我可沒動過這個模組喔!
  • 9.你的測試資料一定有錯!(我那邊不會啊!)
  • 8.不可以這樣操作的啦!
  • 7.你的作業系統(驅動程式)升級了沒有啊?
  • 6.機器好像壞了。
  • 5.怎麼可能?!
  • 4.哦,這程式還要改一下。
  • 3.昨天還好好的呀!
  • 2.我從來不知道有這種事。
  • 1.奇怪...
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • 最後,也是最常用的
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • .
  • 0.更
  

此文章由 will 發表於 2008/7/29 上午 08:43:36

永久連結 | 評論 (5) | 此文章的RSSRSS comment feed |

分類: .Net | ASP.NET | C#

標籤: ,

收藏:

拯救硬碟:Inpage 操作執行錯誤

之前有個同事的硬碟發生問題,請我幫他解決,症狀是電腦完全無法開機,且將硬碟拆下來放到另一台主機後,發現只要點選進去都會出現「Inpage 操作執行錯誤」的錯誤訊息,完全無法操作硬碟,眼看快要沒輒的時候,又是 Google 大神拯救了我。

之後我用 chkdsk 磁碟檢查工具對這顆壞掉的硬碟進行檢查與修復,如果壞掉的磁碟機是在 F: 槽,所下的指令如下:

C:>chkdsk f: /F /R

當全部修好之後,硬碟就可以抓到了,且可以正常開機。不過,我所遇到的狀況是,電腦用了半天之後就又再度發生問題,再修一次又好了,我們發現事情不妙,決定先拯救資料,當資料備份完成之後,我再修一次硬碟,一樣用 chkdsk 工具修復,不過這次修好之後,電腦就再也抓不到了,真的是好險!

相關連結

  

此文章由 will 發表於 2008/7/28 上午 11:42:43

永久連結 | 評論 (2) | 此文章的RSSRSS comment feed |

分類: 系統管理

標籤:

收藏:

介紹好用工具:Bug Tracker

我之前曾經試用過好幾套不同的 Bug Tracker 軟體,像是 Mantis Bug TrackerBugZillaTrac,但各家有各家的特色,但我就是一直沒找到一個滿意的,不過之前又在搜尋 Bug Tracker 軟體的時候,突然發現一套由國人王俊斌自行研發的 Bug Tracker 軟體,預設就是全中文的,且畫面也挺舒服的。

多奇軟體瑕疵回報系統 ( Bug Tracker )

多奇軟體瑕疵回報系統 ( Bug Tracker ) 專案軟體瑕疵清單

Bug Tracker 是以 PHP 寫成的,可搭配 MySQLPostgreSQL 資料庫系統進行安裝,除了安裝過程「非常非常容易」之外,另外也有許功能及特色在實際的協同運作上都蠻好用的。

以下是從 Bug Tracker 網站摘錄的簡介說明:

Bug Tracker 是一個以 PHP 寫成的軟體缺陷追蹤系統,它可以協助您管理軟體開發流程。它使用資料庫幫您記住軟體缺失、待增的功能、待辦事項,可以讓您在管理軟體開發時更有效率。

大多數的人和我一樣腦海裡的記憶體空間有限,只有存放二件待辦事項的空間。要記得一二件事沒什麼問題,但若超過負荷,有新的事情進來,舊的項目就會被推出去。有了問題追蹤系統後,所以我們就可以輕輕鬆鬆管理所有待辦事項。所有關於軟體開發的歷史記錄都會存放在資料庫中,以利未來追蹤參考。使用資料庫工具可以說是一個優秀的軟體開發團隊的必備條件。

Bug Tracker 有二種使用者介面,一個是給內部開發團隊使用,另一個則是給外部客戶回報用。它具有完整的使用者、群組管理系統、資料庫搜尋及過濾功能、常見問答及文件管理等諸多功能。

功能及特色

  • 安裝非常非常非常容易
  • 使用容易
  • 完整的權限管理機制
  • 更新回報時會自動發送 Email 通知
  • 客戶回報系統
  • 匿名回報介面
  • 可搜尋、過濾每個資料欄位
  • 常見問題及文件管理系統
  • 完整的系統日誌及使用情形統計
  • 支援 UTF-8
  • 支援多國語使用者介面
  • 可以上傳附加檔案
  • 在輸入資料時可以使用 HTML 編輯器
  • 支援 PostgreSQL 及 MySQL
  • 支援需經身份認証的 SMTP 送信

有使用 Bug Tracker 需求的人,是可以考慮用看看這套,保哥強力推薦!

  

此文章由 will 發表於 2008/7/27 下午 04:36:27

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: PHP | 介紹好用工具 | 專案管理

標籤: ,

收藏:

談承諾:關於幫助填寫學術研究問卷一事

早在幾年前,就常常有各學校的研究生發 mail 給我,請我幫他們填寫動輒超過十頁的問卷,當時的我也覺得有些研究的主題不錯,跟軟體產業也有些相關,我自己也挺有興趣的,所以就問他們在研究結束的時候可否將他們做的研究結果報告寄給我一份參考,而每個同學都信誓旦旦的說:「好啊,那有什麼問題」,填寫完成後他們也會很有禮貌的發 mail 感謝我,也再一次信誓旦旦的說:「當報告做完的時候,會寄給您一份的,感謝您的填寫」。幾年過去了,我也曾經填過十多份問卷,不過,沒有一個人將他們研究的結果報告寄給我。

也許他們忘了、也許他們覺得他們的報告沒什麼價值不好意思寄出、或是其他莫名的原因,但我再也無心填寫這些問卷了,畢竟填寫一份問卷也要花不少時間,我都還蠻仔細看這些題目的,希望回答能盡量貼近現實狀況,因為我也想知道最後的研究結果是否能對我產生一些幫助。

我想強調的是一般人到底對「承諾」這件事有多在意,我相信大部分的人對「承諾」都會看情況打折的,而對「陌生人」的「承諾」更是不在乎,但這種不在乎的習慣一旦養成,會無形中降低自己的價值,也會慢慢變的不可被信任。

就拿填寫學術問卷一事來說,請我填寫的人是誰我也不認識,就算他們沒完成他們當初給我的承諾,我也不會記得他們是誰,也不會特別想去記得他們是誰,但是下次有人請我填問卷的時候,我就會感覺「這些請別人填寫問卷的學生都是不守承諾的人,我沒必要填寫這些問卷吧,反正他們也不在乎這些做問卷的人,我只是他們完成研究報告的工具罷了」。

老實說,我常收到同一個指導教授寄來的問卷,可能是我在他們名單中吧,所以每一屆的學生都會叫我做問卷,做問卷調查的研究生難免都會遇到問卷回收份數不足的問題,如果不好好經營這些做問卷的人,日後的學生要請社會人士做問卷時只會越來越辛苦。我覺得學校老師或教授應該也要讓學生知道,除了要感謝做問卷的人之外,若有填問卷的人有所要求時,應該予以重視。

我覺得每個人都應該做到「不輕易做出承諾,若做出承諾就盡力達成,無論對方是朋友或陌生人,若達不到承諾也應該主動告知對方交代清楚」,培養正確的態度比專業更重要。

  

此文章由 will 發表於 2008/7/26 上午 09:12:07

永久連結 | 評論 (3) | 此文章的RSSRSS comment feed |

分類: 心得分享

標籤: , ,

收藏:

設定 IIS 每日建立 Log 的時間改為台灣的本地時間

之前提到在使用 AWStats 分析的時候必須要注意分析 Log 的時間點,因為預設來說是在格林威治標準時間(GMT)做 Log 的時間紀錄,所以才會造成當天的 Log 檔出現的時間是在台灣時間的 08:00,如果你要在台灣時間的 00:00 作為新一天檔案建立的時間,也是可以設定的。

首先,先開啟「網際網路資訊服務(IIS)管理員」,在選擇網站按右鍵選「內容」

先開啟「網際網路資訊服務(IIS)管理員」,在選擇網站按右鍵選「內容」

然後,點選「啟用紀錄」的「內容(P)」

點選「啟用紀錄」的「內容(P)」

最後,在勾選「請使用本地時間為檔案命名」即可將 W3C 擴充記錄檔的建立時間及命名格式設定為台灣地區的 00:00,而不是格林威治標準時間(GMT)

在勾選「請使用本地時間為檔案命名」即可將 W3C 擴充記錄檔的建立時間及命名格式設定為台灣地區的 00:00,而不是格林威治標準時間(GMT)

但請特別注意,這裡僅僅是將「建立檔案」的「檔案名稱」設定為從本地時間做切換而已,Log 內容的時間計算還是以格林威治標準時間(GMT)為主。

  

此文章由 will 發表於 2008/7/25 上午 11:50:41

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: IIS | 系統管理

標籤: , ,

收藏:

更新 SQL 2005 SP2 之後發現 SQLExpress 無法啟動的情況

由於我的電腦十分特殊,安裝了 SQLEXPRESS 資料庫 + SQL Server 2005 標準版的 Tools,可能是因為這樣導致我最近的 Windows Update 出現的 SQL Server 2005 SP2 的更新項目,但更新了好幾次,每次都失敗,最後所幸就不更新了。不過,今天卻發現我有一個專案跑不起來,這個專案用的資料庫是放在 App_Data 底下的,也就是用 User Instance 的方式啟動資料庫,啟動 User Instance 的先決條件是本機的 SQLEXPRESS 資料庫必須啟動,這時才發現我的 SQLEXPRESS 資料庫啟動不了。

我從事件檢視器中發現 SQLEXPRESS 出現【UpdateUptimeRegKey: 發現作業系統錯誤 5(存取被拒。)。】的錯誤訊息:

UpdateUptimeRegKey: 發現作業系統錯誤 5(存取被拒。)。】

還有「在啟動期間,開啟檔案 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\master.mdf' 以取得組態資訊時發生錯誤 3(系統找不到指定的路徑。)。這可能是無效的啟動選項所造成的錯誤。請確認您的啟動選項,並在必要時更正或移除它們。」這個錯誤訊息,整個就是一個字「怪」,不知道 Windows Update 到底幫我改了什麼設定。

後來,我為了要趕快讓我的專案能運作,就先用以下方式解決無法啟動的問題(兩個步驟):

1. 將 SQL Server (SQLEXPRESS) 服務的登入權限改為「本機系統帳戶」,改完後就可以啟動了。

將 SQLEXPRESS 服務的登入權限改為「本機系統帳戶」

2. 開啟 Management Studio 並連入 SQLEXPRESS 啟動 User Instance 的支援,請執行以下 T-SQL 指令:

sp_configure  'user instances enabled', 1
GO

RECONFIGURE
GO

就這樣完成了,但我覺得這應該不是標準的程序,僅能救急用,給有需要的人參考一下。

網路上的相關連結

  

此文章由 will 發表於 2008/7/24 下午 08:54:28

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: SQL Server | 系統管理

標籤: ,

收藏:

介紹好用工具:Streams 讓你瞭解神秘的 NTFS 檔案系統

Windows Sysinternals 工具組中的 Streams 可以讀取 NTFS 檔案系統中目錄或檔案的「替代資料串流(alternate data streams)」的資料,而這個 streams 真的是個「非常神秘」的東西。

「資料串流(Streams)」這個名稱我想大家一定覺得很抽象,在 NTFS 檔案系統中,目錄與檔案都是以資料串流的方式儲存,而預設的檔案內容就是儲存在「未命名資料串流」中,如果要在命令提示字元下取得「未命名資料串流」的資料,很簡單的就是利用 type 命令將資料取出,例如:

C:\>type C:\test.txt
123

或是

C:\>more C:\test.txt
123

而若要寫入或讀取「替代資料串流」的資料就可以利用一個冒號( : )加上一個鍵值(Key)進行存取。

例如你要寫入一個字串 ( Hello ) 到 C:\test.txt 檔案的「替代資料串流」中,並將這個「替代資料串流」命名為 TEST,就可以用以下語法寫入:

echo Hello > C:\test.txt:TEST

這樣子就可以將 Hello 字串(包括斷行)儲存到 C:\test.txt 檔案的「替代資料串流」中,而若你要將這個「替代資料串流」中的資料取出,可以用以下語法:

C:\>more < c:\test.txt:TEST
Hello

注意:你不能使用 type 命令將 C:\test.txt 檔案中的 :TEST 串流資料取出,因為 type 命令並不支援串流資料(stream)的讀取!若你有安裝 cygwin 的話,裡面的 cat 工具也可以讀取「替代資料串流」資料。

「替代資料串流」中的資料就如同「未命名資料串流」中的資料一樣,你想儲存什麼資料都可以,純文字、二進位資料都 OK 的,只是儲存在「替代資料串流」中的資料量大小,在使用檔案總管檢視的時候是不會被計算到的,如下圖示,我的 test.txt 內容有 3 個位元組(bytes),剛剛透過指令寫入 Hello 字串 + 斷行符號 + NULL 字元,一共 8 個 bytes 被寫入到  test.txt 檔案的 TEST 替代資料串流中,照理說這個檔案應該要佔用 11 個位元組(bytes)才對,但是在檔案總管中卻僅僅顯示 3 個位元組(bytes)而已。雖然這裡看不出來,但是磁碟的容量還是實際被佔用 11 個位元組(bytes)的!

 test.txt 內容

但你要如何才能看出你的檔案或目錄中有沒有任何「替代資料串流」的資料呢?預設來說 Windows 內建的所有工具或指令,沒有一個能夠查詢檔案中是否有「替代資料串流」資料。

這時,你是否有種心理涼涼的感覺?我剛瞭解到 streams 這個玩意的時候,覺得很恐怖勒!NTFS 檔案系統中竟然有個如此神秘的地方可以藏資料,而且還不會被發現!這就是為什麼當你在 C:\ 下按「全選」然後選「內容」計算檔案大小時,怎麼算都跟磁碟機的「已使用空間」不符,雖然這些神秘的資料並不全然都是儲存在「替代資料串流」中,但也有可能有些許資料藏在這裡。

若要查詢出檔案或目錄中是否有「替代資料串流」的資料,就只能靠 Windows Sysinternals 工具組中的 Streams 工具幫你檢視了,streams 的用法很簡單,如下:

C:\>streams

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

usage: streams [-s] [-d] <file or directory>
-s     Recurse subdirectories
-d     Delete streams

當我們用 streams 工具查詢剛剛的 C:\test.txt 檔案時,就會查到該檔案中所有「替代資料串流」的所有鍵值:

C:\>streams test.txt

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\test.txt:
            :TEST:$DATA 8

你也可以利用 -s 參數掃瞄整個磁碟機中所有的目錄與檔案,看看到底有多少檔案或目錄有「替代資料串流」資料:

C:\>streams -s .

最後,我再分享一個小經驗,大部分人應該都曾經看過以下的安全性警告視窗吧:

安全性警告視窗

這是因為你透過 IE 線上下載 *.exe 的檔案(例如:putty.exe),IE 在開啟或儲存檔案的時候,就會幫你多加上一個「替代資料串流」資料,並且會將「替代資料串流」的鍵值取名為 Zone.Identifier,如下:

C:\>streams putty.exe

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\putty.exe:
   :Zone.Identifier:$DATA       26

若你將這個鍵值的內容取出,會發現以下資料:

C:\>more < putty.exe:Zone.Identifier
[ZoneTransfer]
ZoneId=3

而當你透過 streams.exe 工具用 -d 指令將 putty.exe 檔案的「替代資料串流」資料刪除後,就不會再出現這個畫面了。

C:\>streams -d putty.exe

Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\putty.exe:
   Deleted :Zone.Identifier:$DATA

等一段時間後(大約幾十秒吧),你再透過檔案總管或捷徑啟動 putty.exe 就不會再有安全性警告的提示了。

相關連結

  

此文章由 will 發表於 2008/7/23 上午 09:38:10

永久連結 | 評論 (2) | 此文章的RSSRSS comment feed |

分類: Security | Tips | 介紹好用工具 | 系統管理

標籤: , , ,

收藏:

分享幾個可在遠端桌面中使用的快速鍵

我幾乎每天都在用遠端桌面(Remote Desktop)進行遠端主機的管理,不過很多在本機可以用的快速鍵在遠端桌面的視窗中都無法使用,其實並非不能用,正確的來說應該是在「非全螢幕」的情況下不能用而已(除了 CTRL + ALT + DEL 以外),其他若要在非全螢幕的情況下使用的話,就必須用另一組快速鍵來操作。

以下就是部分快速鍵的對照表,懶得記的人背下前兩個即可:

本機快速鍵 遠端桌面快速鍵 功能說明
CTRL + ALT + DEL CTRL + ALT + END

顯示 [Windows 安全性] 對話方塊

-

CTRL + ALT + BREAK

在視窗和全螢幕顯示模式間切換。

Win Key 或 CTRL + ESC

ALT + HOME

顯示 [開始] 功能表。

ALT + TAB

ALT + PAGE UP

從左到右切換視窗
SHIFT + ALT + TAB

ALT + PAGE DOWN

從右到左切換視窗
PrintScreen

CTRL + ALT + 數字鍵上的加號(+)

將遠端的整個螢幕畫面複製回本機。
ALT + PrintScreen

CTRL + ALT + 數字鍵上的減號(-)

將遠端的作用中的螢幕畫面複製回本機。

P.S. 由於透過遠端傳輸,所以若你在貼上的時候可能會等待一些時間等待遠端將畫面傳送回來。

相關連結

  

此文章由 will 發表於 2008/7/22 下午 02:43:48

永久連結 | 評論 (3) | 此文章的RSSRSS comment feed |

分類: Tips | 系統管理

標籤: ,

收藏: