在.net安裝程序部署SQL Server數據庫
2024-07-10 13:03:25
供稿:網友
目錄
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 加上相應的參數即可完成。
需要注意的是: 該方法也只能針對數據庫安裝在本機的情況下進行安裝。
總結
本文通過介紹了三種不同的方法來在安裝程序是如何安裝數據庫,同時也分析了不同的方法的優劣之處,用戶可以根據自己的實際需要來選擇安裝方法。同時,通過該方法的提出,用戶也可以完成在安裝程序是對數據庫的配置工作。