2008年11月16日 星期日

DynamicProperties動態屬性設定1-2

RunPC 109期:在.Net上保存應用程式設定(一)
二、.Net動態屬性設定方式

當各位讀者看完以上.Net之前保存應用程式各種設定的方式,是否可以意識到保存應用程式設定檔於真實系統中的重要性和在佈署系統上的方便性,可將應用程式的相關設定參數展期至系統佈署時期才做,增加系統設定上的彈性,而非一定要在開發時期將系統相關參數綁死在程式碼內。
如果您接觸過.Net一段時日,您是否發覺到XML已被廣泛的應用在.Net上,這就是我們常聽到的.Net是架構在XML的基礎上,不論是ADO.Net內的DataSet還是Web Service的Soap、WSDL甚至於此篇文章所提及的設定檔案部分亦是XML的格式,但它的副檔名為config而非正常情況下的xml,在視窗應用程式它的設定檔案預設檔名為app.config;而Web應用程式它的設定檔預設檔名為web.config,在VS.Net中建立Web應用程式專案時,web設定檔(web.config)即隨專案而被建立,而VS.Net 中建立視窗(Windows)應用程式專案時,app.config卻沒有隨專案而被建立,而要等到在屬性視窗中設定DynamicProperties的時間點上才會被建立,這是二設定檔建立時間上的差異點。
接下來讓我們開始探索.Net上的動態屬性設定,在此篇文章中將為各位介紹(1)如何設定預設的動態屬性(DynamicProperties)。(2)如何在專案中設定非預設的動態屬性設定(自訂的動態屬性設定)。(3)如何在執行時期保留動態屬性值。

讓我們舉一個動態設定資料庫連結參數的例子,如何利用.Net所提供的DynamicProperties將資料庫連結參數的設定延展至系統佈署時期,接下來就讓我們來看它的操作步驟:
(1) 設定預設的動態屬性步驟:
操作步驟前我們先假設:開發電腦上所連結的資料庫所在電腦名稱為DevPc,佈署後要連結的資料庫電腦名稱為RunPc,測試資料庫為Pubs;測試開發時期連結到DevPc這台電腦上的Pubs資料庫,而安裝佈署後連結至正式使用的電腦名稱為RunPc上的資料庫Pubs。
1. 建立新專案:選擇您所喜好的語言,VB.Net或VC#…等,在此以VB.Net為例,選Windows Application專案,將此專案命名為ProDynamicPropers。
2. 設定資料連結:利用『Ctrl+Alt+S』叫出Server Explorer,點選Connect to Database圖( ),則系統會出現資料連結對話盒,於伺服器名稱上打上DevPc(開發時期所用的測試資料庫機器)後輸入連至該資料庫的帳號、密碼,勾選允許儲存密碼,再選Pubs資料庫後按確定,到現在為止只是在VS.Net IDE上建立一個資料連結(DevPc.Pubs.dbo),再來讓我們用簡單而快速的拖曳方式來建構應用程式資料連結物件部分。
3. 建立應用程式資料連結相關物件:展開Data Connections下DevPc.Pubs.dbo資料連結,再展開其下的Tables後將authors資料表拖曳至Form1表單上,系統會自動建立SqlConnection1、SqlDataAdapter1這兩個物件,選SqlDataAdapter1物件按右鍵點Generate Dataset,出現Generate Dataset對話盒後按OK,產生DataSet11物件。
註:SqlConnection1物件是應用程式與MS SQL資料庫連結的物件;SqlDataAdapter1物件是應用程式透過SQL命令經由SqlConnection1物件對MS SQL資料庫進行操作;而DataSet11物件是一分在類似在記憶中的資料庫且是離線的,它可來自不同的資料庫或其它實體檔案;對於.Net上詳細的操控資料的方式可參考相關ADO.Net的書籍。
4. 建立資料呈現介面:利用『Ctrl+Alt+X』快速鍵叫出Toolbox,點選Windows Forms頁籤,拖曳DataGrid控制項 至Form1上,雙按Form1表單進入程式碼視窗或直接點選Solution Explorer上的View Code按鈕,於Form1_Load事件中輸入以下程式碼:
Me.SqlDataAdapter1.Fill(DataSet11, "Authors")
Me.DataGrid1.DataSource = DataSet11.Tables("Authors").DefaultView
透過SqlDataAdapter1的Fill方法,從MS SQL資料庫中取回資料放到DataSet11離線資料庫中,且命名為"Authors"的DataTable;利用DataGrid1來呈現資料而它的來源正是上面DataSet11內"Authors"的DataTable。按F5執行資料庫中的資料會於DataGrid1中呈現。
5. 觀察動態屬性設定前之連結參數設定處:於程式碼視窗中展開 ”Windows Form Designer generated code”,您可以在InitializeComponent程序中找到底下這段程式碼:
Me.SqlConnection1.ConnectionString = "data source= DevPc;initial catalog=pubs;password=1234;persist security info=T" & _
"rue;user id=sa;workstation id=DevPc;packet size=4096"
由此可知目前程式碼與資料庫連結參數是綁在一起的,每次安裝前就得改這部分的連結碼,再次編譯方可正確的佈署到正式的平台上工作。
6. 建立動態屬性:點選SqlConnection1物件,按F4叫出屬性視窗,展開DynamicProperties選項,選擇ConnectionString之ellipsis按鈕( ),勾選[Map Property to a key in configuration file]按OK,此處的Key是存在app.config的Key值除非特殊需求否則不建議修改,它的命名規則為『物件名.屬性名』。
注意:此時app.config才被建立。
7. 觀察建立完動態屬性後的差異:
a、屬性視窗中被設定為動態屬性之屬性會出現 小圖示見圖四,左邊還未建立ConnectionString的DynamicProperties而右邊已建立ConnectionString的DynamicProperties。



(圖一)VB6內設計時期內設定命令列引數

(圖二)VS.NET內設計時期設定命令列引數

(圖三)佈署時期設定引數



b、解析設定檔(app.config)物件的建立:
Dim configurationAppSettings As System.Configuration.AppSettingsReader = New System.Configuration.AppSettingsReader()
AppSettingsReader類別是.Net內建用來解析設定檔的類別,位於System.Configuration名稱空間之下,所建立解析物件configurationAppSettings之GetValue方法可用來傳入app.config 檔appSettings內add元素的key值來取得該value值。
c、連結參數的改變:
Me.SqlConnection1.ConnectionString = CType(configurationAppSettings.GetValue("SqlConnection1.ConnectionString", GetType(System.String)), String)
SqlConnection1.ConnectionString:為6、Dynamic Property對話盒中的Key也是app.config內appSettings下的其中之一Key值,而後的GetType(System.String)參數是代表"SqlConnection1.ConnectionString" 鍵值所取回的資料型態是屬字串。


8. 模擬應用程式連結測試資料庫(DevPc)改為連結至正式資料庫(RunPc):將app.config內key為SqlConnection1.ConnectionString之data source=DevPc改為data source=RunPc(前題假設資料庫名稱同為Pubs,而帳號、密碼不變),按F5執行,觀查是否已抓取正式資料庫之資料。
9. 佈署上設定檔的差異:在.Net上只要利用XCopy即可佈署所開發的系統,現在將該系統的執行檔(ProDynamicPropers.exe)與設定檔(app.config)複製到另一台電腦同一個目錄後,檢查設定檔案(app.config)的連結設定,正確無誤後執行,但卻會出現如下圖五的錯誤,那是因為系統真正參考到的設定檔案並非app.config檔案而是在bin資料夾下的ProDynamicPropers.exe.config設定檔,是故將app.config檔名改為ProDynamicPropers.exe.config即可正確運作。
註:在VS.Net IDE環境下每次執行時,會將bin資料夾內的ProDynamicPropers.exe.config的內容改成app.config的內容,而該執行檔案也是參考該資料夾下的『執行檔名.exe.config』。


(圖五)


至此我們已經完成預設的動態屬性設定操作步驟,而且在動態屬性部分還沒寫一行程式碼,完全利用VS.Net IDE自動設定的功能來完成,讀者是否體驗到用VS.Net來開發系統就是這麼簡單呢?接下來讓我們來探索非在DynamicProperties下所提供的動態屬性設定方式。

沒有留言:

加入書籤: MyShare HemiDemi Baidu Google Bookmarks Yahoo! My Web PChome Del.icio.us Digg technorati furludn bookmark 其他更多書籤

BOOKS:New and Upcoming