明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

在.net安裝程序部署SQL Server數(shù)據(jù)庫

[摘要]目錄l 摘要l 一般安裝程序的制作l 在安裝程序中部署SQL Server數(shù)據(jù)庫1. 通過調(diào)用osql來執(zhí)行數(shù)據(jù)庫腳本文件2. 通過把腳本文件作為資源文件載入3. 通過sp_attach_db來創(chuàng)建數(shù)據(jù)庫l 總結(jié)摘要一個項目完成之后,安裝程序的制作是一個必要的過程。如果需要部署數(shù)據(jù)庫,則使安裝程度...
目錄

l 摘要
l 一般安裝程序的制作
l 在安裝程序中部署SQL Server數(shù)據(jù)庫
1. 通過調(diào)用osql來執(zhí)行數(shù)據(jù)庫腳本文件
2. 通過把腳本文件作為資源文件載入
3. 通過sp_attach_db來創(chuàng)建數(shù)據(jù)庫
l 總結(jié)

摘要
一個項目完成之后,安裝程序的制作是一個必要的過程。如果需要部署數(shù)據(jù)庫,則使安裝程度的制作變得比較麻煩。使用visual studio.net可以非常方便的制作應(yīng)用程序以及部署程序中需要的數(shù)據(jù)庫。本文介紹了如何使用visual studio.net制作安裝程序,以及如何在安裝程序中部署數(shù)據(jù)庫.本文假設(shè)您對ADO.net比較熟悉。

1.一般安裝程序的制作

Visual studio.net 提供了很強(qiáng)大并且非常便捷的安裝程序制作功能。一般的安裝程序制作可以參考如下步驟:
(1) 在Visual studio.net里面新建一個安裝項目(針對一般windows應(yīng)用程序)或者web安裝項目(針對基于web的應(yīng)用程序),比如叫SetupFace.
(2) 在解決方案里面的項目中的SetupFace上單擊右鍵,可以看到如下的視圖:

圖1 安裝程序中的視圖
視圖中出現(xiàn)的項目就是在制作安裝程序中需要涉及到的項目。
a. 文件系統(tǒng)部分提供了如何把需要安裝到目標(biāo)機(jī)可執(zhí)行程序以及運行時需要的dll等打包到安裝程序中,同時也提供了如何在目標(biāo)機(jī)的桌面上和程序菜單中創(chuàng)建快捷方式以及文件夾等。
b. 注冊表部分提供了如何在目標(biāo)機(jī)的注冊表中添加相關(guān)的鍵值。
c. 文件類型提供了在目標(biāo)機(jī)上創(chuàng)建一個文件類型與應(yīng)用程序的關(guān)聯(lián),并可以為注冊的文件類型增加相關(guān)的右鍵菜單功能。比如注冊一個.pdf的文件,使用你自己的程序打開。
d. 用戶界面提供了在安裝過程中的界面,也可以根據(jù)自己的需要創(chuàng)建如自述文件,注冊碼校驗等等功能。創(chuàng)建項目時已經(jīng)提供了一些基本的畫面。
e. 自定義操作部分主要提供了如何在安裝的不同階段中完成不同的工作。比如在安裝過程中創(chuàng)建數(shù)據(jù)庫,在卸載過程中刪除數(shù)據(jù)庫等。
f. 啟動條件部分提供了在安裝您的應(yīng)用程序前需要完成什么條件。Visual studio.net提供了可以在用戶計算機(jī)上搜索啟動條件的功能。比如要求某個程序已經(jīng)安裝,可以通過搜索文件系統(tǒng)或則搜索注冊表來完成。
(3) 在視圖中選擇文件系統(tǒng),將看到如下畫面:

圖2 文件系統(tǒng)界面
如果您需要完成一個簡單的安裝程序,在添加中選擇文件,選擇您以及編譯完成的應(yīng)用程序,Visual studio.net會自動引入該應(yīng)用程序所需要的dll(只針對Visual studio.net開發(fā)的應(yīng)用程序,其他的程序沒有試過),然后根據(jù)您的需要在用戶的”程序”菜單和用戶桌面創(chuàng)建快捷方式,然后把快捷方式的指向選擇為在應(yīng)用程序文件夾中導(dǎo)入的應(yīng)用程序即可。
(4) 最后,可以直接編譯該項目,安裝程序的制作即可完成。
如果需要更多的控制和修改安裝程序過程中的內(nèi)容,可以根據(jù)第(2)步中提到的不同視圖進(jìn)行編輯即可。如果需要制作web項目的安裝程序,在創(chuàng)建項目時選擇創(chuàng)建Web項目即可, 其他部分大同小異。也可以直接參考MSDN的如下鏈接:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxconATourOfVisualStudio.asp

2.在安裝程序中部署SQL Server數(shù)據(jù)庫

通過上面的介紹,一般應(yīng)用程序的制作非常容易,基本上就是把您的應(yīng)用程序拖入該安裝程序的過程。如果您的應(yīng)用程序的運行需要數(shù)據(jù)庫的支持(如SQL Server),問題就變得比較復(fù)雜一點。
主要有如下幾個方面的問題:
(1) 如何在獲得安裝畫面的值,比如獲得用戶輸入的用戶名密碼。
(2) 如何設(shè)計一個程序來與數(shù)據(jù)庫服務(wù)器進(jìn)行交互,創(chuàng)建新的數(shù)據(jù)庫。
如何在獲得安裝程序中的值,可以參看如下鏈接,這里我們不做太多的介紹。
<http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/html/vxconATourOfVisualStudio.asp>
這個例子演示了如何在用戶界面自定義對話框要求用戶輸入信息,然后在自定義操作中把獲得的值通過CustomActionData來傳遞給自定義操作中的主輸出,最后在主輸出相面里面的程序里面來創(chuàng)建一個數(shù)據(jù)庫。
通過對上面的例子的理解,基本上可以按照這個方式來創(chuàng)建一個數(shù)據(jù)庫,它通過ADO.net執(zhí)行SQL語句來完成創(chuàng)建數(shù)據(jù)庫的。但是,如果有大量的數(shù)據(jù)表以及存儲過程需要建立,通過這個的方式非常麻煩?刹豢梢酝ㄟ^直接在SQL Server中創(chuàng)建相應(yīng)的數(shù)據(jù)庫生成腳本文件來直接完成呢?
我們有3個解決方案:
(1) 通過調(diào)用osql來執(zhí)行數(shù)據(jù)庫腳本文件
(2) 通過把相應(yīng)的腳本文件作為資源文件嵌入到項目中,然后通過ADO.net來執(zhí)行
(3) 通過調(diào)用SQL Server的sp_attach_db的存儲過程來直接附加數(shù)據(jù)庫。

2.1 通過調(diào)用osql來執(zhí)行數(shù)據(jù)庫腳本文件

從上面的例子我們已經(jīng)知道了如何傳遞值,那么我們只要在項目文件中程序段中執(zhí)行osql即可。
這里有一個問題就是從什么地方找到數(shù)據(jù)庫的腳本文件。我們可以把腳本文件放到文件系統(tǒng)中,直接安裝到用戶機(jī)器上,并可以通過如下方法獲得到該文件的位置。
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為目標(biāo)服務(wù)器的ip,spath為數(shù)據(jù)庫腳本所在的路徑
sqlprocess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
sqlprocess.Start();
sqlprocess.WaitForExit(); //等待程序執(zhí)行
sqlprocess.Close();

從上面可以知道,該方法必須要求安裝程序的客戶機(jī)以及安裝好了SQL Server才能使用(osql為安裝了SQL Server后提供的命令行下的程序).同時在實際的測試過程中,我們發(fā)現(xiàn)如果對于用戶在安裝程序是選擇帶有空格的路徑,如;C:\program files\yourappliaction\時,安裝失敗。這個是一個比較嚴(yán)重的問題。

2.2 通過把腳本文件作為資源文件載入

從前面的討論中我們可以看到,直接使用ADO.net執(zhí)行時比較麻煩,需要一句句執(zhí)行,如果使用腳本,數(shù)據(jù)庫中生成的腳本中有”GO”命令,在ADO.net中執(zhí)行時會出問題。因此,根據(jù)對數(shù)據(jù)庫安裝腳本的分析,我們可以采用如下替代方案。
在數(shù)據(jù)庫的安裝過程中,無外乎如下幾個部分:
(1) 創(chuàng)建數(shù)據(jù)庫
(2) 創(chuàng)建表
(3) 創(chuàng)建試圖或者存儲過程
并且這三個部分是有先后順序的,順序不能顛倒,但是每個過程中沒有順序關(guān)系。在測試過程中我們發(fā)現(xiàn)可以在一條語句中創(chuàng)建多個表或者多個存儲過程。也就是說,我們可以把執(zhí)行過程按照上面的順序執(zhí)行就行了。并且我們把數(shù)據(jù)庫腳本作為資源文件嵌入,只要調(diào)入執(zhí)行就可以了,這樣就達(dá)到了簡化創(chuàng)建一條條命令的過程。
獲得資源文件代碼如下:
Assembly Asm=Assembly.GetExecutingAssembly();
StreamReader str;
str=new StreamReader(Asm.GetManifestResourceStream(Asm.GetName().Name+"."+filename))// filename為你需要摘入的資源文件。作為資源文件時,只要把文件導(dǎo)入到您的項目中,并且把生成操作改為嵌入的資源即可。
這里我們是直接獲得了該文件的文件流,因此直接把該流中的內(nèi)容讀入即可。
我們可以通過如下操作完成:
(1) 建立一個數(shù)據(jù)庫的鏈接,創(chuàng)建數(shù)據(jù)庫. 比如: connectionstring=”server=127.0.0.1,uid=sa,pwd=pwd”;
(2) 重新創(chuàng)建一個數(shù)據(jù)庫鏈接,該鏈接指向創(chuàng)建的數(shù)據(jù)庫。connectionstring=”server=127.0.0.1,uid=sa,pwd=pwd,database=yourdatabase”;
(3) 在新的鏈接中執(zhí)行創(chuàng)建數(shù)據(jù)表和數(shù)據(jù)存儲過程的代碼即可。

需要注意的是:不要在你的腳本中有GO命名,其他命令都可以直接執(zhí)行。
該方法的好處在于: 可以不要求安裝的目標(biāo)機(jī)上有SQL Server,也不存在因為文件路徑中有空格的問題而倒是安裝程序失敗。當(dāng)然,如果您的數(shù)據(jù)庫為Oracle或者DB2等,您也可以采用類似的方法來實現(xiàn)。

2.3 通過sp_attach_db來創(chuàng)建數(shù)據(jù)庫

通過上面的討論我們已經(jīng)很清楚如何安裝數(shù)據(jù)庫了。在安裝數(shù)據(jù)庫的過程中,我們除了可以通過數(shù)據(jù)庫腳本來創(chuàng)建數(shù)據(jù)庫之外,我們也可以通過SQL Server的系統(tǒng)存儲過程sp_attach_db來附加數(shù)據(jù)庫。
這里我們解決兩個問題即可:
(1) 確定數(shù)據(jù)庫文件(.mdf和.ldf)的位置。
(2) 執(zhí)行存儲過程。

對于問題1我們可以借鑒安裝數(shù)據(jù)的第一種方法,即把.mdf和.ldf通過文件系統(tǒng)安裝到目標(biāo)機(jī)上,然后通過
Assembly asm=Assembly.GetExecutingAssembly();
String setuppath=asm.Location;
獲得文件的路徑。

最后通過調(diào)用sp_attach_db 加上相應(yīng)的參數(shù)即可完成。
需要注意的是: 該方法也只能針對數(shù)據(jù)庫安裝在本機(jī)的情況下進(jìn)行安裝。

總結(jié)

本文通過介紹了三種不同的方法來在安裝程序是如何安裝數(shù)據(jù)庫,同時也分析了不同的方法的優(yōu)劣之處,用戶可以根據(jù)自己的實際需要來選擇安裝方法。同時,通過該方法的提出,用戶也可以完成在安裝程序是對數(shù)據(jù)庫的配置工作。