asp.net mysql打包_Asp.net与SQL一起打包部署安装(转载)

借鉴MSDN webcasts的Asp.net程序部署和李洪根的一篇文章,然后加上自己的亲身体会,把整个SQL和Asp.net(vb.net)一起打包的全过程写一下。

一.准备必要的文件

1. SQL脚本文件,生成以后安装过程中需要的表和存储过程等等;

791301da68180f24084b5a18c3423c36.gif

生成之后,就暂时把它命名为db.sql(注意大小写)

2.LisenceFile.rtf的安装文件,因为我的系统是个人的,而且free的,所以就没有做。这个以后也是要用到的。

二.在自己现有的项目里面创建部署项目:

1. 在“文件”菜单上指向“添加项目”,然后选择“新建项目”。(图1-2)

2. 在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“Web 安装项目”。在“名称”框中键入 Test Installer。(图1-3)

3. 单击“确定”关闭对话框。

4. 项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。

5. 在“属性”窗口中,选择 ProductName 属性,并键入 GCRM。

7dbeab201012ed4011874fc8c2a27ecd.gif

(1-2)

8239c6a476963e2134ec09bec059c3ca.gif

(图1-3)其他项目的作用可以参考Webcast

三。将 VbNetTest项目的输出添加到部署项目中(假如你的虚拟目录是SQLANDASPNet)

1. 在“文件系统编辑器”中,选择“Web 应用程序文件夹"。在“操作”菜单上,指向“添加”,然后选择“项目输出”。(图1-4)

2. 在“添加项目输出组”对话框中,选择“项目”下拉列表中的“SQLANDASPNet”。

3. 单击“确定”关闭对话框。

4. 从列表中选择“主输出”和“内容文件”组,然后单击“确定”。(图1-5)

936e844109648c3cb8a22f38c62ee842.gif

(图1-4)

b701e3d72bd4a58d7935d258ac57eee8.gif

(图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)

0cb589f60d973a08bf44a798b47ce123.gif

3fcb06450409d1abcf9c7269d5ca3102.gif

(图1-7)

c36feb10287d8c71edf235b430a9bbad.gif

(图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")

bc1506f842fc8f13c374942a6513209d.gif

(图1-9)

26872058c79de6887f7e65052a392c0c.gif

(图1-10)

呵呵,已经好多了,剩下来的是关键性步骤,我花了好多时间研究。

(六)创建安装程序类

1. 在“文件”菜单上指向“新建”,然后选择“项目”。

2. 在“新建项目”对话框中,选择“项目类型”窗格中的“Visual Basic 项目”,然后选择“模板”窗格中的“类库”。在“名称”框中键入 DBCustomAction。

3. 单击“打开”关闭对话框。

4. 从“项目”菜单中选择“添加新项”。

5. 在“添加新项”对话框中选择“安装程序类”。在“名称”框中键入 DBCustomAction。

6. 单击“确定”关闭对话框。(图1-11,1-12)

注:这里是在原来的项目上建立一个简单的安装文件就可以了。

0e8b8b73c6faff3f34be20e8e6567b71.gif

(图1-11)

添加后的效果图:

f3d6ec7f3fc7f1723ef39d43ef54e163.gif

(图1-12)这里的sql文件是要等一下添加的

(七)

添加文件

1. 将SQL Server生成的脚本文件db.sql添加到“Test Installer”项目(图1-12)

2. 将安装文件LisenceFile.rtf添加到“Test Installer”项目

3. 在用户界面编辑器中,选择许可协议,设置LisenceFile属性为LisenceFile.rtf文件

(八)

一下的代码是整个部署的最重要的一部分了

将代码添加到安装程序类中,dbcustomaction.vb类

1

None.gifImportsSystem.ComponentModel2None.gif3None.gifimportsSystem.Configuration.Install4None.gif5None.gifimportsSystem.IO6None.gif7None.gifimportsSystem.Reflection8None.gif9None.gif10None.gif11ExpandedBlockStart.gif

ContractedBlock.gifPublicClass DBCustomActionClassDBCustomAction12InBlock.gif13InBlock.gifinheritsSystem.Configuration.Install.Installer14InBlock.gif15InBlock.gif16InBlock.gif17ContractedSubBlock.gif

ExpandedSubBlockStart.gif组件设计器生成的代码#region"组件设计器生成的代码 "18InBlock.gif19ExpandedSubBlockStart.gif

ContractedSubBlock.gifpublicSub New()SubNew()20InBlock.gif21InBlock.gifmybase.new()22InBlock.gif23InBlock.gif'该调用是组件设计器所必需的24InBlock.gif25InBlock.gifinitializecomponent()26InBlock.gif27InBlock.gif'在 InitializeComponent() 调用之后添加任何初始化28InBlock.gif29ExpandedSubBlockEnd.gifend Sub30InBlock.gif31InBlock.gif'Installer 重写 dispose 以清理组件列表。32InBlock.gif33ExpandedSubBlockStart.gif

ContractedSubBlock.gifprotectedOverloadsOverridesSub Dispose()SubDispose(ByValdisposingAsBoolean)34InBlock.gif35InBlock.gififdisposingThen36InBlock.gif37InBlock.gififNot(componentsIsNothing)Then38InBlock.gif39InBlock.gifcomponents.dispose()40InBlock.gif41InBlock.gifendIf42InBlock.gif43InBlock.gifendIf44InBlock.gif45InBlock.gifmybase.dispose(disposing)46InBlock.gif47ExpandedSubBlockEnd.gifend Sub48InBlock.gif49InBlock.gifprivatecomponentsAsSystem.ComponentModel.IContainer50InBlock.gif51ExpandedSubBlockStart.gif

ContractedSubBlock.gifPrivateSub InitializeComponent()SubInitializeComponent()52InBlock.gif53ExpandedSubBlockEnd.gifend Sub54InBlock.gif55ExpandedSubBlockEnd.gif#end Region56InBlock.gif57InBlock.gif'执行sql 语句58InBlock.gif59ExpandedSubBlockStart.gif

ContractedSubBlock.gifprivateSub ExecuteSql()SubExecuteSql(ByValconnAsString,ByValDatabaseNameAsString,ByValSqlAsString)60InBlock.gif61InBlock.gifdimmySqlConnectionAsNewSqlClient.SqlConnection(conn)62InBlock.gif63InBlock.gifdimCommandAsNewSqlClient.SqlCommand(Sql, mySqlConnection)64InBlock.gif65InBlock.gifcommand.connection.open()66InBlock.gif67InBlock.gifcommand.connection.changedatabase(databasename)68InBlock.gif69InBlock.giftry70InBlock.gif71InBlock.gifcommand.executenonquery()72InBlock.gif73InBlock.giffinally74InBlock.gif75InBlock.gif'close Connection76InBlock.gif77InBlock.gifcommand.connection.close()78InBlock.gif79InBlock.gifendTry80InBlock.gif81ExpandedSubBlockEnd.gifend Sub82InBlock.gif83ExpandedSubBlockStart.gif

ContractedSubBlock.gifpublicOverridesSub Install()SubInstall(ByValstateSaverAsSystem.Collections.IDictionary)84InBlock.gifMyBase.Install(stateSaver)85InBlock.gif86InBlock.gif'------------------------建立数据库-------------------------------------------------87InBlock.gif88InBlock.giftry89InBlock.gif90InBlock.gifdimconnStrAsString=String.Format("data source={0};user id={1};password={2};persist security info=false;packet size=4096",Me.Context.Parameters.Item("server"),Me.Context.Parameters.Item("user"),Me.Context.Parameters.Item("pwd"))91InBlock.gif92InBlock.gif'根据输入的数据库名称建立数据库93InBlock.gif94InBlock.gifexecutesql(connstr,"master","CREATE DATABASE"+Me.Context.Parameters.Item("dbname"))95InBlock.gif96InBlock.gif'调用osql执行脚本97InBlock.gif98InBlock.gifdimsqlProcessAsNewSystem.Diagnostics.Process99InBlock.gif100InBlock.gifsqlprocess.startinfo.filename="osql.exe"101InBlock.gif102InBlock.gifsqlprocess.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"))103InBlock.gif104InBlock.gifsqlprocess.startinfo.windowstyle=ProcessWindowStyle.Hidden105InBlock.gif106InBlock.gifsqlprocess.start()107InBlock.gif108InBlock.gifsqlprocess.waitforexit()'等待执行109InBlock.gif110InBlock.gifsqlprocess.close()111InBlock.gif112InBlock.gif'删除脚本文件113InBlock.gif114InBlock.gifdimsqlFileInfoAsNewSystem.IO.FileInfo(String.Format("{0}db.sql",Me.Context.Parameters.Item("targetdir")))115InBlock.gif116InBlock.gififsqlFileInfo.ExistsThen117InBlock.gif118InBlock.gifsqlfileinfo.delete()119InBlock.gif120InBlock.gifendIf121InBlock.gif122InBlock.gifcatchexAsException123InBlock.gif124InBlock.gifthrowex125InBlock.gif126InBlock.gifendTry127InBlock.gif128InBlock.gif129InBlock.gif130InBlock.gif'---------------------将连接字符串写入Web.config-----------------------------------131InBlock.gif132InBlock.giftry133InBlock.gif134InBlock.gifdimFileInfoAsSystem.IO.FileInfo=NewSystem.IO.FileInfo(Me.Context.Parameters.Item("targetdir")&"\web.config")135InBlock.gif136InBlock.gififNotFileInfo.ExistsThen137InBlock.gif138InBlock.gifthrowNewInstallException("没有找到配置文件")139InBlock.gif140InBlock.gifendIf141InBlock.gif142InBlock.gif'实例化xml文档143InBlock.gif144InBlock.gifdimXmlDocumentAsNewSystem.Xml.XmlDocument145InBlock.gif146InBlock.gifxmldocument.load(fileinfo.fullname)147InBlock.gif148InBlock.gif149InBlock.gif150InBlock.gif'查找到appsettings中的节点151InBlock.gif152InBlock.gifdimNodeAsSystem.Xml.XmlNode153InBlock.gif154InBlock.gifdimFoundItAsBoolean=False155InBlock.gif156InBlock.gifforEachNodeInXmlDocument.Item("configuration").Item("appSettings")157InBlock.gif158InBlock.gififNode.Name="add"Then159InBlock.gif160InBlock.gififNode.Attributes.GetNamedItem("key").Value="connString"Then161InBlock.gif162InBlock.gif'写入连接字符串163InBlock.gif164InBlock.gifnode.attributes.getnameditem("value").value=String.Format("Persist Security Info=False;Data Source={0};Initial Catalog={1};User ID={2};Password={3};Packet Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1", _165InBlock.gif166InBlock.gifme.context.parameters.item("server"),Me.Context.Parameters.Item("dbname"),Me.Context.Parameters.Item("user"),Me.Context.Parameters.Item("pwd"))167InBlock.gif168InBlock.giffoundit=True169InBlock.gif170InBlock.gifendIf171InBlock.gif172InBlock.gifendIf173InBlock.gif174InBlock.gifnextNode175InBlock.gif176InBlock.gififNotFoundItThen177InBlock.gif178InBlock.gifthrowNewInstallException("web.Config 文件没有包含connString连接字符串设置")179InBlock.gif180InBlock.gifendIf181InBlock.gif182InBlock.gifxmldocument.save(fileinfo.fullname)183InBlock.gif184InBlock.gifcatchexAsException185InBlock.gif186InBlock.gifthrowex187InBlock.gif188InBlock.gifendTry189InBlock.gif190ExpandedSubBlockEnd.gifend Sub191InBlock.gif192ExpandedBlockEnd.gifend Class193None.gif194None.gif

有点难度的就是那个Process类,它调用了osql.exe程序,来执行sql语句osql -U,-P,,-d,-i。

web.config的修改代码是利用xml的语法实现。不是很难理解。

最后编译生成!如图:

851e3c8d8ecbe50ebc448af33a2ca66a.gif

安装界面:如图

295725f546721e933c9ea43797cc7746.gif

哈哈,总算写完了,也不知道有没有写好

7fa5397ff3b1a8de588d9f24b5f49ba2.gif

最后还是感谢李洪根老师和微软的讲师。结合他们的共同的经验,部署起来真的很简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值