修正一個 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

永久連結 | 評論 (2) | 此文章的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

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

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

標籤: ,

收藏: