• NSIS附加数据库,分离数据库脚本代码


    主要使用Binn/isql.exe执行SQL脚本文件命令进行操作,SQL脚本文件在安装程序中自动生成,完成操作后删除。

    详细代码如下:

    Section !主程序 sec01
    ;用户必选的安装程序
    SectionIn RO

    ;判断数据库是否已经附加,如果没有附加,则附加数据库
    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$/'数据库名称$/', @filename1 = N$/'$INSTDIR/DataBase/MDF主数据库文件名.MDF$/',@filename2=N$/'$INSTDIR/DataBase/LDF日志数据库文件名.LDF$/'"
    FileWriteByte $R3 "13"
    FileWriteByte $R3 "10"
    FileClose $R3
    ;利用临时文件存储执行SQL语句的运行结果
    GetTempFileName $R0
    DetailPrint "正在附加数据库..."
    ;无窗口执行CMD命令
    nsExec::ExecToLog '"$R1/Binn/isql.exe" -U "sa" -P "123456" -S  "$R2/MSDE实例名" -d master -i "$INSTDIR/attach_db.sql" -o "$R0" -b'
    DetailPrint "附加数据库完成..."

    SectionEnd

    Function .onInstSuccess
    ;删除附加数据库脚本文件
    Delete "$INSTDIR/attach_db.sql"
    FunctionEnd

    ;安装程序的卸载部分
    Section Uninstall
      MessageBox MB_YESNO|MB_ICONQUESTION "是否同时删除数据库?(若您想保留,请点击“否”按钮)"
      GOTO NoDelete
      ; 删除数据库文件
      Delete "$INSTDIR/DataBase/MDF主数据库文件名.MDF"
      Delete "$INSTDIR/DataBase/LDF日志数据库文件名.LDF"
      NoDelete:
      ClearErrors

      ; 删除数据库分离脚本文件

      Delete "$INSTDIR/detach_db.sql"

    SectionEnd

    Function un.onInit

    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/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$/'数据库名称$/'"
    FileWriteByte $R3 "13"
    FileWriteByte $R3 "10"
    FileClose $R3
    ;利用临时文件存储执行SQL语句的运行结果
    GetTempFileName $R0
    DetailPrint "正在分离3W-iSystem数据库..."
    ;无窗口执行CMD命令
    nsExec::ExecToLog '"$R1/Binn/isql.exe" -U "sa" -P "123456" -S  "$R2/MSDE实例名" -d master -i "$INSTDIR/detach_db.sql" -o "$R0" -b'
    Sleep 500
    DetailPrint "数据库分离成功..."

    FunctionEnd

  • 相关阅读:
    条款27: 如果不想使用隐式生成的函数就要显式地禁止它
    条款26: 当心潜在的二义性
    条款23: 必须返回一个对象时不要试图返回一个引用
    条款22: 尽量用“传引用”而不用“传值”
    条款21: 尽可能使用const
    【转】我的算法学习之路
    【转】基于Linux下的TCP编程
    条款十九: 分清成员函数,非成员函数和友元函数
    【c++】C语言中volatile关键字的作用
    innerHTML,innerText,outHTML,outText区别
  • 原文地址:https://www.cnblogs.com/xqf222/p/3306820.html
Copyright © 2020-2023  润新知