Visual Studio 2005 的「Web 安裝專案」範本,結合「安裝程式類別」自訂動作,可實現:一鍵部署網站檔案、建立資料庫結構/資料、修改 web.config 連線字串、收集使用者輸入 (DB Server/帳號/密碼) 的完整安裝體驗。本文以實戰步驟記錄全流程,並提供「備份還原法」替代 SQL 腳本法的效能優化方案。
[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);
}
| 現象 | 原因 | 解決 |
|---|---|---|
| 安裝時跳出「找不到 web.config」 | `targetdir` 結尾無反斜線、或網站輸出未包含 config | 檢查 `CustomActionData` 中 `targetdir` 格式、檔案系統編輯器確認內容檔案包含 `web.config` |
| SQL 執行逾時 | 大型腳本超過 `SqlCommand.CommandTimeout` (預設 30s) | 設定 `cmd.CommandTimeout = 0` (無限) 或分批執行 |
| 使用者輸入含特殊字元導致連線字串解析錯 | 密碼含 `;`, `'`, `=`, 空格等 | 安裝 UI 加入驗證、或連線字串使用 `SqlConnectionStringBuilder` 建構 |
| 安裝完成但網站無法存取 DB | SQL Server 防火牆/TCP 協定未啟用、或帳號權限不足 | 安裝前置檢查腳本、或文件化部署前置條件 |
VS2005 Web 安裝專案雖屬經典技術,但其「檔案部署 + 自訂動作 + UI 收集參數」的架構思想,在現代 WiX、MSIX、容器化部署中依然通用。掌握核心邏輯,遷移至新工具鏈亦得心應手。