SetSqlConStr.cs 完整實作
using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Configuration;
using System.Xml;
using System.IO;
namespace SetSetup
{
[RunInstaller(true)]
public partial class SetSqlConStr : Installer
{
public SetSqlConStr() { InitializeComponent(); }
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
// 從 CustomActionData 取得參數
string sqlServerIP = Context.Parameters["SqlServerIP"];
string database = Context.Parameters["DataBase"];
string userName = Context.Parameters["UserName"];
string password = Context.Parameters["Password"];
string targetDir = Context.Parameters["TargetDir"]; // 含尾隨 \
// 組裝連線字串
string conString = string.Format(
"Data Source={0};Initial Catalog={1};User ID={2};Password={3};Persist Security Info=True",
sqlServerIP, database, userName, password);
// 更新設定檔
UpdateConConfig("ConnectionString", conString, targetDir + "WinUI.exe.config");
}
public static void UpdateConConfig(string conName, string conString, string configPath)
{
var xmlDoc = new XmlDocument();
xmlDoc.Load(configPath);
var node = xmlDoc.SelectSingleNode(
"configuration/connectionStrings/add[@name='" + conName + "']");
node.Attributes["connectionString"].InnerText = conString;
xmlDoc.Save(configPath);
}
public override void Uninstall(IDictionary savedState) { base.Uninstall(savedState); }
public override void Commit(IDictionary savedState) { base.Commit(savedState); }
public override void Rollback(IDictionary savedState) { base.Rollback(savedState); }
}
}
關鍵點解析
[RunInstaller(true)]:標記此類別為安裝程式可執行的安裝元件。
Context.Parameters:對應 CustomActionData 中的鍵值對 (不區分大小寫)。
TargetDir 來自 [TARGETDIR],必須在 CustomActionData 中加上尾隨反斜線 ( "[TARGETDIR]\" ),否則路徑串接會出錯。
- 使用
XmlDocument 操作 XML,透過 XPath 定位 connectionStrings/add 節點修改屬性值。
- 實作
Uninstall/Commit/Rollback 確保交易完整性 (雖本範例僅呼叫基底)。