首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 部署專案實戰:打包自動安裝資料庫完整指南 (Visual Studio Setup Project)

     編輯:關於.NET

概覽:從建立部署專案到自動建立資料庫

本文詳細記錄如何使用 Visual Studio **安裝部署專案** (Setup Project) 打包應用程式,並在安裝過程中自動建立/初始化 SQL Server 資料庫。涵蓋自定義安裝介面、自定義動作、自定義安裝類別、卸載捷徑建立等完整流程。

一、建立部署專案

  1. 「檔案」→「加入」→「新增專案」
  2. 選擇「安裝和部署」→「安裝專案」,命名 setup1
  3. 屬性視窗設定 ProductName = "資訊管理系統"

二、加入主程式輸出

  1. 檔案系統編輯器選擇「應用程式資料夾」
  2. 右鍵「加入」→「專案輸出」→選擇主專案→勾選「主要輸出」與「內容檔案」

三、建立安裝程式類別

  1. 新增「類別庫」專案 installDB (VB.NET 或 C# 均可)
  2. 加入「安裝程式類別」項目 installDB.cs
  3. 實作 Install 覆寫方法,執行資料庫建立腳本

四、建立自定義安裝對話框 (收集資料庫連線資訊)

在「使用者介面」編輯器 → 「安裝」→「開始」節點右鍵「加入對話框」:

  1. 加入「授權合約」對話框
  2. 加入「文字方塊 (A)」對話框,移動到「安裝資料夾」上方
  3. 設定屬性:
屬性值
BannerText安裝資料庫
BodyText安裝程式將在目標機器上安裝資料庫
Edit1Label資料庫名稱:
Edit1PropertyCUSTOMTEXTA1
Edit1Valuedbservers
Edit2Label伺服器名稱:
Edit2PropertyCUSTOMTEXTA2
Edit2Value(local)
Edit3Label使用者名稱:
Edit3PropertyCUSTOMTEXTA3
Edit3Valuesa
Edit4Label密碼:
Edit4PropertyCUSTOMTEXTA4
Edit2Visible/3/4True

五、建立自定義動作 (傳遞參數給安裝類別)

  1. 「自訂動作」編輯器 → 「安裝」節點右鍵「加入自訂動作」
  2. 選擇「應用程式資料夾」→「來自 installDB 的主要輸出」
  3. 設定 CustomActionData 屬性:
/dbname=[CUSTOMTEXTA1] /server=[CUSTOMTEXTA2] /user=[CUSTOMTEXTA3] /pwd=[CUSTOMTEXTA4] /targetdir="[TARGETDIR]\"

/targetdir 為安裝後目標路徑,供安裝類別讀取 SQL 腳本檔案。

六、安裝類別核心程式碼

using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.IO;
using System.Data.SqlClient;
using System.Reflection;

namespace install
{
    [RunInstaller(true)]
    public class Installer1 : Installer
    {
        public override void Install(IDictionary stateSaver)
        {
            base.Install(stateSaver);
            AddDBTable(Context.Parameters["dbname"]);
        }

        private string GetSql(string fileName)
        {
            // 從安裝目錄讀取 sql.txt 腳本
            string path = Path.Combine(Context.Parameters["targetdir"], fileName);
            return File.ReadAllText(path, Encoding.Default);
        }

        private void ExecuteSql(string dbName, string sql)
        {
            using (var conn = new SqlConnection(
                $"server={Context.Parameters["server"]}; user id={Context.Parameters["user"]}; password={Context.Parameters["pwd"]}; Database={dbName}"))
            using (var cmd = new SqlCommand(sql, conn))
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }

        private void AddDBTable(string dbName)
        {
            try
            {
                // 1. 建立資料庫
                ExecuteSql("master", $"CREATE DATABASE [{dbName}]");
                // 2. 執行結構腳本
                ExecuteSql(dbName, GetSql("sql.txt"));
                // 3. 建立登入與使用者對應
                ExecuteSql("master", $"EXEC sp_addlogin 'myoamaster','myoamaster','{dbName}'");
                ExecuteSql(dbName, $"EXEC sp_grantdbaccess 'myoamaster', 'myoamaster'");
                ExecuteSql(dbName, $"EXEC sp_addrolemember 'db_owner','myoamaster'");
            }
            catch (Exception ex)
            {
                // 安裝失敗會自動回滾
                throw new InstallException("資料庫初始化失敗: " + ex.Message, ex);
            }
        }
    }
}

七、加入卸載捷徑 (兩種方法)

方法一:使用 msiexec.exe

  1. 加入 msiexec.exe (通常在 C:\Windows\System32)
  2. 建立捷徑命名「解除安裝」
  3. 捷徑引數:/x {ProductCode} (ProductCode 見專案屬性)

方法二:獨立卸載程式 (推薦)

  1. 建立 Console 專案 uninst.exe:
Module uninstall
    Sub Main()
        Dim myProcess As New Process()
        If Environment.OSVersion.ToString.IndexOf("NT 5") >= 0 Then
            myProcess.Start("msiexec", "/X{你的 ProductCode}")
        End If
        myProcess.Close()
    End Sub
End Module
  1. 將編譯後的 uninst.exe 加入部署專案,建立捷徑

八、附加現有 MDF/LDF 檔案 (替代建立腳本)

private void AttachDatabase(string masterConnStr, string dbName, string mdfPath, string ldfPath)
{
    string sql = $@"EXEC sp_attach_db @dbname = '{dbName}', @filename1 = '{mdfPath}', @filename2 = '{ldfPath}'";
    using (var conn = new SqlConnection(masterConnStr))
    using (var cmd = new SqlCommand(sql, conn))
    {
        conn.Open();
        cmd.ExecuteNonQuery();
    }
}

記得將 .mdf、.ldf 也加入部署專案的「應用程式資料夾」。

關鍵提醒

  • sql.txt 必須加入部署專案,否則安裝時找不到腳本。
  • 安裝類別專案需參考 System.Configuration.Install.dll。
  • 使用 Context.Parameters 取得自定義動作傳遞的參數。
  • 安裝過程拋出例外會自動觸發回滾 (Rollback)。
  • VS Setup Project 已停止更新,新專案建議改用 WiX Toolset、Advanced Installer 或 MSIX 打包。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved