1. 程式人生 > >C#專案打包,並自動安裝SQL資料庫

C#專案打包,並自動安裝SQL資料庫

應一位網友的需求,並修正了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 窗體檢視器和所有 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

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

'注意: 以下過程是元件設計器所必需的
'可以使用元件設計器來修改此過程。
'不要使用程式碼編輯器來修改它。
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

相關推薦

C#專案打包自動安裝SQL資料庫

應一位網友的需求,並修正了MVP李洪根".NET平臺下WEB應用程式的部署(安裝資料庫和自動配置)"中的osql用法錯誤,已測試通過。 一).建立部署專案 1. 在“檔案”選單上指向“新增專案”,然後選擇“新建專案”。 2. 在“新增新專案”對話方塊中,選擇“專案型別”窗格中的“安裝和部署專案”,然後選擇“模

Android使用系統DownloadManager下載更新軟體自動跳轉到安裝頁面

介紹:https://www.jianshu.com/p/7ad92b3d9069 1.下載apk /* * 下載apk * @param context * @param title 通知的標題 * @param url 下載的地址 * @param id 返回一個加入下載佇列的i

自動打包-debug 和 release 模式自動生成包名

1. 我們在工作的時候,經常遇到測試的程式,但是測試程式只適合除錯使用,不能參與線上釋出。為了達到這個要求。我們通常定義一個靜態全域性變數。來控制測試程式碼和線上程式碼。 之前找了好多資料,都特別複雜,之後找到一個易用實用的方法。一句話程式碼: UavStaticVar.is

centos7下安裝git服務端自動更新到web目錄

1.伺服器安裝git ①yum安裝 [[email protected] home]#yum install -y git ②檢視版本 [[email protected] home]# git --version git version 1.7.1 2.建立git使用者

cocos2dx 命令建立各平臺工程自動打包Android apk的方法

轉自:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_create_a_multi-platform_project_in_one_command_line How to create a multi-pla

Centos上搭建jenkins自動部署Spring Boot專案。(附遇到的問題及解決方案)

最近嘗試自己搭建jenkins自動部署環境,將整個過程及遇到的問題記下來,希望能夠幫助到一些朋友! 本文使用的環境是:Cent os7.2,maven3.5.3,JDK8,jenkins2.136 首先需要在你的伺服器上配好相關的JDK與maven,還要在系統上安裝好gi

安裝exitmail的日誌系統自動傳送郵件過來

我是在這下載的 http://download.chinaunix.net/download/0009000/8004.shtml 直接下載的1.5的,使用沒問題 然後就是解壓,然後copy到/usr/bin,裡面,並且改成755 cp pflogsumm.pl /usr/

Swift - 判斷是否有某功能訪問權限沒有則提示自動跳轉到設置頁

權限 cells key 選擇 href ref options title kit 由於 iOS 系統的安全限制,App 如果需要訪問設備的通訊錄、麥克風、 相冊、 相機、地理位置等時,需要請求用戶是否允許訪問。 有時用戶不小心點了“不允許”,後面可能就不知道要去

jenkins 自由風格構建war包自動部署(jenkins和tomcat同一臺機器)

jenkins 自由風格 環境:centos7.3 ip:192.168.216.130 參考 http://www.cnblogs.com/h--d/p/5682030.html一 在正式構建之前需要先設置下jenkins1 點擊Manage Jenkins,然後點擊Global Tool

supervisor監聽程式碼的改動自動重啟nodejs

問題: 在開發nodejs實現的HTTP WEB應用的時候,無論你修改程式碼的那一部分,都必須終止nodejs,再重新執行才奏效。 原因: nodejs只有在第一次引用到某部分時候才去解析指令碼檔案,以後都會直接訪問記憶體,避免重複載入,而PHP則總是重新讀取並解析指令碼(如果沒

js獲取當前時間與星期幾自動跟隨時間變動

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; char

列印資訊輸出到lcd、自動登入串列埠 自動執行程式

一、列印資訊輸出到lcd   1、傳統方法 在/etc/inittab檔案里加入下面一行 tty1::respawn:/sbin/getty 38400 tty1   2、systemd方法 a、進入lib/systemd/system b、拷貝[email protect

完美實現tabsheet中融合窗體不重複建立自動切換到已經建立的sheet

procedure TForm1.btn1Click(Sender: TObject);  //功能說明  點選時,建立視窗並顯示到sheet中,再並點選時如果已經有則不再建立;     //如果已經有開啟的則要切換成當前活動的。專案設定中取消指定窗體

品優購專案筆記day01——(SOA架構Dubbox及小demoZookeeper專案打包管理中心linux環境部署與專案架構搭建)

此部落格是為了記錄業餘時間每一天課程的所學 1.什麼是SOA架構 SOA是Service-Oriented Architecture的首字母簡稱,它是一種支援面向服務的架構樣式。從服務、基於服務開發和服務的結果來看,面向服務是一種思考方式。其實SOA架構更多應用於網際網路專案開發。

Docker Win 10 系統下配置和安裝解決安裝遇到的問題!

目前支援Windows安裝的Docker軟體主要分為兩類: 一是基於win10 系統的Docker for Windows,這個只能裝在win 10 系統可以用;還有一個就是Docker Toolbox,可以安裝在win7,8,10等系統中。 本文主要是在Win10下安裝

一個java專案引入jar包後再把這個java專案打包遇到的jar找不到的問題

參考文章: 步驟1:準備主清單檔案 “MANIFEST.MF”, 由於是打包引用了第三方jar包的Java專案,故需要自定義配置檔案MANIFEST.MF,在該專案下建立檔案MANIFEST.MF,內容如下: Manifest-Version: 1.0 Class-

spring boot 專案打包配置構建外掛

Spring Boot:jar中沒有主清單屬性 使用Spring Boot微服務搭建框架,在eclipse和Idea下能正常執行,但是在打成jar包部署或者直接使用java -jar命令的時候,提示了xxxxxx.jar中沒有主清單屬性: D:\hu-git\spr

爬取抖音Top20視訊自動播放

from time import sleep from glob import iglob from requests import get from natsort import natsorted from win32api import ShellExecute from moviepy.ed

多個exe程式一起打包按順序安裝

通過bat的start /wait順序安裝exe。 **@echo off cls echo 開始安裝setup,預計需要2分鐘左右時間……. start /wait .\setup.exe echo 開始安裝Setup Screen Captur

Ubuntu中安裝和配置 Java JDK解除安裝自帶OpenJDK(以Ubuntu 12.04為例)

1.下載jdk-7u25-linux-i586.tar.gz 2.修改jdk-7u25-linux-i586.tar.gz的可執行許可權,最簡單的方法是賦予許可權,即: chmod 755 jdk