P>
這個例子演示了如何在用戶界面自定義對話框要求用戶輸入信息,然後在自定義操作中把獲得的值通過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) 創建試圖或者存儲過程
並且這三個部分是有先後順序的,順序不能顛倒,但是每個過程中沒有順序關系。在測試過程中我們發現可以在一條語句中創建多個表或者多個存儲過程。也就是說,我們可以把執行過程按照上面的順序執行就行了。並且我們把數據
我們可以通過如下操作完成:
(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 加上相應的參數即可完成。
需要注意的是: 該方法也只能針對數據庫安裝在本機的情況下進行安裝。
總結
本文通過介紹了三種不同的方法來在安裝程序是如何安裝數據庫,同時也分析了不同的方法的優劣之處,用戶可以根據自己的實際需要來選擇安裝方法。同時,通過該方法的提出,用戶也可以完成在安裝程序是對數據庫的配置工作。