.net打包並自動安裝MS SQL Server資料庫

來源:互聯網
上載者:User

 本文轉自 http://hi.baidu.com/sunsonruby/blog/item/62f8a6137dd51324dd5401b6.html

一).建立部署項目
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:\windows\system32\下找到)
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();
   
   }

當然打包的時候也要把這兩個資料庫檔案也加進來。

----------------------------------------------------------------------
或者採用執行系統預存程序:
sp_attach_db // 附加資料庫檔案到伺服器


sp_attach_db_single_file // 附加資料庫的單個檔案到伺服器

具體的sql 語句就是:

例如:
EXEC sp_attach_single_file_db ’pubs’, ’e:\data\pubs.mdf’

sp_attach_db @dbname=”conmis2000″,@filename1=”d:\1\conmis2000_data.mdf”,@filename2=” d:\1\conmis2000_log.ldf”

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.