Setup.exe、.msi 與 .ini 執行安裝MyInstaller.csGO 關鍵字mytable.sql 加入專案,設定「建置動作」為「內嵌資源」MyInstaller.cs 實作資源讀取與執行邏輯:
private string GetSql(string name)
{
var asm = Assembly.GetExecutingAssembly();
using var stream = asm.GetManifestResourceStream($"{asm.GetName().Name}.{name}");
using var reader = new StreamReader(stream);
return reader.ReadToEnd();
}
private void ExecuteSql(string dbName, string sql)
{
using var conn = new SqlConnection("server=myserver;uid=sa;pwd=;database=master");
using var cmd = new SqlCommand(sql, conn);
conn.Open();
conn.ChangeDatabase(dbName);
cmd.ExecuteNonQuery();
}
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
ExecuteSql("master", "CREATE DATABASE MyDB");
ExecuteSql("MyDB", GetSql("mytable.sql"));
}
MySetup,加入主要輸出假設三層結構:a1 (id, name) → a2 (id, parent_id, name) → a3 (id, parent_id, name)
// 填充三個 DataTable 到 DataSet
// 建立 DataRelation: a1-a2 (a1a2), a2-a3 (a2a3)
foreach (DataRow drA1 in ds.Tables["a1"].Rows)
{
var tn1 = new TreeNode(drA1["name"].ToString());
treeView1.Nodes.Add(tn1);
foreach (DataRow drA2 in drA1.GetChildRows("a1a2"))
{
var tn2 = new TreeNode(drA2["name"].ToString());
tn1.Nodes.Add(tn2);
foreach (DataRow drA3 in drA2.GetChildRows("a2a3"))
{
var tn3 = new TreeNode(drA3["name"].ToString());
tn2.Nodes.Add(tn3);
}
}
}
場景:Form2 的資料傳回 Form1 的 TextBox
public delegate void SendData(object sender);
public SendData sendData;
// 在按鈕點擊事件中
if (sendData != null)
{
sendData(txtBoxAtForm2);
}
this.Close();
var form2 = new Form2();
form2.sendData = new Form2.SendData(MyFunction);
form2.ShowDialog();
private void MyFunction(object sender)
{
textBox1.Text = ((TextBox)sender).Text;
}
此模式實現鬆耦合通訊,Form2 無需知道 Form1 具體實現。