就是愛分享
在SQL Server中,我們可以使用二種方法來設定自動化的資料處理規則:

1.條件約束(Constraint)可以直接設定於資料表內,通常不需另外撰寫程式。但此方法只能進行比較單純的運作,包括自動填入預設值(DEFAULT),確保欄位資料不得重複(PRIMARY KEY/UNIQUE KEY)、限制輸入值在某個範圍內(CHECK)、維護資料表間的參考完整性(FOREIGN KEY)...等。

2.觸發程序(Trigger)是針對單一資料表所撰寫的特殊預存程序,當該資料表發生INSERT、UPDATE或DELETE時會自動被觸發(執行),以進行各項必要的處理工作。由於是撰寫程式,因此無論是單純或複雜的工作都可一手包辦。

當然,如果只是單純的自動化工作,我們應儘量利用條件約束來完成,因為這樣做一方面容易設定及維護,另一方面執行效率也會比較好。只有當條件約束無法滿足實際需求時,才應考慮使用觸發程序來處理。

那麼,觸發程序到底有什麼特異功能呢?底下來看幾個例子:

檢查所做的更改是否允許:
雖然我們可以用資料表的條件約束來維護資料完整性,例如CHECK、PRIMARY KEY/UNIQUE KEY、FOREIGN KEY等,但觸發程序可以做更多樣、更複雜的檢查。例如同時檢查許多個資料表,或使用IF...ELSE等來做更有彈性的檢查。

‧進行其他相關資料的更改動作:
例如當某筆訂單被取消時,我們可以利用觸發程序去自動刪除相關的送貨單資料,並將業務員的獎金扣一半;或是在更改員工的薪資時,將更改的日期及原薪資存入另一個薪資異動資料表中。

‧發出更改或預警的通知:
例如當有新進員工的資料被輸入時,觸發程序可以自動發Mail通知該部門的所有人員;或是當庫存量小於安全量時,即發Mail通知倉庫管理員要趕快進貨。

‧自訂錯誤訊息:
當操作不符合條件約束時,所回應給前端應用程式的錯誤訊息都是固定的內容。利用觸發程序,則可以回應我們自訂的錯誤訊息。

‧更改原來所要進行的資料操作:
利用SQL Server 2005的INSTEAD OF觸發程序,我們可以撰寫程式來取代原本應該進行的資料操作。例如當新增一筆記錄時,我們可以將該記錄的資料另做處理,而不存入資料表中。

‧檢視表也可以有觸發程序:
檢視表中的計算欄位通常是不允許更改的,但同樣是利用INSTEAD OF觸發程序,我們可以打破這個限制,將預備要更改的資料欄截出來另外處理。例如可將使用者輸入的地址先分解成縣市與街道二部份,再分別存入縣市與街道欄位。

其實觸發程序就像是倉庫的管理員一樣,當有貨物要進出時,管理員即會出面做查核或協調,以維護整個倉庫的正常運作。因此,如果您是資料庫的管理者(DBA,DataBase Administrator),那麼就應該好好利用觸發程序的功能,為每個重要的資料表都設計一個最佳的倉庫管理員,這樣就不用擔心使用者胡作非為,或是不按照牌理出牌了。

觸發程序的種類與觸發時機

觸發程序可分為2種:
‧AFTER觸發程序:這類的觸發程序要在資料已變動完成之後(AFTER),才會被啟動並進行必要的善後處理或檢查。若發現有錯誤,則可用ROLLBACK TRANSATION敘述將此次操作所更動的資料全部回復。

‧INSTEAD OF觸發程序:INSTEAD OF是"取代"的意思,就是這類觸發程序會取代原本要進行的操作(例如新增或更改資料的動作),因此會在資料變動之前就發生,而且資料要如何變動也完全取決於觸發程序。

INSTEAD OF觸發程序能夠適用於資料表及檢視表(View)上;而AFTER觸發程序則只能使用於資料表。

另外,當我們在建立觸發程序時,還必須指定程序要被觸發的操作時機:INSERT、UPDATE或DELETE,至少要指定一種,當然一個觸發程序也可同時指定二種或三種時機。在同一個資料表中,我們可以建立許多的AFTER觸發程序,但INSTEAD OF觸發程序針對每種操作(INSERT、UPDATE、DELETE)最多只能各有一個。

如果針對某操作同時設定了INSTEAD OF及AFTER觸發程序,那麼只有前者會被觸發,後者未必會被觸發。

觸發程序的建立與修改
用SQL建立觸發程序的簡易語法如下:

CREATE TRIGGER trigger_name
ON {table | view}
[WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF} { [DELETE] [,] [INSERT] [,] [UPDATE]}
AS
sql_statements


閱讀全文...
就是愛分享
當我們在撰寫SQL程式時,多少都會用到一些系統內建的函數,例如GETDATE()、CAST(...)等。而SQL Server 2005的「使用者自訂函數」功能,則讓我們也可以自己來建立函數,然後直接應用於SQL敘述或運算式中。

自訂函數其實和預存程序是很類似的,都是由多行T-SQL敘述所組成的程式單元。不過它們之間還是有一些明顯的差異:

1.預存程序只能傳回一個整數值;而自訂函數則可傳回各種資料型別的值(但text、ntext、image、timestamp、cursor及rowversion除外),甚至包括了sql_variant及table型別。

2.預存程序可以經由參數來傳資料(將參數設為OUTPUT);但自訂函數則只能接收參數,不可由參數傳回資料。

3.在預存程序中可以做任何的資料異動,例如新增或修改資料、更改資料庫的設定...等;但自訂函數則不允許更改資料庫的狀態或內容。

4.預存程序必須以EXECUTE來執行,因此不能使用在運算式之中,例如myProc會傳回2,那麼「SET @var=myProc」或「SELECT * FROM myProc」都會造成錯誤。而自訂函數則除了可用EXECUTE來執行外,也可用於運算式中,並以傳回值來取代其名稱,例如假設myFun(3)會傳回"Good",則「SET @var=myFun(3)+'!'」就相當於「SET @var='Good'+'!'」。

一般來說,預存程序比較適合做一些對資料庫的操作或設定,其執行結果通常不必傳回,或將結果傳回到執行該程序的應用程式中(例如將SELECT敘述的結果傳回到SQL查詢或前端應用程式中);而自訂函數則適用於計算或擷取資料,然後將結果傳回給呼叫它的運算式或SQL敘述(例如SELECT或FROM子句)中使用。

自訂函數的建立

您可以在SQL Server Management Studio中建立自訂函數,其操作方法也和預存程序差不多,只是SQL語法有所不同而已:



自訂函數依傳回值及函數內容可分為兩大類:

1.純量值函數(Scalar-valued function):這類函數會傳回單一的資料值,而資料值的型別可以是除了text、ntext、image、cursor及rowversion(timestamp)之外的任何型別。若是傳回table型別的資料,則歸屬於下列二類函數。

2.傳回資料集(Rowset)的自訂函數:這類函數可傳回一個table型別的資料集,依其定義語法的不同,又分為2小類:

‧嵌入資料表值函數(Inline table-valued function):或稱為「行內資料集函數」。函數的內容僅有一個SELECT敘述,而傳回值即是該SELECT的查詢結果。

‧多重陳述式資料表值函數(Multistatement table-valued function):或稱為「多敘述資料集函數」。函數內容包含許多的敘述,而最後也會傳回一個table型別的資料集。

閱讀全文...
就是愛分享
在預存程序中使用敘述時,需注意以下的限制:

1.在預存程序中,有些敘述不可使用,包括:


而除了上表以外的其他敘述則可以使用,甚至我們可以在預存程序中建立物件(例如CREATE TABLE)並進行存取;也就是說,在編譯預存程序時,其內所參照到的物件可以不存在,只要在該敘述實際執行時,所參照的物件已經存在即可。

2.在同一個資料庫中,只要使用不同的結構描述,便可以建立相同名稱的物件。因此不管執行者是誰,只要預存程序中未指明物件的結構描述,都會先找以預存程序所屬的結構描述來尋找物件,找不到的話再換用"dbo.物件",若都找不到則產生錯誤訊息。

3.有些指令在執行時若未指定結構描述,會固定以目前使用者的預存結構描述來尋找或建立物件,這些指令包括:

因此在預存程序中使用這些敘述時,最好要同時指明結構描述,以免其他使用者在執行時發生預期之外的結果。

參數傳遞的技巧

當我們執行預存程序時,若未指明參數名稱,則必須依照預存程序所需的參數依序傳過去;而且除非該參數有指定預存程序並且是在最後面,否則不可以省略。

預存程序的3種傳回值
1.在程序中以"RETURN n"傳回整數值。
2.在參數中指定OUTPUT選項的參數。
3.預存程序中執行敘述(例如SELECT)所傳回的資料集(RecordSet)及通知訊息。

閱讀全文...
就是愛分享
「預存程序」(Stored Procedure)就是將常用的或很複雜的工作,預先以SQL程式寫好,然後指定一個程序名稱儲存起來,那麼以後只要使用EXECUTE敘述來執行這個程序,即可自動完成該項工作。

預存程序的優點

預存程序中可以包含資料存取敘述、流程控制敘述、錯誤處理敘述...等在使用上非常有彈性。其優點有:

執行效率高:SQL Server會預先將預存程序編譯成一個執行計劃並儲存起來,因此每次執行預存程序時都不需要再重新編譯,如此可以加快執行速度。由此可知,我們應該將經常使用的一些操作寫成預存程序,來提高SQL Server的運作效率。

統一的操作流程:我們可以將複雜的工作製做成預存程序,如此除了節省人力操作的時間外,對於一般使用者來說,也可以維持一致的資料操作流程,並避免使用者不小心的操作錯誤。例如當某項資料變更時,必須更動到5個資料表的內容,那麼將更新步驟寫成預存程序來執行,不但省事,而且也不怕漏掉任何一個資料表。

重複使用:預存程序還可模組化(將大的程序分解成許多較小而且可以獨立運作的程序),以方便除錯、維護、或重複使用於不同的地方。例如當我們要將「地址」資料分解成「市、街、號、樓」4個字串時,可寫一個預存程序來處理,那麼以後在任何地方只要執行此預存程序,即可完成分解地址的工作。

安全性:當資料表需要保密時,我們可以利用預存程序來作為資料存取的管道。例如當使用者沒有某資料表的存取權限時,我們可以設計一個預存程序供其執行,以存取該資料表中的某些資料,或進行特定的資料處理工作。此外,預存程序的內容還可以加密編碼,這樣別人就看不到預存程序中的程式了。

預存程序的種類

預存程序可分為3類:

系統預存程序(System stored procedures)
系統預存程序一律以sp_開頭,例如"sp_dboption"。此類預存程序為SQL Server內建的預存程序,通常是用來進行系統的各項設定、取得資訊或相關管理工作。

延伸預存程序(Extended stored procedures)
延伸預存程序通常是以xp_開頭,例如"xp_logininfo"。此類程序大多是以傳統的程式語言(例如C++)撰寫而成,其內容並不是儲存在SQL Server中,而是以DLL的形式單獨存在。

我們可以把延伸預存程序看成是SQL Server的外掛程式,它可以擴充SQL Server的功能,例如SQL Server沒有從網頁中萃取資料的能力,則我們可以撰寫一個DLL的延伸預存程序,以供SQL Server將之載入並執行。

使用者自訂的預存程序(User-defined stored procedures)
就是我們自己設計的預存程序,其名稱可以任意取,但最好不要以sp_或xp_開頭,以免造成混淆。自訂的預存程序會被加入所屬資料庫的預存程序項目中,並以物件的形式儲存。

用SQL語言建立預存程序
建立預存程序是使用CREATE PROCEDURE敘述,其語法如下:

CREATE PROC[EDURE] procedure_name [;number]
[@parameter data_type [VARYING] [= default] [OUTPUT]]
[,...n]
[WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION }]
[FOR REPLICATION]
AS sql_statement [...n]


閱讀全文...
就是愛分享
在存取資料庫時,我們所下的SQL敘述不一定要一個一個地執行,也可以利用批次(Batch)的方式,將一個或多個SQL敘述打包,一起送到SQL Server去處理。SQL Server會將一個批次中所包含的數個SQL敘述當做一個執行單元(Unit),一起編譯成為執行計畫(Execution plan),然後再加以執行。

不過請注意,並非所有SQL敘述皆可放在同一個批次內執行,例如CREATE VIEW、CREATE DEFAULT、CREATE RULE、CREATE PROCESURE及CREATE TRIGGER敘述只能單獨放在一個批次中執行,不能與其他敘述合併執行。

用GO分隔不同的批次

因為不是所有SQL敘述都可以放再同一個批次,或是有些情況下,您可以會希望讓某些敘述分開執行。假設您有三個敘述需要執行,如果三個敘述全部放再同一批次,則當第1個敘述失敗時,批次就會停止,而不會繼續執行第2、3個敘述,若是能夠將第1與第2、3個敘述隔開,就可以確保後面敘述可以順利執行。

所以SQL Server提供了一個GO指令,讓您可以隔開SQL敘述,將之分為多個批次。下面是一個簡單的範例:

USE 練習02 <-------第1個批次
GO
SELECT * -----
FROM 客戶 |
SELECT * |---第2個批次
FROM 訂單 ----|
GO

當SQL Server遇到GO指令時,會將GO當作傳送批次的訊號,例如遇到第1個GO的時候,會將GO前面的敘述傳送給伺服器進行處理(編譯成執行計劃並加以執行)。而遇到第2個GO指令時,再將兩個SELECT敘述傳送給伺服器處理,如此就產生兩個批次。

請注意,GO只有SQL Server Management Studio提供的工具程式才能辦識並處理。意即GO指令只能使用在SQL Server Management Studio中執行,若是您撰寫應用程式(例如用Visual Basic撰寫)時使用GO指令,那麼SQL Server將會因不認得而產生錯誤訊息。

閱讀全文...
就是愛分享
在ASP.NET中,網頁是由「視覺」與「程式邏輯」兩個部分所組成的,視覺就是指圖片、靜態文字、HTML標籤...等掌控網頁外觀的部分,而程式邏輯就是Visual Basic或是其他程式語言的程式碼,用來控制網頁的邏輯運作。

這兩個部分可以依照您的需求,合在一起放在同一個檔案內,稱為「單一檔案模式」,也可以分開放置在不同檔案,稱為「程式碼後置模式」(Code-Behind);



雖然程式碼後置模式將程式分開成為兩個檔案,但是ASP.NET載入該程式時,仍然會自動將兩個檔案合併執行。

兩種模式的比較

一般來說,單一檔案模式的優點如下:
1.如果程式碼不多,放置於單一檔案內,對於學習、撰寫與維護較為方便。
2.因為只有一個檔案,所以容易部署至伺服器,傳送給其他人的時候也較為方便。
3.只有單一檔案,所以需要更改名稱時直接更改即可。若是程式碼後置模式,更改aspx.cs檔案的名稱之後,還必須開啟aspx檔案修改CodeFile屬性,所以比較麻煩。

而下面則是程式碼後置模式的優點:
1.將視覺與程式邏輯分開之後,美工與程式設計人員便能獨立作業,可以各自修改檔案,不會互相影響。
2.因為程式羅輯分開為另一個檔案,所以可以方便地讓多個網頁共用同一個程式邏輯檔案。

兩種模式各有其優缺點,您可以依照環境與需求,選擇合適的模式來設計。

閱讀全文...
就是愛分享
Visual Studio 2008是微軟公司為.NET程式設計者所提供的IDE軟體,其支援多種程式語言,而且具備統一的開發介面,不論開發桌面應用程式、ASP.NET網頁程式。XML Web Service或是行動裝置應用程式,都可以在相同的環境與介面下完成。

依照功能的不同,Visual Studio 2008分成許多版本,其中Visual Web Developer(簡稱VWD)便是特別為了開發ASP.NET網站所推出。

在VWD內可以使用C#與Visual Basic設計ASP.NET網頁,而且還隨附SQL Server Express資料庫伺服器,可以開發較為複雜、以資料庫為資料後端的網站。

網站種類

在VWD中開發ASP.NET網頁,必須先建立網站專案,一個專案便代表一個網站。VWD支援的網站類型可分為以下幾種:

HTTP、FTP:這2種網站都是指實際運作中的Web伺服器(通常都是IIS伺服器),在開發網頁的過程中,VWD會透過HTTP或FTP通訊協定存取伺服器上的網頁檔案,載入到VWD的工作環境中供我們進行開發,修改的結果也都會直接存回伺服器上。

檔案系統:顧名思義,這是將我們開發的網頁直接存於本機的資料夾中,不過VWD有一項特別的「虛擬網站」功能,可在電腦上啟動模擬的Web伺服器,以供ASP.NET網頁。此功能讓我們可在開發過程中,不必架設實際的Web伺服器,也可測試ASP.NET網頁在伺服器上執行的效果。由瀏覽器經由虛擬網站來瀏覽開發中的ASP.NET網頁時,即是模擬使用者實際經由網路存取網站伺服器網頁的情形。

剛建好的新網站,其中即會含有1個資料夾及3個檔案(展開右邊方案總管窗格中的加號,可看到另一個檔案)。這些資料夾和檔案雖暫時用不到,但還是先來認識一下:

App_Data:這個資料夾是用來存放ASP.NET所要用到的資料檔,可以是SQL Server的資料庫檔或XML檔案。

Default.aspx:aspx是預設的ASP.NET網頁副檔名;Default則是預設的首頁名稱。當我們在VWD中建立新的ASP.NET網頁時,預設也都是以Default為主檔名,並會依序加上數字編號,不過我們可自行設定新的檔案名稱。

Default.aspx.cs:按Default.aspx前的加號按鈕時才會看到,此為Default.aspx網頁的ASP.NET程式碼所在的檔案,副檔名為cs表示其為C#程式。此種將程式碼與網頁內容分開的方法,稱為程式碼後置(Code-Behined)。

web.config:這是ASP.NET的網站設定檔,當我們希望ASP.NET的行為與預設不同時,即需在web.config寫入新的設定值。

閱讀全文...
就是愛分享
無論使用C#或是VB.NET,當你要透過ADO.NET連接SQL Server資料庫的時候,必須指定連接字串,因此我們來看一下相關連線字串的彙總。

最簡單的連線字串,是以信任連線的方式連接 SQL Server 資料庫,字串如下:

Server=ServerAddress;Database=DataBaseName;Trusted_Connection=True;

ServerAddress是資料庫伺服器的名稱,DataBaseName則是所要連接的資料庫名稱,Trusted_Connection設為True,表示直接透過信任連線連接,因此不需要指定帳號密碼資料。

底下是非信任連線的狀況,其中的Trusted_Connection設定為flase,因此必須再指定ID與Password兩個屬性值給他,這兩個值分別代表開啟資料庫所需的帳號與密碼:

Server=ServerAddress;Database=DataBaseName;User ID=Username;Password=Password;Trusted_Connection=False;

除了上述的語法,你也可以利用以下的替代語法:

Data Source=ServerAddress;Initial Catalog=DataBaseName;Integrated Security=SSPI;
Data Source=ServerAddress;Initial Catalog=DataBaseName;User Id=myUsername;Password=myPassword;

「Integrated Security=SSPI」的意義與「Trusted_Connection=True」的相同,其他的幾個項目則對應至相同的屬性。

另外,你也可以透過指定 IP Address 的方式,連接逺端資料庫,字串如下,要特別注意的是,其中的Data Source除了IP位址,最後一個數字「1433」,是SQL Server的預設連接埠:

Data Source=192.168.100.100,1433;Network Library=DBMSSOCN;
Initial Catalog=DataBaseName;User ID=Username;Password=PasswordName;

如果你使用的是SQL Server Express版本,則連線字串是相同的,差別只在於Server名稱必須加上一個SQLEXPRESS ,如下式:

Server=ServerAddress\SQLEXPRESS ;Database=DataBaseName;Trusted_Connection=True;

閱讀全文...
就是愛分享
資料庫定義到char類型的欄位時,不知道大家是否會猶豫一下,到底選char、nchar、varchar、nvarchar、text、ntext中哪一種呢?結果很可能是兩種,一種是節儉人士的選擇:最好是用定長的,感覺比變長能省些空間,而且處理起來會快些,無法定長只好選用定長,並且將長度設置盡可能地小;另一種是則是覺得無所謂,儘量用可變類型的,長度儘量放大些。

鑒於現在硬體像蘿蔔一樣便宜的大好形勢,糾纏這樣的小問題實在是沒多大意義,不過如果不弄清它,總覺得對不起勞累過度的CPU和硬碟。

下面開始了(以下說明只針對SqlServer有效):

1、當使用非unicode時慎用以下這種查詢:
select f from t where f = N'xx'

原因:無法利用到索引,因為資料庫會將f先轉換到unicode再和N'xx'比較

2、char 和相同長度的varchar處理速度差不多(後面還有說明)

3、varchar的長度不會影響處理速度!!!(看後面解釋)

4、索引中列總長度最多支援總為900位元組,所以長度大於900的varchar、char和大於450的nvarchar,nchar將無法創建索引。

5、text、ntext上是無法創建索引的。

6、O/R Mapping中對應實體的屬性類型一般是以string居多,用char[]的非常少,所以如果按mapping的合理性來說,可變長度的類型更加吻合。

7、一般基礎資料表中的name在實際查詢中基本上全部是使用like '%xx%'這種方式,而這種方式是無法利用索引的,所以如果對於此種欄位,索引建了也白建。

8、其他一些像remark的欄位則是根本不需要查詢的,所以不需要索引。

9、varchar的存放和string是一樣原理的,即length {block}這種方式,所以varchar的長度和它實際佔用空間是無關的。

10、對於固定長度的欄位,是需要額外空間來存放NULL標識的,所以如果一個char欄位中出現非常多的NULL,那麼很不幸,你的佔用空間比沒有NULL的大(但這個大並不是大太多,因為NULL標識是用bit存放的,可是如果你一行中只有你一個NULL需要標識,那麼你就白白浪費1byte空間了,罪過罪過!),這時候,你可以使用特殊標識來存放,如:'NV'。

11、同上,所以對於這種NULL查詢,索引是無法生效的,假如你使用了NULL標識替代的話,那麼恭喜你,你可以利用到索引了。

12、char和varchar的比較成本是一樣的,現在關鍵就看它們的索引查找的成本了,因為查找策略都一樣,因此應該比較誰佔用空間小。在存放相同數量的字元情況下,如果數量小,那麼char佔用長度是小於varchar的,但如果數量稍大,則varchar完全可能小於char,而且要看實際填充數值的充實度,比如說varchar(3)和char(3),那麼理論上應該是char快了,但如果是char(10)和varchar(10),充實度只有30%的情況下,理論上就應該是varchar快了。因為varchar需要額外空間存放塊長度,所以只要length(1-fillfactor)大於這個存放空間(好像是2位元組),那麼它就會比相同長度的char快了。

13、nvarchar比varchar要慢上一些,而且對於非unicode字元它會佔用雙倍的空間,那麼這麼一種類型推出來是為什麼呢?對,就是為了國際化,對於unicode類型的資料,排序規則對它們是不起作用的,而非unicode字元在處理不同語言的資料時,必須指定排序規則才能正常工作,所以n類型就這麼一點好處。

總結陳詞:
1、如果資料量非常大,又能100%確定長度且保存只是ansi字元,那麼char。
2、能確定長度又不一定是ansi字元或者,那麼用nchar;
3、不確定長度,要查詢且希望利用索引的話,用nvarchar類型吧,將它們設到400;
4、不查詢的話沒什麼好說的,用nvarchar(4000)。
5、性格豪爽的可以只用3和4,偶爾用用1,畢竟這是一種額外說明,等於告訴別人說,我一定需要長度為X位元的數據。

閱讀全文...
就是愛分享
「.NET Framework類別函式庫」(.NET Framework Class Library)提供很多功能強大的類別,我們可以直接在C#程式使用這個類別函式庫來輕鬆擴充程式的功能。

.NET Framework類別函式庫是一個龐大且良好組織架構的函式庫,各種.NET Framework支援的程式語言都可以使用相同的.NET Framework類別函式庫,例如C#或Visual Basic 2005程式語言。

.NET Framework類別函式庫的類別架構是使用稱為「名稱空間」(Namespaces,也稱為命名空間)的階層類別架構,每一個名稱空間能夠擁有多個類別,如下圖所示:

上述圖例的System是最基礎的名稱空間,其下擁有基本資料型態的System.Int32(每一階層的名稱空間是使用「.」運算子連接)、System.Byte、System.Single和System.String等名稱空間。這些名稱空間的類別是對應C#語言的內建資料型態。換句話說,C#資料型態都擁有對應的.NET Framework類別物件。

System.Windows.Forms是表單控制項的父名稱空間,其下的名稱空間就是各種控制項的類別:System.IO是基本輸出與輸入和檔案處理的名稱空間。

閱讀全文...
就是愛分享
由於微軟希望將.NET做為未來開發所有不同類型專案的平台,也就是專案應用的底層。

在此一底層中,設計人員應常會看到Windows Form及Web Form等兩個名詞。這兩個名詞分別表示開發在Windows及Web中執行的應用程式,由於執行環境不同,故.NET為這兩種環境的介面,區分為Windows Form及Web Form。若以內容而言,Windows Form及Web Form提供的內容就是各種控制項。

換言之,Web Form就是以ASP.NET開發的網頁,在網頁內就只能使用各種Web Form提供的功能,也就是控制項。

若使用Visual Studio.NET,會在分別使用Windows應用程式及Web應用程式等不同專案時,自動顯示可使用的控制項。

所以若要在SDK輔助說明中尋找有關控制項的說明,請先了解型態,如.aspx網頁必須使用Web Form提供的控制項。

閱讀全文...
就是愛分享
什麼是.NET?一言以敝之,就是「可提供多種語言,進行開發的技術平台」,至於使用的語言種類、開發的應用系統在何處執行等,微軟都希望可做到多語言及多平台。換言之,不論開發人員擅長的語言為何、應用系統完成後的執行位置為何等,都可使用.NET進行開發,這就是.NET的目的。

.NET如何做到此點,首先由其內容觀之,共包括如下四個組成:

Common Language Runtime(CLR):元件的開發過程中,它扮演著如同runtime的角色,執行測試。當元件在執行時,runtime負責管理記憶體的分配,啟動以及結束執行緒與程序,強制執行安全原則,並滿足所有元件與其他元件間可能具有的相依性。

.NET Framework Class Library:其內容是所有可重複使用的類別庫(或程式庫),並可與CLR緊密結合。它包含了數個命名空間(Namespace),而各Namespace之下就是可用的程式庫。

ADO.NET:就是名為System.Data的Namespace,其內就是ADO.NET所有物件模組的類別,目的是「在記憶體內處理資料庫」。

ASP.NET:ASP.NET是一個建構在CLR上,可供撰寫程式的平台,並可在伺服器上使用,以建構強力的Web應用程式。重點是Web Forms(即.aspx檔案),提供簡易的設計方式,可供建置動態的Web使用者介面。並提供建構分散式Web基礎應用程式所需的建構區塊,即以XML資料為傳輸標準的Web Services。

以上就是.NET的四項組成,其中CLR是.NET引擎的作業,與設計人員及使用者較無直接關係,後三者皆會在設計時,依不同目的而予以引用。

閱讀全文...
就是愛分享
C#語言是一種物件導向程式語言,其精神是物件,但支援物件的程式語言並不一定就是一種物件導向程式語言,它可能只是物件基礎程式語言(Object-based Languages),只提供資料抽象化和物件觀念。例如:Visual Basic 6.0。

物件的基本觀念

物件可以視為提供特定功能的元件或黑盒子,我們不用考慮元件內部詳細的資料或程式碼,只需知道物件提供哪些方法和屬性,以及如何使用它,一樣可以使用物件來建立所需的應用程式。

事實上,物件導向程式設計的目的就是讓設計者自行定義物件或擴充存在的物件功能,簡單的說,就是使用物件基礎程式設計來建立應用程式。

物件

物件(objects)是物件導向程式的基礎,簡單的說,物件是資料(Data)和包含處理此資料程式碼(稱為方法Method)的綜合體。

「類別」(Class)是定義物件內容的模子,透過模子可以建立屬於同一個類別的多個物件,例如:Label控制項是一個類別,當我們在表單上新增多個標籤控制項後,就是使用類別建立名為label1和label2等多個物件。

當程式碼使用類別建立物件後,我們並不用考慮物件內部的處理方式,只需知道它提供的屬性和方法與如何使用它,就可以使用這些物件來建立程式。

事實上,Windows應用程式的組成元件都是物件,在表單中的控制項,例如:文字方塊、清單方塊、標籤和按鈕等都是一個個物件。

屬性

物件的屬性(Properties)是物件的性質和狀態,例如:文字方塊控制項提供MaxLength屬性設定輸入字串的長度,標籤物件的BackColor可以指定背景色彩,如下所示:

label1.BackColor;
textBox1.MaxLength;

PS:句點「‧」是物件運算子,在程式碼中的物件是使用句點來存取物件屬性值和呼叫物件的方法。

方法

方法(Methods)是物件的處理函數,也就是執行物件提供的功能。例如:Graphics繪圖物件g提供方法可以繪出字串和畫線,如下所示:

g.DrawString();
g.DrawLine();

上述程式碼使用Graphics物件的方法。事實上,我們並不需要知道繪出字串和畫線的程式碼是什麼?只需知道物件提供的方法需要如何用,指定參數後,就可以繪出指定的圖形。

事件

事件(Events)本身是一個物件,它代表使用者按下滑鼠按鍵或鍵盤按鍵等操作後,所觸發的動作進而造成控制項狀態的改變,當這些改變發生時,就會觸發對應的事件物件。我們可以針對事件來作進一步處理。

物件可以建立事件處理程序來處理事件,這種以事件設計程式的方式,稱為「事件驅動程式設計」(Event-driven Programming)。例如:Button控制項button1觸發的Click事件,其事件處理程序如下所示:

private void button1_Click(object sender, EventArgs e)
{
... ...
}

上述事件處理程序擁有2個參數。其說明如下所示:
‧object物件:觸發事件的來源物件,也就是哪一個物件產生此事件。
‧Eventargs物件:事件物件本身,包含事件的相關資訊。

閱讀全文...
就是愛分享
程式語言的「開發環境」(Development Environment)是一組工具程式用來幫助程式設計者建立、編譯和維護程式語言建立的應用程式。

目前大部分高階程式語言都擁有整合開發環境,稱為「IDE」(Integrated Development Environment),只需再同一個應用程式就可以編輯、編譯和執行特定語言的應用程式。

微軟的Visual Studio

微軟C#語言的整合開發環境是Visual Studio,它是微軟公司開發的整合開發環境,能夠再同一套應用程式編輯、編譯、除錯和測試C#等.NET語言的應用程式。

Visual Studio 2005/2008是一套支援.NET Framework的整合開發環境,可以使用C#、Visual basic、C++和J#等語言來建立Windows、ASP.NET、主控台和Web Services等各種不同的應用程式。

Visual Studio整合開發環境

在Visual Studio 2005/2008整合開發環境建立的應用程式是在.NET Framework的CLR平台上執行,如下圖所示:



上述圖例在Windows作業系統安裝.NET Framework 2.0/3.5版後,就可以使用Visual Studio 2005/2008,以.NET語言來建立WindowsForms、ASP.NET、ADO.NET和XML應用程式。

Visual Studio 2005/2008是.NET平台的整合開發環境,提供Express版本讓初學者和學生能夠快速建立.NET應用程式。

閱讀全文...
就是愛分享
微軟C#語言是一種支援.NET Framework平台的程式語言,它可以說是C/C++語言的進化版本,一種由微軟公司所獨立發展的物件導向程式語言。

.NET Framework的基礎

.NET Framework是微軟新世代的程式開發平台,它是由CLR(Common Language Runtime)和.NET Framework類別所組成。我們可以使用.NET Framework支援的程式語言,例如C#、Visual Basic和C++等來建立.NET應用程式。

.NET Framework程式檔案在使用.NET編譯程式編譯時,並不是直接編譯成CPU的機器語言,而是一種中間程式語言稱為「MSIL」(Microsoft Intermediate Language)。等到執行程式時,CLR使用「JIT」(Just In Time)編譯程式將MSIL轉換成機器語言來執行,其架構如下圖所示:



上述圖例不論使用C#、Visual Basic或C++語言建立的原始程式碼,在編譯成MSIL後,就可以在不同Windows作業系統安裝CLR,撰寫的程式碼就可以跨平台在不同Windows作業系統上來執行。

.NET Framework類別函式庫是一個龐大的類別函式庫,只需支援.NET Framework的程式語言,都可以使用此類別函式庫的類別和方法。

微軟的C#語言

C#語言是一種簡單的程式語言,因為它刪除Java和C++語言的複雜語法和一些常造成程式設計困擾的缺點,例如:指標、含括(Include)、巨集、範本(Templates)、多重繼承和虛擬繼承等,再加上大部分語法都源於C和C++語言,也和Java語言十分相似。

C#語言也是一種非常現代化的程式語言,因為C#語言支援現代程式語言所擁有的例外處理(Exception Handling)、垃圾收集(Garbage Collection)、擴充資料型態和程式碼安全。而且C#語言是一種真正的物件導向程式語言,完全支援對策、繼承和多型的物件導向程式語言特性。

閱讀全文...
就是愛分享
Facebook成長如此迅速,很大的原因在於它提供了源源不絕的應用程式與小遊戲,讓人身不由己地黏在上面無法自拔。對開發者來說,Facebook也提供了十分親和的開發環境,能夠快速上手。只要具備基本程式能力,照著後面所介紹的步驟就能建立第一個Facebook應用程式!

事前準備
1.PHP開發環境
2.應用程式的Hosting環境

Facebook API目前有三個Libraries可以用來開發Facebook應用程式:PHP、Javascript、AS3。如果開發純html的應用程式就要用Javascript跟PHP,即使是AS3開發,可能還是會遇到需要server端跟Facebook溝通的情形,所以PHP Libraries可能也少不了。

AS3的Libraries叫做ActionScript 3.0 Client Library for Facebook Platform API。

建立新的Fackbook應用程式

1.開啟Facebook的開發者網頁http://www.facebook.com/developers/,登入後點選右上角的[Set Up New Application],建立一個新的Facebook應用程式。



2.替應用程式取一個名稱,同意使用條款後[儲存變更]。



3.成功建立新的應用程式後,您會取得一組獨一無二的API金鑰與Application Secret。找到並點選下方的example code超連結,稍後我們將使用這段程式碼為例,建立第一個應用程式。





4.複製範例程式碼並存檔為index.php。其中,特別注意下列兩行程式碼是否為自己的API金鑰與Application Secret:

$appapikey = 'YOUR APP API KEY';
$appsecret = 'YOUR APP SECRET';



5.下載並解壓縮官方的PHP client 函式庫後,將index.php放到[your_location]\facebook-platform\php目錄中,如下圖:



註:熟悉PHP語法的開發者也可以修改require_once,自行更改目錄結構。

6.將整個php資料夾deploy至您的伺服器。此時,若您在瀏覽器中直接開啟網址[your_hosting_location]/index.php,出現的竟然不是程式內容,而是導向Facebook並出現開發中的訊息,就表示您已正確地完成了上面的步驟,剩下幾個簡單設定,就可以完成我們的第一個Facebook應用程式了!

我們已經在伺服器上deploy了範例程式,接下來的步驟就是讓Facebook知道這支程式的所在位置。

編輯應用程式設定

1.在[我的應用程式] –> [編輯設定]頁面左邊欄,點選[畫布(Canvas)]。找到並輸入畫布頁面網址以及Canvas Callback URL兩欄。這裡要注意的是,畫布頁面網址欄位只能輸入小寫英文字母、'_'及'-'字元,不接受數字。Canvas Callback URL則是您程式所在位置的網址,例如:http://[yourdomain]/index.php,完成後[儲存變更]。



2.若設定正確,則出現成功訊息:



3.再次連結應用程式所在的網址,映入眼簾的是如此熟悉的畫面:



大功告成!

用力地按下[同意]後,畫面上出現了我們的第一支範例程式執行結果 ─ 列出使用者的25個朋友id。當然,Facebook應用程式的能耐可不僅止於此,更多的功能都寫在API裡,您可以在這個範例基礎上繼續補強並完成您的第一支Facebook應用程式。



雖然Facebook官方主要支援PHP版本的API,但對其他程式語言較拿手的開發者也可以到這裡尋找適合的非官方API。對Google App Engine情有獨鍾的開發者請使用支援Python的PyFacebook或其他Java APIs,經實做證明,GAE是可以拿來host Facebook應用程式的。另外提供一個實用的GAE小技巧:開發過程中,將[編輯設定]的Canvas Callback URL欄位中改為http://127.0.0.1:8080,直接連至自己的本機測試;待程式完成後再改為正確的網址即可,如此可大幅縮短開發時間喔!

閱讀全文...
就是愛分享
內容管理系統(Content Management System,簡稱CMS),組織和協助共同合作的內容的結果,是指用於管理及方便數字內容的系統。

內容管理系統的定義可以很狹窄,通常是指門戶或商業網站的發布和管理系統;定義也可以很寬泛,個人網站系統也可歸入其中。Wiki也是一種內容管理系統,Blog也算是一種內容管理系統。

現在流行的開源CMS系統有:

Dede CMS,免費、開源(非GPL,無版權)
HB cms,免費、開源
Joomla,免費、開源
Drupal,免費、開源
Xoops,免費、開源
Phpnuke,免費、開源

其中Xoops是一個功能強大的架站系統,而且是免費的軟體,再加上是目前全球最多人使用的網站系統,所以外掛模組眾多,你想的到都有,如常見的「新聞」、「常見問答集」、「檔案下載」、「投票機」等等種類繁多不勝枚舉。

另外Joomla!可以在Linux、Windows、MacOSX等各種不同的平台上執行。目前是由Open Source Matters (www.opensourcematters.org)這個開放源碼組織進行開發與支援,這個組織的成員來自全世界各地,小組成員約有150人,包含了開發者、設計者、系統管理者、文件撰寫者,以及超過9萬名(2007.3)的參與會員 。

以上兩者都是使用PHP程式語言加上MySQL資料庫所開發的軟體系統。

閱讀全文...