一).建立部署項目
1. 在“檔案”功能表上指向“新增項目”,然後選擇“新項目”。
2. 在“新增項目”對話方塊中,選擇“專案類型”窗格中的“安裝和部署專案”,然後選擇“範本”窗格中的“安裝專案”。在「名稱」方塊中鍵入setup1。
3. 按一下「確定」關閉對話方塊。
4. 專案被加入到解決方案資源管理器中,並且檔案系統編輯器開啟。
5. 在「屬性」視窗中,選擇ProductName 屬性,並鍵入資訊管理系統。
二).將主程式專案的輸出加入部署專案中
1. 在「檔案系統編輯器」中,選擇「應用程式資料夾」。在“操作”功能表上,指向“新增”,然後選擇“項目輸出”。
2. 在「新增項目輸出群組」對話方塊中,選擇「項目」下拉清單中的「你的程式」。
3. 按一下「確定」關閉對話方塊。
4. 從清單中選擇「主輸出」和「內容檔案」群組,然後按一下「確定」。
三).創建安裝程式類
1. 在“檔案”選單上指向“新建”,然後選擇“項目”。
2. 在“新專案”對話方塊中,選擇“專案類型”窗格中的“Visual Basic 專案”,然後選擇“範本”窗格中的“類別庫”。在「名稱」方塊中鍵入installDB。
3. 按一下「開啟」關閉對話方塊。
4. 從「項目」選單中選擇「新增項目」。
5. 在「新增項目」對話方塊中選擇「安裝程式類別」。在「名稱」方塊中鍵入installDB。
6. 按一下「確定」關閉對話方塊。
7. 詳細代碼附後。
四).建立自訂安裝對話框
1. 在解決方案資源管理器中選擇「setup1」項目。在“視圖”功能表上指向“編輯器”,然後選擇“使用者介面”。
2. 在使用者介面編輯器中,選擇「安裝」下的「啟動」節點。在「操作」功能表上,選擇「新增對話方塊」。
3. 在「新增對話框」對話框中,選擇「許可協議」對話框,然後按一下「確定」關閉對話框。
4. 在「新增對話框」對話框中,選擇「文字方塊(A)」對話框,然後按一下「確定」關閉對話框。
5. 在「操作」功能表上,選擇「上移」。重複此步驟,直到「文字方塊(A)」對話方塊位於「安裝資料夾」節點之上。
6. 在「屬性」視窗中,選擇BannerText 屬性並鍵入:安裝資料庫.
7. 選擇BodyText 屬性並鍵入:安裝程式將在目標機器上安裝資料庫
8. 選擇Edit1Label 屬性並鍵入:資料庫名稱:
9. 選擇Edit1Property 屬性並鍵入CUSTOMTEXTA1
10. 選擇Edit1Value 屬性並鍵入:dbservers
11. 選擇Edit2Label 屬性並鍵入:伺服器名稱:
12. 選擇Edit2Property 屬性並鍵入CUSTOMTEXTA2
13. 選擇Edit2Value 屬性並鍵入:(local)
14. 選擇Edit3Label 屬性並鍵入:使用者名稱:
15. 選擇Edit3Value 屬性並鍵入:sa
16. 選擇Edit3Property 屬性並鍵入CUSTOMTEXTA3
17. 選擇Edit4Label 屬性並鍵入:密碼:
18. 選擇Edit4Property 屬性並鍵入CUSTOMTEXTA4
19. 選擇Edit2Visible、Edit3Visible 和Edit4Visible 屬性,並將它們設為true
五).建立自訂操作
1. 在解決方案資源管理器中選擇「setup1」項目。在“檢視”功能表上指向“編輯器”,然後選擇“自訂操作”。
2. 在自訂操作編輯器中選擇「安裝」節點。在“操作”功能表上,選擇“新增自訂操作”。
3. 在「選擇專案中的項目」對話方塊中,雙擊「應用程式資料夾」。
4. 選擇「主輸出來自installDB(活動)」項,然後按一下「確定」關閉對話方塊。
5. 在「屬性」視窗中,選擇CustomActionData 屬性並鍵入「/dbname=[CUSTOMTEXTA1] /server=[CUSTOMTEXTA2] /user=[CUSTOMTEXTA3] /pwd=[CUSTOMTEXTA4] /targetdir="[TARGETDIR]」。
附:/targetdir="[TARGETDIR]"是安裝後的目標路徑,為了在installDB類別中獲得安裝後的路徑,我們設定此參數。
六).打包時加入卸載功能:
方法一:
1.在打包項目中新增檔案msiexec.exe(一般可在c:windowssystem32下找到)
2.在檔案系統視圖中選擇應用程式檔案夾,在msiexec.exe上按右鍵,選擇建立捷徑,重新命名捷徑為"卸載".
3.更改此捷徑的Arguments 為"/x {產品id}",產品id的值為打包項目的ProductCode屬性值.
方法二:(推薦)
1.先生成安裝包,記下ProductCode(選擇解決方案資源管理器根目錄如setup1,再查看屬性標籤,不是右鍵中的屬性),下面要用到
2.用VS.net建立新的控制台程式uninst.exe文件
'power by: landlordh
'for 2000,xp,2003
Module uninstall
Sub Main()
Dim myProcess As Process = New Process
If System.Environment.OSVersion.ToString.IndexOf("NT 5") Then
myProcess.Start("msiexec", "/X{2B65D4A9-C146-4808-AB4B-321FB0779559}") '改為自己的ProductCode
End If
myProcess.Close()
End Sub
End Module
3.將控制台程式BIN目錄的exe檔加入到打包程式檔案中,在程式組建立uninst.exe的捷徑
installdb.vb類別,要新增參考system.configuration.install.dll :
using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
using System.Reflection;
using System.IO;
using System.Data;
using System.Data.SqlClient;
namespace install
{
/// <summary>
/// Installer1 的摘要說明。
/// </summary>
[RunInstaller(true)]
public class Installer1 : System.Configuration.Install.Installer
{
/// <summary>
/// 必需的設計器變數。
/// </summary>
private System.ComponentModel.Container components = null;
public Installer1()
{
// 該呼叫是設計器所必需的。
InitializeComponent();
// TODO: 在InitializeComponent 呼叫後加入任何初始化
}
/// <summary>
/// 清理所有正在使用的資源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region 元件設計器產生的程式碼
/// <summary>
/// 設計器支援所需的方法- 不要使用程式碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
private string GetSql(string Name)
{
// //呼叫osql執行腳本
//
// System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
//
// sqlProcess.StartInfo.FileName = "osql.exe";
//
// sqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -d {2} -i {3}db.sql", this.Context.Parameters["user"], this .Context.Parameters["pwd"],"master", this.Context.Parameters["targetdir"]);
//
// sqlProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//
// sqlProcess.Start();
//
// sqlProcess.WaitForExit() ;//等待執行
//
// sqlProcess.Close();
try
{
// Assembly Asm = Assembly.GetExecutingAssembly();
// System.IO.FileInfo FileInfo = new System.IO.FileInfo(Asm.Location);
// string path=FileInfo.DirectoryName+@""+Name ;
string path=this.Context.Parameters["targetdir"]+Name;
FileStream fs=new FileStream(path,FileMode.Open,FileAccess.Read,FileShare.Read);
StreamReader reader = new StreamReader(fs,System.Text.Encoding.Default);
//System.Text.Encoding.ASCII;
return reader.ReadToEnd();
}
catch (Exception ex)
{
Console.Write("In GetSql:"+ex.Message);
throw ex;
}
}
private void ExecuteSql(string DataBaseName,string Sql)
{
SqlConnection sqlConnection1=new SqlConnection();
sqlConnection1.ConnectionString =string.Format("server={0}; user id={1}; password={2}; Database=master",this.Context.Parameters["server"],this.Context.Parameters[ "user"],this.Context.Parameters["pwd"]);
System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql,sqlConnection1);
try
{
Command.Connection.Open();
Command.Connection.ChangeDatabase(DataBaseName);
Command.ExecuteNonQuery();
}
catch(Exception ex)
{
Console.Write("In exception handler :"+ex.Message);
}
finally
{
Command.Connection.Close();
}
}
protected void AddDBTable(string strDBName)
{
try
{
ExecuteSql("master","CREATE DATABASE "+ strDBName);
ExecuteSql(strDBName,GetSql("sql.txt"));
ExecuteSql("master","exec sp_addlogin 'myoamaster','myoamaster','"+strDBName+"',Null,Null");
ExecuteSql(strDBName,"EXEC sp_grantdbaccess 'myoamaster', 'myoamaster'");
ExecuteSql(strDBName,"exec sp_addrolemember 'db_owner','myoamaster'");
}
catch(Exception ex)
{
Console.Write("In exception handler :"+ex.Message);
}
}
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
AddDBTable(this.Context.Parameters["dbname"]);
}
}
}
這裡有個sql.txt是資料庫的sql腳本,當然可以呼叫osql來執行sql腳本,其實是一樣的。
打包的時候必須把sql.txt檔案加進來,否則不會執行。
如果你想附加資料庫的mdf檔案和ldf文件,用下面這段程式:
private void CreateDataBase(string strSql,string DataName,string strMdf,string strLdf)
{
String str;
SqlConnection myConn = new SqlConnection (strSql);
//EXEC sp_detach_db @dbname = 'BX_FreightMileage_2'//需要先將資料庫分開出來
str = "EXEC sp_attach_db @dbname = '"+ DataName +"', @filename1 = '"+ strMdf +"',@filename2='"+strLdf+"'";
SqlCommand myCommand = new SqlCommand(str, myConn);
myConn.Open();
myCommand.ExecuteNonQuery();
myConn.Close();
}
當然打包的時候也要把這兩個資料庫檔案也加進來。