首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

VS2005 製作 Web 專案安裝程式:含資料庫部署、設定檔修改、自訂 UI 完整實作

     編輯:關於SqlServer

Visual Studio 2005 的「Web 安裝專案」範本,結合「安裝程式類別」自訂動作,可實現:一鍵部署網站檔案、建立資料庫結構/資料、修改 web.config 連線字串、收集使用者輸入 (DB Server/帳號/密碼) 的完整安裝體驗。本文以實戰步驟記錄全流程,並提供「備份還原法」替代 SQL 腳本法的效能優化方案。

環境與前置條件

  • OS: Windows Server 2003
  • IDE: Visual Studio 2005
  • DB: SQL Server 2000
  • 已發布的網站專案 (預編譯、無原始碼)

核心步驟總覽

  1. 建立 Web 安裝專案:方案右鍵 → 加入 → 新專案 → 其他專案類型 → 安裝部署 → Web 安裝專案。
  2. 產生資料庫 SQL 腳本:企業管理器 → 所有工作 → 產生 SQL 腳本 → 另存為 `.txt`、移除 `GO` 批次分隔符。
  3. 建立類別庫專案 + 安裝程式類別:`Installer` 類別繼承 `System.Configuration.Install.Installer`,覆寫 `Install` 方法。
  4. 嵌入 SQL 腳本為資源:專案右鍵 → 加入現有項目 → 選取 `.txt` → 屬性 → 建置動作 = 嵌入的資源。
  5. 實作安裝邏輯:讀取使用者輸入參數 → 建立 `SqlConnection` → 執行 `CREATE DATABASE` → 執行嵌入資源 SQL → 修改 `web.config` 連線字串。
  6. 設定安裝專案檔案系統:加入「主要輸出」(類別庫 DLL) 與「內容檔案」(網站檔案)。
  7. 設計自訂 UI 對話框:收集 `DBSERVERNAME`、`USERNAME`、`PASSWORD` 三個屬性。
  8. 綁定自訂動作參數:`CustomActionData = /server=[DBSERVERNAME] /user=[USERNAME] /pwd=[PASSWORD] /targetdir="[TARGETDIR]"` (參數間必須有空格)。
  9. 加入 .NET Framework 2.0 必要條件。
  10. 建置輸出 MSI/Setup.exe。

關鍵代碼片段:安裝程式類別核心邏輯

[RunInstaller(true)]
public partial class DbInstaller : Installer
{
    private SqlConnection _conn;
    private string _server, _user, _pwd;

    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);

        // 1. 讀取使用者輸入 (來自 CustomActionData)
        _server = Context.Parameters["server"].Trim();
        _user   = Context.Parameters["user"].Trim();
        _pwd    = Context.Parameters["pwd"].Trim();

        _conn = new SqlConnection(
            $"User ID={_user};Data Source={_server};Password={_pwd};Initial Catalog=master");

        // 2. 建立資料庫與物件
        ExecuteSql("master", "CREATE DATABASE Water");
        ExecuteSql("Water", GetEmbeddedSql("WaterTable.txt"));

        // 3. 修改 web.config 連線字串
        ModifyWebConfig();
    }

    private string GetEmbeddedSql(string resourceName)
    {
        var asm = Assembly.GetExecutingAssembly();
        using (var stream = asm.GetManifestResourceStream($"{asm.GetName().Name}.{resourceName}"))
        using (var reader = new StreamReader(stream))
            return reader.ReadToEnd();
    }

    private void ExecuteSql(string db, string sql)
    {
        using (var cmd = new SqlCommand(sql, _conn))
        {
            cmd.Connection.Open();
            cmd.Connection.ChangeDatabase(db);
            try { cmd.ExecuteNonQuery(); }
            finally { cmd.Connection.Close(); }
        }
    }

    private void ModifyWebConfig()
    {
        string configPath = Path.Combine(Context.Parameters["targetdir"], "web.config");
        var doc = new XmlDocument();
        doc.Load(configPath);
        var node = doc.SelectSingleNode("//appSettings/add[@key='AdoConnBySql']");
        if (node == null) throw new InstallException("web.config 缺少連線字串設定");
        node.Attributes["value"].Value = 
            $"Provider=SQLOLEDB;Data Source={_server};User ID={_user};Password={_pwd};Initial Catalog=Water";
        doc.Save(configPath);
    }
}

效能優化:改用資料庫備份還原 (附代碼)

SQL 腳本法對大型資料庫 (數萬物件) 執行極慢。改用 `.bak` 還原:

private void RestoreDb()
{
    string bakPath = Path.Combine(Context.Parameters["targetdir"], "Water.bak");
    string sql = $@"
        RESTORE DATABASE Water 
        FROM DISK = '{bakPath}'
        WITH MOVE 'Water_Data' TO 'C:\Water.mdf',
             MOVE 'Water_Log'  TO 'C:\Water_Log.ldf',
             REPLACE, STATS = 10";
    ExecuteSql("master", sql);
}
  • 優點:秒級完成、包含統計資訊/索引/權限、避免腳本相容性問題。
  • 注意:邏輯檔名 (`Water_Data`, `Water_Log`) 需與備份時一致,可用 `RESTORE FILELISTONLY` 查詢。

常見坑點清單

現象原因解決
安裝時跳出「找不到 web.config」`targetdir` 結尾無反斜線、或網站輸出未包含 config檢查 `CustomActionData` 中 `targetdir` 格式、檔案系統編輯器確認內容檔案包含 `web.config`
SQL 執行逾時大型腳本超過 `SqlCommand.CommandTimeout` (預設 30s)設定 `cmd.CommandTimeout = 0` (無限) 或分批執行
使用者輸入含特殊字元導致連線字串解析錯密碼含 `;`, `'`, `=`, 空格等安裝 UI 加入驗證、或連線字串使用 `SqlConnectionStringBuilder` 建構
安裝完成但網站無法存取 DBSQL Server 防火牆/TCP 協定未啟用、或帳號權限不足安裝前置檢查腳本、或文件化部署前置條件

進階:支援升級/解除安裝

  • 覆寫 `Uninstall` 方法:備份資料庫 → `DROP DATABASE` → 還原 `web.config`。
  • 覆寫 `Rollback` 方法:安裝失敗時刪除已建立資料庫、回復檔案。
  • 使用 `InstallContext.LogMessage` 記錄詳細日誌至 MSI Log,便於客戶端除錯。

VS2005 Web 安裝專案雖屬經典技術,但其「檔案部署 + 自訂動作 + UI 收集參數」的架構思想,在現代 WiX、MSIX、容器化部署中依然通用。掌握核心邏輯,遷移至新工具鏈亦得心應手。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved