打包,並自動安裝SQL資料庫

來源:互聯網
上載者:User
打包|資料|資料庫|自動安裝 應一位網友的需求,並修正了MVP李洪根".NET平台下WEB應用程式的部署(安裝資料庫和自動設定)"中的osql用法錯誤,已測試通過。

一).建立部署項目
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. 將SQL Server備份成檔案DB.dat添加到“setup1”項目(在企業管理器中右擊資料庫->所有工作->備份資料庫,備份成一個檔案,取名為DB.dat)
2. 將安裝檔案LisenceFile.rtf添加到“setup1”項目
3. 在使用者介面編輯器中,選擇許可協議,設定LisenceFile屬性為LisenceFile.rtf檔案
4.一般會自動將依賴項添加到“檢測到的依賴項”,如果沒有,那麼我們要手動將其加入步驟5)
Crystal_Managed2003.msm (如果有水晶報表)
dotnetfxredist_x86.msm (.net一定是必須的)
... (如果有引用其他的dll)
5.如果使用了水晶報表,手動加入要包含的檔案:項目-->添加-->合併模組(添加你的程式檔案) (包括dotNetFramework和MDAC27),位於:C:\Program Files\Common Files\Merge Modules\ 下,*為必要的
具體功能如下:
(託管組件 MSM 處理所有託管組件的分發,其中包括 Windows 表單查看器、Web Form查看器和所有 Crystal Decisions 命名空間)
* Crystal_Managed2003.msm
Crystal_Managed2003_chs.msm
(對於使報表運行所需的所有其他檔案,由資料庫訪問 MSM 處理其分發。其中包括資料庫、匯出和圖表驅動程式。)
* Crystal_Database_access2003.msm
Crystal_Database_access2003_chs.msm
(KeyCode MSM 處理 Crystal Decisions 密鑰號碼的安裝,注意是添加合併模組,否則沒有“MergeMouduleProperties”屬性)
* Crystal_regwiz2003.msm
(如果報表檔案使用了 ADO.NET 的 dataset 資料集對象,那麼 VC_User_CRT71_RTL_X86_---.msm 和 VC_User_STL71_RTL_X86_---.msm 模組也必須包含在安裝工程中。而且這兩個模組的檔案安裝屬性的"Module Retargetable Folder"項必須修改成為系統目錄)
VC_User_CRT71_RTL_X86_---.msm
VC_User_STL71_RTL_X86_---.msm
(很多人經常出現查詢錯誤,不妨加上這個)
5.開啟解決方案-->右鍵點擊Crystal_regwiz2003.msm的屬性,在“MergeMouduleProperties”裡的“License Key”填入:AAP5GKS0000GDE100DS(這個是你產生Crystal Report是用到的註冊號的密碼!)


七).打包時加入卸載功能:
方法一:
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 :

Imports System.ComponentModel
Imports System.Configuration.Install

<RunInstaller(True)> Public Class Installer1
Inherits System.Configuration.Install.Installer

#Region " 組件設計器產生的程式碼 "

Public Sub New()
MyBase.New()

'該調用是組件設計器所必需的。
InitializeComponent()

'在 InitializeComponent() 調用之後添加任何初始化

End Sub

'Installer 重寫 dispose 以清理組件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'組件設計器所必需的
Private components As System.ComponentModel.IContainer

'注意: 以下過程是組件設計器所必需的
'可以使用組件設計器來修改此過程。
'不要使用代碼編輯器來修改它。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
components = New System.ComponentModel.Container
End Sub

#End Region


Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
MyBase.Install(stateSaver)
If Not InstallDB() Then
'失敗,反安裝
Me.Uninstall(stateSaver)
Exit Sub
End If
DeleteFile(String.Format("{0}DB.dat", Me.Context.Parameters.Item("targetdir")))
End Sub

Public Overrides Sub Uninstall(ByVal stateSaver As System.Collections.IDictionary)
'執行反安裝
MyBase.Uninstall(stateSaver)
DeleteFile(String.Format("{0}DB.dat", Me.Context.Parameters.Item("targetdir")))
End Sub

Private Sub DeleteFile(ByVal paths As String)
'刪除指定的檔案
Try
Dim delFile As New System.IO.FileInfo(paths)
If delFile.Exists Then
delFile.Delete()
End If
Catch ex As Exception
End Try
End Sub

Private Sub CreateSql(ByVal paths As String)
Dim File As System.IO.StreamWriter
Dim db As String = String.Format("{0}", Me.Context.Parameters.Item("dbname"))
Dim path As String = String.Format("{0}", Me.Context.Parameters.Item("targetdir"))
Try
Dim s As New System.Text.StringBuilder
s.Append("use master" & vbCrLf)
s.Append("" & vbCrLf)
s.Append("if not exists (select * from sysdatabases where name='" & db & "')" & vbCrLf)
s.Append(" BEGIN" & vbCrLf)
s.Append(" create database " & db & vbCrLf)
s.Append(" END" & vbCrLf)
s.Append("" & vbCrLf)
s.Append("if exists (select * from sysdevices where name='DBdisk')" & vbCrLf)
s.Append(" BEGIN" & vbCrLf)
s.Append(" EXEC sp_dropdevice 'DBdisk'" & vbCrLf)
s.Append(" END" & vbCrLf)
s.Append("Else" & vbCrLf)
s.Append(" BEGIN" & vbCrLf)
s.Append(" EXEC sp_addumpdevice 'disk','DBdisk', '" & path & "DB.dat'" & vbCrLf)
s.Append(" END" & vbCrLf)
s.Append("" & vbCrLf)
s.Append("restore database " & db & vbCrLf)
s.Append("from disk='" & path & "DB.dat'" & vbCrLf)
s.Append("with replace")
File = New System.IO.StreamWriter(paths)
File.Write(s.ToString)
Catch ex As Exception
Finally
File.Close()
End Try
End Sub

Private Function InstallDB() As Boolean
'安裝資料庫,調用自動批處理。
Try
'建立臨時指令碼
CreateSql(String.Format("{0}Mydb2000tp.sql", Me.Context.Parameters.Item("targetdir")))
'調用osql執行指令碼
Dim sqlProcess As New System.Diagnostics.Process
sqlProcess.StartInfo.FileName = "osql.exe"
sqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -S {2} -i {3}Mydb2000tp.sql", Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"), Me.Context.Parameters.Item("server"), Me.Context.Parameters.Item("targetdir"))
sqlProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
sqlProcess.Start()
sqlProcess.WaitForExit() '等待執行
sqlProcess.Close()
'刪除指令檔
DeleteFile(String.Format("{0}Mydb2000tp.sql", Me.Context.Parameters.Item("targetdir")))
Return True
Catch ex As Exception
Return False
End Try
End Function

End Class



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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