自動安裝SQL Server數據庫

 

下面簡單介紹一下如何在工程中添加Microsoft SQL Server 2000 Desktop Engine (MSDE)的自動安裝合併模塊MSM:

1.     首先你需要下載MSDE2000的sp3安裝包。可以從下面的鏈接去下載,URL: http://www.microsoft.com/sql/downloads/2000/sp3.asp

 

2.     下載完成,你可以安裝或者用ZIP解壓到本地硬盤,將可以看到:Msi、MSM、Setup這3個目錄和setup等文件,其中的MSM文件夾中的東東就是本文要介紹的MSDE2000合併模塊。

 

3.     在你的工程中添加一個安裝工程(假設爲MySetup1,路徑爲c:/MySetup1),按照正常的步驟添加工程輸出(Project Output),選擇輸出文件(primary output)和內容文件(content files)兩項。

 

4.     添加合併模塊(Merge Moudle),選擇瀏覽,指定到你的MSDE的MSM文件夾,選則MSM和msm/1033下的所有的文件(REPL.MSM、REPL_RES.MSM、 DMO_RES.MSM和DMO.MSM可以不選),打開。

 

5.     設置安裝工程的屬性(Properties)中的SearchPath,指定爲你的MSM所在路徑(這時需要添加兩個:path/MSM和path/MSM/1033)。

 

6.     設置關於安裝程序的其他屬性咱們暫且不提,這是可以對你的安裝工程進行編譯了,當編譯通過後,你可以在c:/MySetup1/Debug/看到你的打包工程MySetup.msi。

 

7.     這是工程打包告一段落,下面我們需要修改打好的安裝包,使它可以在安裝完程序後自動安裝MSDE的一個實例(假設實例名爲:MyServer)。現在我們需要用到MS的一個工具ORCA,下載地址:http://support.microsoft.com/default.aspx?scid=kb;EN-US;255905安裝了orca後就可以利用這個工具對我們的MySetup1.msi進行修改了。

 

8.     ORCA打開安裝包文件MySetup.msi,找到Property這個table,ADD Row 在Propetry中填入SqlInstanceName,value中填入實例名MyServer。其他的參數請參見:http://support.microsoft.com/?id=810826和http://support.microsoft.com/default.aspx?scid=kb;en-us;281983

 

9.     所有的參數中有關密碼的屬性,我沒有成功,就是SqlSaPwd,這個參數是和SqlSecurityMode一起使用的,但是我一直沒有設置成功,密碼總是爲空的,不知何故!

 

10.選擇InstallExecuteSequence這個table,找到SetPropSQLMSDEInstalled這個Action,修改206爲102;找到RemoveExistingProducts,修改1525爲6601。保存,退出!
 

 

這時,在沒有SQL環境的機器上運行你的安裝包,在程序安裝完後,會自動安裝MSDE的MyServer實例,並在重起機器後,自動啓動Sql Server的實例。


=======================================================================

前一篇中介紹瞭如何連同Sql Server的桌面版本一同打包到安裝程序的簡單步驟,這裏還想就自己對於:發佈程序到已經有SQL環境的計算機時,自動使用SQL的Osql來恢復指定的數據庫到你的SQL Server的Date中。

 

首先,在c:/創建一個臨時目錄,例如c:/TempBD ,拷貝Osql.exe到目錄下,拷貝你的數據庫備份(TruckDB)到目錄下;在目錄下分別創建Restore.bat和Restore.txt文件,內容如下:
 
1.       Restore.bat文件內容:
osql -E -S -i C:/TempDB/Restore.txt
 
 
2.       Restore.txt文件內容:
use master
if exists (select * from sysdevices where name='TruckDB')
       EXEC sp_dropdevice 'TruckDB'
Else
       EXEC sp_addumpdevice 'disk','TruckDB', 'C:/Program Files/Microsoft SQL Server/MSSQL/Data/TruckDB.mdf'

 

restore database TruckDB
from disk='c:/TempDB/TruckDB'
with replace
 

 

 

   其次,在你的工程中添加一個Installer Class:選中Project主工程,添加Installer Class,名稱假定爲installer1。選擇instller1的代碼頁,添加下面的代碼:

 

Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)

'重寫install方法

       

Dim file As System.IO.File

        If file.Exists("C:/Program Files/Microsoft SQL Server/MSSQL/Data/TruckDB_data.mdf") = True Then Exit Sub

        MyBase.Install(stateSaver)

 

        Dim CheckedDir As System.IO.Directory

 

        If CheckedDir.Exists("C:/Program Files/Microsoft SQL Server/MSSQL/Data") = False Then

            CheckedDir.CreateDirectory("C:/Program Files/Microsoft SQL Server/MSSQL/Data")

        End If

 

        Dim FullPath As String

        Dim Asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()

        Dim strConfigLoc As String

        strConfigLoc = Asm.Location

 

 

        Dim strTemp As String

        strTemp = strConfigLoc

'提取安裝路徑

        strTemp = strTemp.Remove(strTemp.LastIndexOf("/"), Len(strTemp) - strTemp.LastIndexOf("/"))

      

        'Copy DateBase to computer.

        If CreatDIR(strTemp) = False Then

'失敗,反安裝

Me.Uninstall(stateSaver)

Exit Sub

        Else

          

        End If

 

      

 

        If InstallDB(strTemp) = False Then

失敗,反安裝

Me.Uninstall(stateSaver)

Exit Sub

        Else

          

        End If

刪除數據庫臨時文件

        DeleteDIR(c:/TempDB)

        DeleteDIR(strTemp + /TempDB)

 

     

End Sub

 

Public Overrides Sub Uninstall(ByVal stateSaver As System.Collections.Idictionary)

執行反安裝

利用反射提取安裝路徑

        MyBase.Uninstall(stateSaver)

        Dim Asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()

        Dim strConfigLoc As String

        strConfigLoc = Asm.Location

 

        Dim strTemp As String

        strTemp = strConfigLoc

        strTemp = strTemp.Remove(strTemp.LastIndexOf(/), Len(strTemp) strTemp.LastIndexOf(/))

刪除數據庫文件和臨時文件

        DeleteDIR(strTemp + /TempDB)

        DeleteDIR(c:/TempDB)

End Sub

 

Private Function DeleteDIR(ByVal path As String) As Boolean

刪除指定的文件夾

        Dim dir As System.IO.Directory

        If dir.Exists(path) = True Then dir.Delete(path, True)

End Function

 

Private Function CreatDIR(ByVal path As String) As Boolean

創建指定的文件夾

        Dim Files As System.IO.File

        Dim Dirs As System.IO.Directory

        Try

If Dirs.Exists(c:/TempDB) = False Then Dirs.CreateDirectory(c:/TempDB)

copy Creat DB files

CopyFile(path + /TempDB, C:/TempDB)

          

Return True

        Catch

Return False

        End Try

      

End Function

 

Private Sub CopyFile(ByVal SourceDirName As String, ByVal DestDirName As String)

copy指定的文件夾的所有文件到目標文件夾(單層)。

        Dim dir As System.IO.Directory

        Dim File As System.IO.File

        Dim sPath, oPath As String

        Dim I As Integer

        For I = 0 To dir.GetFiles(SourceDirName).Length 1

sPath = dir.GetFiles(SourceDirName).GetValue(i).ToString

oPath = Microsoft.VisualBasic.Right(sPath, Len(sPath) Len(SourceDirName))

File.Copy(sPath, DestDirName + oPath, True)

        Next

End Sub

 

Private Function InstallDB(ByVal path As String) As Boolean

安裝數據庫,調用自動批處理。

        'Dim CheckedDir As System.IO.Directory

        'If CheckedDir.Exists(C:/Program Files/Microsoft SQL Server/MSSQL/Data) = False Then

'CheckedDir.CreateDirectory(C:/Program Files/Microsoft SQL Server/MSSQL/Data)

        'End If

        Try

Shell(c:/TempDB/Restore.bat, AppWinStyle.Hide, True)

Catch

End Try

   

End Function

 

 
然後,在你的工程中添加一個安裝工程,取名爲MySetup1,按照正常的步驟添加工程輸出(Project Output),選擇輸出文件(primary output)和內容文件(content files)兩項,再添加文件夾到application Folder,文件夾的Name爲TempDB,再給文件夾TempDB添加文件:osql.exe,Restore.bat,Restore.txt,TruckDB(數據庫文件)。設定你的文件夾的properties的AlwaysCreate爲True。對你的Setup工程進行編譯。

 

這時,生成的安裝包,將會在安裝完程序後,自動調用Installer類的方法,恢復你的TruckDB數據庫。

 

注意,TruckDB在生成的時候,應該備份保存到“C:/Program Files/Microsoft SQL Server/MSSQL/Data/”下,便於恢復。

Dim file As System.IO.File

        If file.Exists("C:/Program Files/Microsoft SQL Server/MSSQL/Data/TruckDB_data.mdf") = True Then Exit Sub

        MyBase.Install(stateSaver)

 

        Dim CheckedDir As System.IO.Directory

 

        If CheckedDir.Exists("C:/Program Files/Microsoft SQL Server/MSSQL/Data") = False Then

            CheckedDir.CreateDirectory("C:/Program Files/Microsoft SQL Server/MSSQL/Data")

        End If

 

        Dim FullPath As String

        Dim Asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()

        Dim strConfigLoc As String

        strConfigLoc = Asm.Location

 

 

首先,在c:/創建一個臨時目錄,例如c:/TempBD ,拷貝Osql.exe到目錄下,拷貝你的數據庫備份(TruckDB)到目錄下;在目錄下分別創建Restore.bat和Restore.txt文件,內容如下:
 
1.       Restore.bat文件內容:
osql -E -S -i C:/TempDB/Restore.txt
 
 
2.       Restore.txt文件內容:
use master
if exists (select * from sysdevices where name='TruckDB')
       EXEC sp_dropdevice 'TruckDB'
Else
       EXEC sp_addumpdevice 'disk','TruckDB', 'C:/Program Files/Microsoft SQL Server/MSSQL/Data/TruckDB.mdf'

 

restore database TruckDB
from disk='c:/TempDB/TruckDB'
with replace
 

 

 

   其次,在你的工程中添加一個Installer Class:選中Project主工程,添加Installer Class,名稱假定爲installer1。選擇instller1的代碼頁,添加下面的代碼:

 

Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)

'重寫install方法

       

Dim file As System.IO.File

        If file.Exists("C:/Program Files/Microsoft SQL Server/MSSQL/Data/TruckDB_data.mdf") = True Then Exit Sub

        MyBase.Install(stateSaver)

 

        Dim CheckedDir As System.IO.Directory

 

        If CheckedDir.Exists("C:/Program Files/Microsoft SQL Server/MSSQL/Data") = False Then

            CheckedDir.CreateDirectory("C:/Program Files/Microsoft SQL Server/MSSQL/Data")

        End If

 

        Dim FullPath As String

        Dim Asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()

        Dim strConfigLoc As String

        strConfigLoc = Asm.Location

 

 

        Dim strTemp As String

        strTemp = strConfigLoc

'提取安裝路徑

        strTemp = strTemp.Remove(strTemp.LastIndexOf("/"), Len(strTemp) - strTemp.LastIndexOf("/"))

      

        'Copy DateBase to computer.

        If CreatDIR(strTemp) = False Then

'失敗,反安裝

Me.Uninstall(stateSaver)

Exit Sub

        Else

          

        End If

 

      

 

        If InstallDB(strTemp) = False Then

失敗,反安裝

Me.Uninstall(stateSaver)

Exit Sub

        Else

          

        End If

刪除數據庫臨時文件

        DeleteDIR(c:/TempDB)

        DeleteDIR(strTemp + /TempDB)

 

     

End Sub

 

Public Overrides Sub Uninstall(ByVal stateSaver As System.Collections.Idictionary)

執行反安裝

利用反射提取安裝路徑

        MyBase.Uninstall(stateSaver)

        Dim Asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()

        Dim strConfigLoc As String

        strConfigLoc = Asm.Location

 

        Dim strTemp As String

        strTemp = strConfigLoc

        strTemp = strTemp.Remove(strTemp.LastIndexOf(/), Len(strTemp) strTemp.LastIndexOf(/))

刪除數據庫文件和臨時文件

        DeleteDIR(strTemp + /TempDB)

        DeleteDIR(c:/TempDB)

End Sub

 

Private Function DeleteDIR(ByVal path As String) As Boolean

刪除指定的文件夾

        Dim dir As System.IO.Directory

        If dir.Exists(path) = True Then dir.Delete(path, True)

End Function

 

Private Function CreatDIR(ByVal path As String) As Boolean

創建指定的文件夾

        Dim Files As System.IO.File

        Dim Dirs As System.IO.Directory

        Try

If Dirs.Exists(c:/TempDB) = False Then Dirs.CreateDirectory(c:/TempDB)

copy Creat DB files

CopyFile(path + /TempDB, C:/TempDB)

          

Return True

        Catch

Return False

        End Try

      

End Function

 

Private Sub CopyFile(ByVal SourceDirName As String, ByVal DestDirName As String)

copy指定的文件夾的所有文件到目標文件夾(單層)。

        Dim dir As System.IO.Directory

        Dim File As System.IO.File

        Dim sPath, oPath As String

        Dim I As Integer

        For I = 0 To dir.GetFiles(SourceDirName).Length 1

sPath = dir.GetFiles(SourceDirName).GetValue(i).ToString

oPath = Microsoft.VisualBasic.Right(sPath, Len(sPath) Len(SourceDirName))

File.Copy(sPath, DestDirName + oPath, True)

        Next

End Sub

 

Private Function InstallDB(ByVal path As String) As Boolean

安裝數據庫,調用自動批處理。

        'Dim CheckedDir As System.IO.Directory

        'If CheckedDir.Exists(C:/Program Files/Microsoft SQL Server/MSSQL/Data) = False Then

'CheckedDir.CreateDirectory(C:/Program Files/Microsoft SQL Server/MSSQL/Data)

        'End If

        Try

Shell(c:/TempDB/Restore.bat, AppWinStyle.Hide, True)

Catch

End Try

   

End Function

 

 
然後,在你的工程中添加一個安裝工程,取名爲MySetup1,按照正常的步驟添加工程輸出(Project Output),選擇輸出文件(primary output)和內容文件(content files)兩項,再添加文件夾到application Folder,文件夾的Name爲TempDB,再給文件夾TempDB添加文件:osql.exe,Restore.bat,Restore.txt,TruckDB(數據庫文件)。設定你的文件夾的properties的AlwaysCreate爲True。對你的Setup工程進行編譯。

 

這時,生成的安裝包,將會在安裝完程序後,自動調用Installer類的方法,恢復你的TruckDB數據庫。

 

注意,TruckDB在生成的時候,應該備份保存到“C:/Program Files/Microsoft SQL Server/MSSQL/Data/”下,便於恢復。

Dim file As System.IO.File

        If file.Exists("C:/Program Files/Microsoft SQL Server/MSSQL/Data/TruckDB_data.mdf") = True Then Exit Sub

        MyBase.Install(stateSaver)

 

        Dim CheckedDir As System.IO.Directory

 

        If CheckedDir.Exists("C:/Program Files/Microsoft SQL Server/MSSQL/Data") = False Then

            CheckedDir.CreateDirectory("C:/Program Files/Microsoft SQL Server/MSSQL/Data")

        End If

 

        Dim FullPath As String

        Dim Asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()

        Dim strConfigLoc As String

        strConfigLoc = Asm.Location

 
發佈了11 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章