下面簡單介紹一下如何在工程中添加Microsoft SQL Server
Desktop Engine (MSDE)的自動安裝合並模塊MSM
首先你需要下載MSDE
的sp
安裝包
可以從下面的鏈接去下載
URL
下載完成
你可以安裝或者用ZIP解壓到本地硬盤
將可以看到
Msi
MSM
Setup這
個目錄和setup等文件
其中的MSM文件夾中的東東就是本文要介紹的MSDE
合並模塊
在你的工程中添加一個安裝工程(假設為MySetup
路徑為c
\MySetup
)
按照正常的步驟添加工程輸出(Project Output)
選擇輸出文件(primary output)和內容文件(content files)兩項
添加合並模塊(Merge Moudle)
選擇浏覽
指定到你的MSDE的MSM文件夾
選則MSM和msm\
下的所有的文件(REPL
MSM
REPL_RES
MSM
DMO_RES
MSM和DMO
MSM可以不選)
打開
設置安裝工程的屬性(Properties)中的SearchPath
指定為你的MSM所在路徑(這時需要添加兩個
path\MSM和path\MSM\
)
設置關於安裝程序的其他屬性咱們暫且不提
這是可以對你的安裝工程進行編譯了
當編譯通過後
你可以在c
\MySetup
\Debug\看到你的打包工程MySetup
msi
這是工程打包告一段落
下面我們需要修改打好的安裝包
使它可以在安裝完程序後自動安裝MSDE的一個實例(假設實例名為
MyServer)
現在我們需要用到MS的一個工具ORCA
下載地址
x?scid=kb
EN
US
安裝了orca後就可以利用這個工具對我們的MySetup
msi進行修改了
用ORCA打開安裝包文件MySetup
msi
找到Property這個table
ADD Row 在Propetry中填入SqlInstanceName
value中填入實例名MyServer
其他的參數請參見
?id=
和x?scid=kb
en
us
所有的參數中有關密碼的屬性
我沒有成功
就是SqlSaPwd
這個參數是和SqlSecurityMode一起使用的
但是我一直沒有設置成功
密碼總是為空的
不知何故!
選擇InstallExecuteSequence這個table
找到SetPropSQLMSDEInstalled這個Action
修改
為
找到RemoveExistingProducts
修改
為
保存
退出!
這時
在沒有SQL環境的機器上運行你的安裝包
在程序安裝完後
會自動安裝MSDE的MyServer實例
並在重起機器後
自動啟動Sql Server的實例
前一篇中介紹了如何連同Sql Server的桌面版本一同打包到安裝程序的簡單步驟
這裡還想就自己對於
發布程序到已經有SQL環境的計算機時
自動使用SQL的Osql來恢復指定的數據庫到你的SQL Server的Date中
首先
在c
\創建一個臨時目錄
例如c
\TempBD
拷貝Osql
exe到目錄下
拷貝你的數據庫備份(TruckDB)到目錄下
在目錄下分別創建Restore
bat和Restore
txt文件
內容如下
Restore
bat文件內容
osql
E
S
i C
\TempDB\Restore
txt
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
名稱假定為installer
選擇instller
的代碼頁
添加下面的代碼
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 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 =
To dir
GetFiles(SourceDirName)
Length –
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
Director
From:http://tw.wingwit.com/Article/program/SQLServer/201311/11234.html