NSIS——安装时附加数据库、卸载时分离数据库

1、定义数据库信息常量
 
; ------ 附加数据库用到的常量 ------
!define DB_NAME "Test"
!define DB_FILE_MDF "$INSTDIR\db\Test_Data.MDF"
!define DB_FILE_LDF "$INSTDIR\db\Test_Log.LDF"
 

2、安装时附加数据库

 
;程序文件
Section "MainSection" SEC01
 
; ------ 附加数据库 ------
;判断数据库是否已经附加,如果没有附加,则附加数据库
ClearErrors
;从注册表中读取SQL安装程序路径
ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Microsoft SQL Server\80\Tools\ClientSetup" "SQLPath"
;从注册表中读取当前电脑的名称
ReadRegStr $R2 HKLM "SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" "ComputerName"
;将附加数据库的命令写入到文本中
FileOpen $R3 "$INSTDIR\attach_db.sql" w
FileWrite $R3 "exec sp_attach_db @dbname = N$\'${DB_NAME}$\', @filename1 = N$\'${DB_FILE_MDF}$\',@filename2=N$\'${DB_FILE_LDF}$\'"
FileWriteByte $R3 "13"
FileWriteByte $R3 "10"
FileClose $R3
;利用临时文件存储执行SQL语句的运行结果
GetTempFileName $R0
DetailPrint "正在附加数据库..."
DetailPrint "附加语句:exec sp_attach_db @dbname = N$\'${DB_NAME}$\', @filename1 = N$\'${DB_FILE_MDF}$\',@filename2=N$\'${DB_FILE_LDF}$\'"
DetailPrint '附加文件:"$R1\Binn\isql.exe" -U "sa" -P "sa" -S "$R2\${DB_NAME}" -d master -i "$INSTDIR\attach_db.sql" -o "$R0" -b'
;无窗口执行CMD命令
nsExec::ExecToLog '"$R1\Binn\isql.exe" -U "sa" -P "sa" -S "$R2" -d master -i "$INSTDIR\attach_db.sql" -o "$R0" -b'
DetailPrint "附加数据库完成..."
; ------ 附加数据库 结束 ------
SectionEnd
 
Function .onInstSuccess
;删除附加数据库脚本文件
Delete "$INSTDIR\attach_db.sql"
FunctionEnd
 
 
3、卸载时分离数据库并删除数据库文件
 
/******************************
* 以下是安装程序的卸载部分 *
******************************/
 
Section Uninstall
 
; ------ 卸载时与数据库相关的操作 ------
MessageBox MB_YESNO|MB_ICONQUESTION "是否同时删除数据库?(若您想保留,请点击“否”按钮)"IDNO NoDelete
;从注册表中读取SQL安装程序路径
ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Microsoft SQL Server\80\Tools\ClientSetup" "SQLPath"
;从注册表中读取当前电脑的名称
ReadRegStr $R2 HKLM "SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" "ComputerName"
;将附加数据库的命令写入到文本中
FileOpen $R3 "$INSTDIR\detach_db.sql" w
FileWrite $R3 "USE master"
FileWriteByte $R3 "13"
FileWriteByte $R3 "10"
FileWrite $R3 "GO"
FileWriteByte $R3 "13"
FileWriteByte $R3 "10"
FileWrite $R3 "exec sp_detach_db @dbname = N$\'${DB_NAME}$\'"
FileWriteByte $R3 "13"
FileWriteByte $R3 "10"
FileClose $R3
;利用临时文件存储执行SQL语句的运行结果
GetTempFileName $R0
DetailPrint "正在分离${DB_NAME}数据库..."
;无窗口执行CMD命令
nsExec::ExecToLog '"$R1\Binn\isql.exe" -U "sa" -P "sa" -S "$R2" -d master -i "$INSTDIR\detach_db.sql" -o "$R0" -b'
Sleep 500
DetailPrint "数据库分离成功..."
; 删除数据库文件
Delete ${DB_FILE_MDF}
Delete ${DB_FILE_LDF}
NoDelete:
ClearErrors
; 删除数据库分离脚本文件
Delete "$INSTDIR\detach_db.sql"
; ------ 卸载时与数据库相关的操作 结束 ------
SetAutoClose true
SectionEnd

posted on 2012-07-04 22:34  航甫  阅读(836)  评论(0编辑  收藏  举报

导航