轉載CSDN
目錄
l 摘要
l 一般安裝程式的製作
l 在安裝程式中部署SQL Server資料庫
1. 通過調用osql來執行資料庫指令碼檔案
2. 通過把指令檔作為資源檔載入
3. 通過sp_attach_db來建立資料庫
l 總結
摘要
一個項目完成之後,安裝程式的製作是一個必要的過程。如果需要部署資料庫,則使安裝程度的製作變得比較麻煩。使用visual studio.net可以非常方便的製作應用程式以及部署程式中需要的資料庫。本文介紹了如何使用visual studio.net製作安裝程式,以及如何在安裝程式中部署資料庫.本文假設您對ADO.net比較熟悉。
1.一般安裝程式的製作
Visual studio.net 提供了很強大並且非常便捷的安裝程式製作功能。一般的安裝程式製作可以參考如下步驟:
(1) 在Visual studio.net裡面建立一個安裝項目(針對一般windows應用程式)或者web安裝項目(針對基於web的應用程式),比如叫SetupFace.
(2) 在解決方案裡面的項目中的SetupFace上單擊右鍵,可以看到如下的視圖:
圖1 安裝程式中的視圖
視圖中出現的項目就是在製作安裝程式中需要涉及到的項目。
a. 檔案系統部分提供了如何把需要安裝到目標機可執行程式以及運行時需要的dll等打包到安裝程式中,同時也提供了如何在目標機的案頭上和程式菜單中建立捷徑以及檔案夾等。
b. 註冊表部分提供了如何在目標機的註冊表中添加相關的索引值。
c. 檔案類型提供了在目標機上建立一個檔案類型與應用程式的關聯,並可以為註冊的檔案類型增加相關的右鍵菜單功能。比如註冊一個.pdf的檔案,使用你自己的程式開啟。
d. 使用者介面提供了在安裝過程中的介面,也可以根據自己的需要建立如讀我檔案,註冊碼校正等等功能。建立項目時已經提供了一些基本的畫面。
e. 自訂動作部分主要提供了如何在安裝的不同階段中完成不同的工作。比如在安裝過程中建立資料庫,在卸載過程中刪除資料庫等。
f. 啟動條件部分提供了在安裝您的應用程式前需要完成什麼條件。Visual studio.net提供了可以在使用者電腦上搜尋啟動條件的功能。比如要求某個程式已經安裝,可以通過搜尋檔案系統或則搜尋註冊表來完成。
(3) 在視圖中選擇檔案系統,將看到如下畫面:
圖2 檔案系統介面
如果您需要完成一個簡單的安裝程式,在添加中選擇檔案,選擇您以及編譯完成的應用程式,Visual studio.net會自動引入該應用程式所需要的dll(只針對Visual studio.net開發的應用程式,其他的程式沒有試過),然後根據您的需要在使用者的”程式”菜單和使用者案頭建立捷徑,然後把捷徑的指向選擇為在應用程式檔案夾中匯入的應用程式即可。
(4) 最後,可以直接編譯該項目,安裝程式的製作即可完成。
如果需要更多的控制和修改安裝程式過程中的內容,可以根據第(2)步中提到的不同視圖進行編輯即可。如果需要製作web項目的安裝程式,在建立項目時選擇建立Web項目即可, 其他部分大同小異。也可以直接參考MSDN的如下連結:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxconATourOfVisualStudio.asp
2.在安裝程式中部署SQL Server資料庫
通過上面的介紹,一般應用程式的製作非常容易,基本上就是把您的應用程式拖入該安裝程式的過程。如果您的應用程式的運行需要資料庫的支援(如SQL Server),問題就變得比較複雜一點。
主要有如下幾個方面的問題:
(1) 如何在獲得安裝畫面的值,比如獲得使用者輸入的使用者名稱密碼。
(2) 如何設計一個程式來與資料庫伺服器進行互動,建立新的資料庫。
如何在獲得安裝程式中的值,可以參看如下連結,這裡我們不做太多的介紹。
<http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxconATourOfVisualStudio.asp>
這個例子示範了如何在使用者介面自訂對話方塊要求使用者輸入資訊,然後在自訂動作中把獲得的值通過CustomActionData來傳遞給自訂動作中的主輸出,最後在主輸出相面裡面的程式裡面來建立一個資料庫。
通過對上面的例子的理解,基本上可以按照這個方式來建立一個資料庫,它通過ADO.net執行SQL語句來完成建立資料庫的。但是,如果有大量的資料表以及預存程序需要建立,通過這個的方式非常麻煩。可不可以通過直接在SQL Server中建立相應的資料庫產生指令檔來直接完成呢?
我們有3個解決方案:
(1) 通過調用osql來執行資料庫指令碼檔案
(2) 通過把相應的指令檔作為資源檔嵌入到項目中,然後通過ADO.net來執行
(3) 通過調用SQL Server的sp_attach_db的預存程序來直接附加資料庫。
2.1 通過調用osql來執行資料庫指令碼檔案
從上面的例子我們已經知道了如何傳遞值,那麼我們只要在專案檔中程式段中執行osql即可。
這裡有一個問題就是從什麼地方找到資料庫的指令檔。我們可以把指令檔放到檔案系統中,直接安裝到使用者機器上,並可以通過如下方法獲得到該檔案的位置。
Assembly asm=Assembly.GetExecutingAssembly();
String setuppath=asm.Location;
這樣我們就可以知道指令檔的位置了,下面的檔案就是如何啟動osql程式了。我們可以通過如下的程式碼片段來完成:
Process sqlprocess=new Process(); sqlprocess.StartInfo.FileName="osql.exe";
sqlprocess.StartInfo.Arguments=String.Format("-U {0} -P {1} -S {2} -i {3}",this.uid,this.pwd,this.serverip,this.spath); //uid 為使用者名稱,pwd為密碼,serverip為目標伺服器的ip,spath為資料庫指令碼所在的路徑
sqlprocess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
sqlprocess.Start();
sqlprocess.WaitForExit(); //等待程式執行
sqlprocess.Close();
從上面可以知道,該方法必須要求安裝程式的客戶機以及安裝好了SQL Server才能使用(osql為安裝了SQL Server後提供的命令列下的程式).同時在實際的測試過程中,我們發現如果對於使用者在安裝程式是選擇帶有空格的路徑,如;C:\program files\yourappliaction\時,安裝失敗。這個是一個比較嚴重的問題。
2.2 通過把指令檔作為資源檔載入
從前面的討論中我們可以看到,直接使用ADO.net執行時比較麻煩,需要一句句執行,如果使用指令碼,資料庫中產生的指令碼中有”GO”命令,在ADO.net中執行時會出問題。因此,根據對資料庫安裝指令碼的分析,我們可以採用如下替代方案。
在資料庫的安裝過程中,無外乎如下幾個部分:
(1) 建立資料庫
(2) 建立表
(3) 建立試圖或者預存程序
並且這三個部分是有先後順序的,順序不能顛倒,但是每個過程中沒有循序關聯性。在測試過程中我們發現可以在一條語句中建立多個表或者多個預存程序。也就是說,我們可以把執行過程按照上面的順序執行就行了。並且我們把資料庫指令碼作為資源檔嵌入,只要調入執行就可以了,這樣就達到了簡化建立一條條命令的過程。
獲得資源檔代碼如下:
Assembly Asm=Assembly.GetExecutingAssembly();
StreamReader str;
str=new StreamReader(Asm.GetManifestResourceStream(Asm.GetName().Name+"."+filename))// filename為你需要摘入的資源檔。作為資源檔時,只要把檔案匯入到您的項目中,並且把產生操作改為內嵌資源即可。
這裡我們是直接獲得了該檔案的檔案流,因此直接把該流中的內容讀入即可。
我們可以通過如下操作完成:
(1) 建立一個資料庫的連結,建立資料庫. 比如: connectionstring=”server=127.0.0.1,uid=sa,pwd=pwd”;
(2) 重新建立一個資料庫連結,該連結指向建立的資料庫。connectionstring=”server=127.0.0.1,uid=sa,pwd=pwd,database=yourdatabase”;
(3) 在新的連結中執行建立資料表和資料存放區過程的代碼即可。
需要注意的是:不要在你的指令碼中有GO命名,其他命令都可以直接執行。
該方法的好處在於: 可以不要求安裝的目標機上有SQL Server,也不存在因為檔案路徑中有空格的問題而倒是安裝程式失敗。當然,如果您的資料庫為Oracle或者DB2等,您也可以採用類似的方法來實現。
2.3 通過sp_attach_db來建立資料庫
通過上面的討論我們已經很清楚如何安裝資料庫了。在安裝資料庫的過程中,我們除了可以通過資料庫指令碼來建立資料庫之外,我們也可以通過SQL Server的系統預存程序sp_attach_db來附加資料庫。
這裡我們解決兩個問題即可:
(1) 確定資料庫檔案(.mdf和.ldf)的位置。
(2) 執行預存程序。
對於問題1我們可以借鑒安裝資料的第一種方法,即把.mdf和.ldf通過檔案系統安裝到目標機上,然後通過
Assembly asm=Assembly.GetExecutingAssembly();
String setuppath=asm.Location;
獲得檔案的路徑。
最後通過調用sp_attach_db 加上相應的參數即可完成。
需要注意的是: 該方法也只能針對資料庫安裝在原生情況下進行安裝。
總結
本文通過介紹了三種不同的方法來在安裝程式是如何安裝資料庫,同時也分析了不同的方法的優劣之處,使用者可以根據自己的實際需要來選擇安裝方法。同時,通過該方法的提出,使用者也可以完成在安裝程式是對資料庫的配置工作。