数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

实现自动安装SQL Server数据库


发布日期:2019年08月16日
 
实现自动安装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文件内容

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

上一篇:SQL Server存储过程编程经验技巧

下一篇:SQL SERVER的锁