Asp.net與SQL一起打包部署安裝(收集)
Asp.net與SQL一起打包部署安裝
借鑒MSDN webcasts的Asp.net程式部署和李洪根的一篇文章,然後加上自己的親身體會,把整個SQL和Asp.net(vb.net)一起打包的全過程寫一下。
一.準備必要的檔案
1. SQL指令檔,產生以後安裝過程中需要的表和預存程序等等;
產生之後,就暫時把它命名為db.sql(注意大小寫)
2.LisenceFile.rtf的安裝檔案,因為我的系統是個人的,而且free的,所以就沒有做。這個以後也是要用到的。
二.在自己現有的項目裡面建立部署項目:
1. 在檔案菜單上指向添加項目,然後選擇建立項目。(圖1-2)
2. 在添加新項目對話方塊中,選擇項目類型窗格中的安裝和部署項目,然後選擇模板窗格中的Web 安裝項目。在名稱框中鍵入 Test Installer。(圖1-3)
3. 單擊確定關閉對話方塊。
4. 項目被添加到方案總管中,並且檔案系統編輯器開啟。
5. 在屬性視窗中,選擇 ProductName 屬性,並鍵入 GCRM。
(1-2)
(圖1-3)其他項目的作用可以參考Webcast
三。將 VbNetTest項目的輸出添加到部署項目中(假如你的虛擬目錄是SQLANDASPNet)
1. 在檔案系統編輯器中,選擇Web 應用程式檔案夾"。在操作菜單上,指向添加,然後選擇項目輸出。(圖1-4)
2. 在添加項目輸出組對話方塊中,選擇項目下拉式清單中的SQLANDASPNet。
3. 單擊確定關閉對話方塊。
4. 從列表中選擇主輸出和內容檔案組,然後單擊確定。(圖1-5)
(圖1-4)
(圖1-5)其他的作用可以參考webcast,源檔案就是所有項目的的檔案
四.
建立自訂安裝對話方塊
1. 在方案總管中選擇Test Installer項目。在視圖菜單上指向編輯器,然後選擇使用者介面。 (圖1-6)
2. 在使用者介面編輯器中,選擇安裝下的啟動節點。在操作菜單上,選擇添加對話方塊。
3. 在添加對話方塊對話方塊中,選擇許可協議對話方塊,然後單擊確定關閉對話方塊。 (註:我沒有添加,因為暫時我還是不需要,需要的要添加一下哦)
4. 在添加對話方塊對話方塊中,選擇文字框 (A)對話方塊,然後單擊確定關閉對話方塊。 (圖1-7)
5. 在操作菜單上,選擇上移。重複此步驟,直到文字框 (A)對話方塊位於安裝資料夾節點之上。
6. 在屬性視窗中,選擇 BannerText 屬性並鍵入:安裝資料庫.。
7. 選擇 BodyText 屬性並鍵入:安裝程式將在目標機器上安裝資料庫。
8. 選擇 Edit1Label 屬性並鍵入:資料庫名稱:。
9. 選擇 Edit1Property 屬性並鍵入 CUSTOMTEXTA1。
10. 選擇 Edit1Value 屬性並鍵入:GsCrm。
11. 選擇 Edit2Label 屬性並鍵入:伺服器名:。
12. 選擇 Edit2Property 屬性並鍵入 CUSTOMTEXTA2。
13. 選擇 Edit2Value 屬性並鍵入:(local)。
14. 選擇 Edit3Label 屬性並鍵入:使用者名稱:。
15. 選擇 Edit3Value 屬性並鍵入:sa。
16. 選擇 Edit3Property 屬性並鍵入 CUSTOMTEXTA3。
17. 選擇 Edit4Label 屬性並鍵入:密碼:。
18. 選擇 Edit4Property 屬性並鍵入 CUSTOMTEXTA4。
19. 選擇 Edit2Visible、Edit3Visible ,並將它們設定為 False。(圖1-8)
(圖1-7)
(圖1-8)
(五).建立自訂動作
1. 在方案總管中選擇Test Installer項目。在視圖菜單上指向編輯器,然後選擇自訂動作。(圖1-9)
2. 在自訂動作編輯器中選擇安裝節點。在操作菜單上,選擇添加自訂動作。
3. 在選擇項目中的項對話方塊中,雙擊應用程式檔案夾。
4. 選擇主輸出來自 DBCustomAction(活動)項,然後單擊確定關閉對話方塊。
5. 在屬性視窗中,選擇 CustomActionData 屬性並鍵入 /dbname=[CUSTOMTEXTA1] /server=[CUSTOMTEXTA2] /user=[CUSTOMTEXTA3] /pwd=[CUSTOMTEXTA4] /targetdir="[TARGETDIR]\"。 (圖1-10)
附/targetdir="[targetdir]\"是安裝後的目標路徑,為了在dbcustomaction類中獲得安裝後的路徑,我們設定此參數。
另外,安裝後的路徑也可以通過Reflection得到:
Dim Asm As System.Reflection.Assembly = _
System.Reflection.Assembly.GetExecutingAssembly
MsgBox("Asm.Location")
(圖1-9)
(圖1-10)
呵呵,已經好多了,剩下來的是關鍵性步驟,我花了好多時間研究。
(六)建立安裝程式類
1. 在檔案菜單上指向建立,然後選擇項目。
2. 在建立項目對話方塊中,選擇項目類型窗格中的Visual Basic 項目,然後選擇模板窗格中的類庫。在名稱框中鍵入 DBCustomAction。
3. 單擊開啟關閉對話方塊。
4. 從項目菜單中選擇添加新項。
5. 在添加新項對話方塊中選擇安裝程式類。在名稱框中鍵入 DBCustomAction。
6. 單擊確定關閉對話方塊。(圖1-11,1-12)
注:這裡是在原來的項目上建立一個簡單的安裝檔案就可以了。
(圖1-11)
添加後的:
(圖1-12)這裡的sql檔案是要等一下添加的
(七)
添加檔案
1. 將SQL Server產生的指令檔db.sql添加到Test Installer項目(圖1-12)
2. 將安裝檔案LisenceFile.rtf添加到Test Installer項目
3. 在使用者介面編輯器中,選擇許可協議,設定LisenceFile屬性為LisenceFile.rtf檔案
(八)
一下的代碼是整個部署的最重要的一部分了
將代碼添加到安裝程式類中,dbcustomaction.vb類
1ImportsSystem.ComponentModel
2
3importsSystem.Configuration.Install
4
5importsSystem.IO
6
7importsSystem.Reflection
8
9
10
11<runinstaller(true)>PublicClassDBCustomActionClassDBCustomAction
12
13inheritsSystem.Configuration.Install.Installer
14
15
16
17組件設計器產生的程式碼#region"組件設計器產生的程式碼"
18
19publicSubNew()SubNew()
20
21mybase.new()
22
23'該調用是組件設計器所必需的
24
25initializecomponent()
26
27'在InitializeComponent()調用之後添加任何初始化
28
29endSub
30
31'Installer重寫dispose以清理組件列表。
32
33protectedOverloadsOverridesSubDispose()SubDispose(ByValdisposingAsBoolean)
34
35ifdisposingThen
36
37ifNot(componentsIsNothing)Then
38
39components.dispose()
40
41endIf
42
43endIf
44
45mybase.dispose(disposing)
46
47endSub
48
49privatecomponentsAsSystem.ComponentModel.IContainer
50
51<system.diagnostics.debuggerstepthrough()>PrivateSubInitializeComponent()SubInitializeComponent()
52
53endSub
54
55#endRegion
56
57'執行sql語句
58
59privateSubExecuteSql()SubExecuteSql(ByValconnAsString,ByValDatabaseNameAsString,ByValSqlAsString)
60
61dimmySqlConnectionAsNewSqlClient.SqlConnection(conn)
62
63dimCommandAsNewSqlClient.SqlCommand(Sql,mySqlConnection)
64
65command.connection.open()
66
67command.connection.changedatabase(databasename)
68
69try
70
71command.executenonquery()
72
73finally
74
75'closeConnection
76
77command.connection.close()
78
79endTry
80
81endSub
82
83publicOverridesSubInstall()SubInstall(ByValstateSaverAsSystem.Collections.IDictionary)
84MyBase.Install(stateSaver)
85
86'------------------------建立資料庫-------------------------------------------------
87
88try
89
90dimconnStrAsString=String.Format("datasource={0};userid={1};password={2};persistsecurityinfo=false;packetsize=4096",Me.Context.Parameters.Item("server"),Me.Context.Parameters.Item("user"),Me.Context.Parameters.Item("pwd"))
91
92'根據輸入的資料庫名稱建立資料庫
93
94executesql(connstr,"master","CreateDATABASE"+Me.Context.Parameters.Item("dbname"))
95
96'調用osql執行指令碼
97
98dimsqlProcessAsNewSystem.Diagnostics.Process
99
100sqlprocess.startinfo.filename="osql.exe"
101
102sqlprocess.startinfo.arguments=String.Format("-U{0}-P{1}-d{2}-i{3}db.sql",Me.Context.Parameters.Item("user"),Me.Context.Parameters.Item("pwd"),Me.Context.Parameters.Item("dbname"),Me.Context.Parameters.Item("targetdir"))
103
104sqlprocess.startinfo.windowstyle=ProcessWindowStyle.Hidden
105
106sqlprocess.start()
107
108sqlprocess.waitforexit()'等待執行
109
110sqlprocess.close()
111
112'刪除指令檔
113
114dimsqlFileInfoAsNewSystem.IO.FileInfo(String.Format("{0}db.sql",Me.Context.Parameters.Item("targetdir")))
115
116ifsqlFileInfo.ExistsThen
117
118sqlfileinfo.delete()
119
120endIf
121
122catchexAsException
123
124throwex
125
126endTry
127
128
129
130'---------------------將連接字串寫入Web.config-----------------------------------
131
132try
133
134dimFileInfoAsSystem.IO.FileInfo=NewSystem.IO.FileInfo(Me.Context.Parameters.Item("targetdir")&"\web.config")
135
136ifNotFileInfo.ExistsThen
137
138throwNewInstallException("沒有找到設定檔")
139
140endIf
141
142'執行個體化xml文檔
143
144dimXmlDocumentAsNewSystem.Xml.XmlDocument
145
146xmldocument.load(fileinfo.fullname)
147
148
149
150'尋找到appsettings中的節點
151
152dimNodeAsSystem.Xml.XmlNode
153
154dimFoundItAsBoolean=False
155
156forEachNodeInXmlDocument.Item("configuration").Item("appSettings")
157
158ifNode.Name="add"Then
159
160ifNode.Attributes.GetNamedItem("key").Value="connString"Then
161
162'寫入連接字串
163
164node.attributes.getnameditem("value").value=String.Format("PersistSecurityInfo=False;DataSource={0};InitialCatalog={1};UserID={2};Password={3};PacketSize=4096;Pooling=true;MaxPoolSize=100;MinPoolSize=1",_
165
166me.context.parameters.item("server"),Me.Context.Parameters.Item("dbname"),Me.Context.Parameters.Item("user"),Me.Context.Parameters.Item("pwd"))
167
168foundit=True
169
170endIf
171
172endIf
173
174nextNode
175
176ifNotFoundItThen
177
178throwNewInstallException("web.Config檔案沒有包含connString連接字串設定")
179
180endIf
181
182xmldocument.save(fileinfo.fullname)
183
184catchexAsException
185
186throwex
187
188endTry
189
190endSub
191
192endClass
193
194
有點難度的就是那個Process類,它調用了osql.exe程式,來執行sql語句osql -U,-P,,-d,-i。
web.config的修改代碼是利用xml的文法實現。不是很難理解。
最後編譯產生!
安裝介面:
哈哈,總算寫完了,也不知道有沒有寫好。
最後還是感謝李洪根老師和微軟的講師。結合他們的共同的經驗,部署起來真的很簡單。