熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

實現自動安裝SQL Server數據庫

2022-06-13   來源: SQL Server 

  下面簡單介紹一下如何在工程中添加Microsoft SQL Server Desktop Engine (MSDE)的自動安裝合並模塊MSM
  
   首先你需要下載MSDE的sp安裝包可以從下面的鏈接去下載URL
  
   下載完成你可以安裝或者用ZIP解壓到本地硬盤將可以看到MsiMSMSetup這個目錄和setup等文件其中的MSM文件夾中的東東就是本文要介紹的MSDE合並模塊
  
   在你的工程中添加一個安裝工程(假設為MySetup路徑為c\MySetup按照正常的步驟添加工程輸出(Project Output)選擇輸出文件(primary output)和內容文件(content files)兩項
  
   添加合並模塊(Merge Moudle)選擇浏覽指定到你的MSDE的MSM文件夾選則MSM和msm\下的所有的文件(REPLMSMREPL_RESMSM DMO_RESMSM和DMOMSM可以不選)打開
  
   設置安裝工程的屬性(Properties)中的SearchPath指定為你的MSM所在路徑(這時需要添加兩個path\MSM和path\MSM\
  
   設置關於安裝程序的其他屬性咱們暫且不提這是可以對你的安裝工程進行編譯了當編譯通過後你可以在c\MySetup\Debug\看到你的打包工程MySetupmsi
  
   這是工程打包告一段落下面我們需要修改打好的安裝包使它可以在安裝完程序後自動安裝MSDE的一個實例(假設實例名為MyServer)現在我們需要用到MS的一個工具ORCA下載地址x?scid=kbENUS安裝了orca後就可以利用這個工具對我們的MySetupmsi進行修改了
  
   用ORCA打開安裝包文件MySetupmsi找到Property這個tableADD Row 在Propetry中填入SqlInstanceNamevalue中填入實例名MyServer其他的參數請參見?id=和x?scid=kbenus
  
   所有的參數中有關密碼的屬性我沒有成功就是SqlSaPwd這個參數是和SqlSecurityMode一起使用的但是我一直沒有設置成功密碼總是為空的不知何故!
  
   選擇InstallExecuteSequence這個table找到SetPropSQLMSDEInstalled這個Action修改找到RemoveExistingProducts修改保存退出!
  
  這時在沒有SQL環境的機器上運行你的安裝包在程序安裝完後會自動安裝MSDE的MyServer實例並在重起機器後自動啟動Sql Server的實例
  
  前一篇中介紹了如何連同Sql Server的桌面版本一同打包到安裝程序的簡單步驟這裡還想就自己對於發布程序到已經有SQL環境的計算機時自動使用SQL的Osql來恢復指定的數據庫到你的SQL Server的Date中
  
  首先在c\創建一個臨時目錄例如c\TempBD 拷貝Osqlexe到目錄下拷貝你的數據庫備份(TruckDB)到目錄下在目錄下分別創建Restorebat和Restoretxt文件內容如下
  
   Restorebat文件內容
  
  osql E S i C\TempDB\Restoretxt
  
   Restoretxt文件內容
  
  use master
  
  if exists (select * from sysdevices where name=TruckDB
  
  EXEC sp_dropdevice TruckDB
  
  Else
  
  EXEC sp_addumpdevice diskTruckDB C\Program Files\Microsoft SQL Server\MSSQL\Data\TruckDBmdf
  
  restore database TruckDB
  
  from disk=c\TempDB\TruckDB
  
  with replace
  
  其次在你的工程中添加一個Installer Class選中Project主工程添加Installer Class名稱假定為installer選擇instller的代碼頁添加下面的代碼
  
  Public Overrides Sub Install(ByVal stateSaver As SystemCollectionsIDictionary)
  
  重寫install方法
  
  Dim file As SystemIOFile
  
  If fileExists(C\Program Files\Microsoft SQL Server\MSSQL\Data\TruckDB_datamdf) = True Then Exit Sub
  
  MyBaseInstall(stateSaver)
  
  Dim CheckedDir As SystemIODirectory
  
  If CheckedDirExists(C\Program Files\Microsoft SQL Server\MSSQL\Data) = False Then
  
  CheckedDirCreateDirectory(C\Program Files\Microsoft SQL Server\MSSQL\Data
  
  End If
  
  Dim FullPath As String
  
  Dim Asm As SystemReflectionAssembly = SystemReflectionAssemblyGetExecutingAssembly()
  
  Dim strConfigLoc As String
  
  strConfigLoc = AsmLocation
  
  Dim file As SystemIOFile
  
  If fileExists(C\Program Files\Microsoft SQL Server\MSSQL\Data\TruckDB_datamdf) = True Then Exit Sub
  
  MyBaseInstall(stateSaver)
  
  Dim CheckedDir As SystemIODirectory
  
  If CheckedDirExists(C\Program Files\Microsoft SQL Server\MSSQL\Data) = False Then
  
  CheckedDirCreateDirectory(C\Program Files\Microsoft SQL Server\MSSQL\Data
  
  End If
  
  Dim FullPath As String
  
  Dim Asm As SystemReflectionAssembly = SystemReflectionAssemblyGetExecutingAssembly()
  
  Dim strConfigLoc As String
  
  strConfigLoc = AsmLocation
  
  Dim strTemp As String
  
  strTemp = strConfigLoc
  
  提取安裝路徑
  
  strTemp = strTempRemove(strTempLastIndexOf(\ Len(strTemp) strTempLastIndexOf(\))
  
  Copy DateBase to computer
  
  If CreatDIR(strTemp) = False Then
  
  失敗反安裝
  
  MeUninstall(stateSaver)
  
  Exit Sub
  
  Else
  
  End If
  
  If InstallDB(strTemp) = False Then
  
  失敗反安裝
  
  MeUninstall(stateSaver)
  
  Exit Sub
  
  Else
  
  End If
  
  刪除數據庫臨時文件
  
  DeleteDIR(c\TempDB
  
  DeleteDIR(strTemp + \TempDB
  
  End Sub
  
  Public Overrides Sub Uninstall(ByVal stateSaver As SystemCollectionsIdictionary)
  
  執行反安裝
  
  利用反射提取安裝路徑
  
  MyBaseUninstall(stateSaver)
  
  Dim Asm As SystemReflectionAssembly = SystemReflectionAssemblyGetExecutingAssembly()
  
  Dim strConfigLoc As String
  
  strConfigLoc = AsmLocation
  
  Dim strTemp As String
  
  strTemp = strConfigLoc
  
  strTemp = strTempRemove(strTempLastIndexOf(\ Len(strTemp) – strTempLastIndexOf(\))
  
  刪除數據庫文件和臨時文件
  
  DeleteDIR(strTemp + \TempDB
  
  DeleteDIR(c\TempDB
  
  End Sub
  
  Private Function DeleteDIR(ByVal path As String) As Boolean
  
  刪除指定的文件夾
  
  Dim dir As SystemIODirectory
  
  If dirExists(path) = True Then dirDelete(path True)
  
  End Function
  
  Private Function CreatDIR(ByVal path As String) As Boolean
  
  創建指定的文件夾
  
  Dim Files As SystemIOFile
  
  Dim Dirs As SystemIODirectory
  
  Try
  
  If DirsExists(c\TempDB) = False Then DirsCreateDirectory(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 SystemIODirectory
  
  Dim File As SystemIOFile
  
  Dim sPath oPath As String
  
  Dim I As Integer
  
  For I = To dirGetFiles(SourceDirName)Length –
  
  sPath = dirGetFiles(SourceDirName)GetValue(i)ToString
  
  oPath = MicrosoftVisualBasicRight(sPath Len(sPath) – Len(SourceDirName))
  
  FileCopy(sPath DestDirName + oPath True)
  
  Next
  
  End Sub
  
  Private Function InstallDB(ByVal path As String) As Boolean
  
  安裝數據庫調用自動批處理
  
  Dim CheckedDir As SystemIODirector
From:http://tw.wingwit.com/Article/program/SQLServer/201311/11234.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.