下面简单介绍一下如何在工程中添加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文件内容
osqlE 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(\))
CopyDateBase 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