2008年3月26日 星期三

Events and Code (3.27)

書刊:Beginning.ASP.NET.2.0(Wrox)


Web Server 架構(p.181)

  1. Post:將資料包裝在Http標頭內傳送給WebServer
  2. Get:把資料直接加在URL之後傳送

使用Server Controls可以克服Http的「Statelss(無記錄狀態)」的特性(p.182)

  • 一般的Html Controls在執行Sumit(Post)動作時,網頁元件會回復成原來未輸入資料的樣子,但Server Controls有著「PostBack」的功能,可以將元件資料Sumit給自己,所以便可保留狀態

PostBack 架構(p.190)

  1. PostBack顧名思議就是「post」->「back」,將網頁資料先post給自己後(記錄狀態)再傳送到WebServer
  2. 另外由於 PostBack的緣故,網頁在執行時每次都重跑一次「Page_Load」,所以可以另外加「IsPostBack」判斷是否「PostBack」來執行指令

事件觸發時機((p.195)

  1. 使用者控制(ex. Click)
  2. 繫結資料庫時(ex. DataBound、ItemDataBound)
  3. ASP.NET引發(ex.DataBind)(使用者另外要求)

取消事件(Canceling Events)(p.203)

  • 在對資料庫進行異動時(Inserting、Updating等...),另外可以有「取消」的事件,進行取消的動作。指令: e.Cancel(2.0新功能)

Global事件(Global Events)(p.206)

  1. Application_Start:在Web伺服器(IIS)啟動時,並且有第一個使用者執行程式時觸發
  2. Application_End:Web伺服器(IIS)關閉或停止時觸發
  3. Session_Start:網頁開始執行時(開始存取網頁)時觸發
  4. Session_End:Session TimeOut時觸發
  5. Application_Error:程式執行期間的例外狀況,如果沒有用「try...catch」攔的話,都會跑到此事件
  6. Profile_OnMigrateAnonymous:當設定檔的匿名使用者登入時觸發(2.0新功能)


取得網頁的HTML原始碼(3.26)

圖一
圖二
圖三


案例:
在Google Patents搜尋(圖一)中,鍵入:「Patent:XXXXXX」,可以取得與此相關的專利(列表)(圖二)。
但目前有個需求是希望在自己的網頁中,建立一個UserControl,來取代「Google Patents」(圖一)的畫面
此UserControl裡放置了「TextBox」、「Button」各一個,希望能在使用者輸入「專利號」
就可以馬上連結到該專利的網頁(圖三),而非「一個列表(圖二)」。


問題來了,要連到專利的網頁(圖三),必須要知道該專利的id(由google的url得知)
但是,id是存在google他們的資料庫呀,我們如何知道呢?


其實,在列表中的超連結,已有專利的id可見,所以只要利用「WebRequest
攔截列表的html,再找出該專利的id,這樣就可以自己串連到專利網頁的URL了。




// 設定request
System.Net.WebRequest request = System.Net.WebRequest.Create(pageUrl);
//設定TimeOut的時間(怕網路速度過慢,資料不完全)
request.Timeout = timeoutSeconds * 1000;

// 從request接收資料
System.Net.WebResponse response =request.GetResponse();
System.IO.Stream streamReceive = response.GetResponseStream(); System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("utf-8"); System.IO.StreamReader streamRead = new System.IO.StreamReader(streamReceive, System.Text.Encoding.Default);

// 取得原始碼
String HTML =streamRead.ReadToEnd();

2008年3月7日 星期五

SQL Server中利用「Cursor」取得每一筆資料

左方資料表,如何將其資料一筆一筆的讀取出來進行運算呢?可以使用「Cursor」來達到我們所要的要求!!
*右圖為依序取出資料的結果~

以下為簡單的應用

語法:

declare @no nchar(2)
declare @name nchar(10)
-----宣告讀取資料的cursor------
declare city_cursor
CURSOR for
SELECT City_no,City_name from dbo.City

open city_cursor --開啟COLUMN_cursor

fetch next from city_cursor into @no,@name --把取出來的值存入變數
while @@FETCH_STATUS = 0
--判斷city_cursor是否還有資料
begin
print '編號:'+ @no
print '地區:'+@name
fetch next from city_cursor into @no,@name--進行下一筆
end
close city_cursor --關閉city_cursor
DEALLOCATE city_cursor --移除city_cursor


在 SQL Server 2005 中取得欄位定義(含備註欄位)





有兩個條件必須成立才能使用這段 SQL:


1. 資料庫系統必須是 SQL Server 2005


2. 資料庫的「相容性層級」必須設定成 "SQL Server 2005 (90)"