基于4.5Framework web程序、SQLSERVER数据库打包
估计很多朋友和我一样,对于C/S程序打包很熟悉,但对于B/S程序打包一头雾水。。。 最近公司要求我们把项目和数据库(SQLSERVER)一起打包,然后安装在CD光盘上,打算拿光盘去客户那边实现一键安装。哎!!!最终这个任务给我了, 我只有抱着学习的态度去慢慢摸
估计很多朋友和我一样,对于C/S程序打包很熟悉,但对于B/S程序打包一头雾水。。。
最近公司要求我们把项目和数据库(SQLSERVER)一起打包,然后安装在CD光盘上,打算拿光盘去客户那边实现一键安装。哎!!!最终这个任务给我了,
我只有抱着学习的态度去慢慢摸索。
打包的程序是基于VS2012、MVC4模板开发出来的,框架是4.5版本。
类似于这种4.5框架打包,目前微软好像也提供了一个打包工具 InstallShield,下载InstallShield2012 或者InstallShield2013,然后安装,安装完成之后就会
在 安装和部署里面会生成一个图标(InstallShield Limited Edition Project), 如下图(1.1)。。
图(1.1)
通过双击 InstallShield Limited Edition Project这个图标,就可以根据前进、后退图标实现安装了,如图(1.2)
图(1.2)
最终WEB打包生成出来的只是一个lnk快捷方式图标,无法指定到输出文件。然后我用C/S WINFORM程序、也是基于4.5框架来进行打包,发现安装生成出来的
文件可以完美运行。
产生这种情况我也感到很无语,于是在网上查找这方面的相关资料,发现InstallShield这款插件从2010开始,微软已经不管了,只是推荐这款插件。
哎!!!真坑...
基于这种情况我彻底无语了,只能从新找其他办法。
之后我就开始尝试把4.5框架程序降到4.0框架程序,然后再次进行打包。
降框架有两种办法:1.在VS2012上面打开, 更改所有程序集的目标框架,如图(1.3)
如图(1.3)
2. 用文本打开项目文件进行更改,更改TargetFrameworkVersion 为v4.0 如图(1.4)
图(1.4)
但是如果在4.5框架程序中引用了4.5版本的包,那也要对包进行降版本。去掉引用的包,或者找低版本的包来替代高版本的包
下面开始讲解用VS2010打包 4.0WEB程序
1.用VS2010打开即将要打包的WEB程序(图就省了。。)
2.右击解决方案一>添加一>新建项目,然后点击web安装项目,如图(1.5)
图(1.5)
3.右击安装包WebSetup1一>添加一>项目输出,然后选中项目WEB程序集 ,选中本地化资源、内容文件 如图(1.6)、(1.7)
图(1.6)
图(1.7)
4.右击安装包一>视图一>用户界面 ,如图(1.8)
图(1.8)
5.右击启动一>添加对话框一>选中文本框、许可协议,如图(1.9)
图(1.9)
6.右击文本框(A),许可协议上移到选定的位置, 如图(2.0)
图(2.0)
7.新建一个许可协议文件,打开WORD文档,里面写写协议内容,保存后WORD文档要改成rtf格式,然后右击许可协议一>属性窗口,在LicenseFile属性中点击浏览,如图(2.1)
如图(2.1)
8.双击Web应用程序文件夹,添加rtf文件,如图(2.2)
图(2.2)
9.右击解决方案一>新建项目一>类库,命名为安装类(我随便命名的),右击安装类一>添加一>新建类一>安装程序类,如图(2.3)
图(2.3)
10.双击安装类一>单击此处切换到代码视图,如图(2.4)
如图(2.4)
11.重写安装类,源码如下
<span>using</span><span> System; </span><span>using</span><span> System.Collections; </span><span>using</span><span> System.Collections.Generic; </span><span>using</span><span> System.ComponentModel; </span><span>using</span><span> System.Configuration.Install; </span><span>using</span><span> System.Data.SqlClient; </span><span>using</span><span> System.IO; </span><span>using</span><span> System.Linq; </span><span>namespace</span><span> 安装类 { [RunInstaller(</span><span>true</span><span>)] </span><span>public</span> <span>partial</span> <span>class</span><span> Installer : System.Configuration.Install.Installer { </span><span>public</span><span> Installer() { InitializeComponent();<br> } </span><span>///</span> <span><summary></summary></span> <span>///</span><span> 重写安装方法 </span><span>///</span> <span></span> <span>///</span> <span><param name="stateSaver"></span> <span>public</span> <span>override</span> <span>void</span><span> Install(IDictionary stateSaver) { </span><span>base</span><span>.Install(stateSaver); </span><span>string</span> Server = Context.Parameters[<span>"</span><span>server</span><span>"</span><span>].ToString(); </span><span>string</span> dbName = Context.Parameters[<span>"</span><span>dbname</span><span>"</span><span>].ToString(); </span><span>string</span> userName = Context.Parameters[<span>"</span><span>user</span><span>"</span><span>].ToString(); </span><span>string</span> userPass = Context.Parameters[<span>"</span><span>pwd</span><span>"</span><span>].ToString(); </span><span>string</span> targetdir = Context.Parameters[<span>"</span><span>targetdir</span><span>"</span><span>].ToString(); </span><span>/*</span><span> * 设置webconfig连接字符串 </span><span>*/</span> <span>string</span> webconfigpath = Path.Combine(<span>this</span>.Context.Parameters[<span>"</span><span>targetdir</span><span>"</span>].ToString(), <span>"</span><span>web.config</span><span>"</span><span>); </span><span>//</span><span>修改第一个数据库连接</span> <span>string</span> webcofnigstring2 = File.ReadAllText(webconfigpath).Replace(<span>@"</span><span>server=JEFFREY9061\SQL2008;database=yd_esms;uid=sa;pwd=********</span><span>"</span><span>, GetConnectionString2()); File.WriteAllText(webconfigpath, webcofnigstring2); </span><span>//</span><span>修改第二个数据连接</span> <span>string</span> webcofnigstring = File.ReadAllText(webconfigpath).Replace(<span>@"</span><span>Data Source=JEFFREY9061\SQL2008;Initial Catalog=yd_esms;Persist Security Info=True;User ID=sa;Password=******</span><span>"</span><span>, GetConnectionString()); File.WriteAllText(webconfigpath, webcofnigstring); </span><span>//</span><span>这个是测试在安装目录下添加接收到的用户填写的数据库信息</span> File.WriteAllText(Path.Combine(targetdir, <span>"</span><span>log.txt</span><span>"</span>), Server + <span>"</span><span>/n/r</span><span>"</span> + dbName + <span>"</span><span>/n/r</span><span>"</span> + userName + <span>"</span><span>/n/r</span><span>"</span> +<span> userPass); } </span><span>///</span> <span><summary></summary></span> <span>///</span><span> 执行sql语句 </span><span>///</span> <span></span> <span>///</span> <span><param name="connection"></span> <span>///</span> <span><param name="sql"></span> <span>void</span> ExecuteSQL(SqlConnection connection, <span>string</span><span> sql) { SqlCommand cmd </span>= <span>new</span><span> SqlCommand(sql, connection); cmd.ExecuteNonQuery(); } </span><span>///</span> <span><summary></summary></span> <span>///</span><span> 获取文本框输入的信息,来插入到登录连接字符串 </span><span>///</span> <span></span> <span>///</span> <span><returns></returns></span> <span>private</span> <span>string</span><span> GetConnectionString() { </span><span>return</span> <span>@"</span><span>Data Source=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>server</span><span>"</span>] + <span>"</span><span>;Initial Catalog=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>dbname</span><span>"</span>] + <span>"</span><span>;Persist Security Info=True;User ID=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>user</span><span>"</span>] + <span>"</span><span>;Password=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>pwd</span><span>"</span>] + <span>""</span><span>; } </span><span>private</span> <span>string</span><span> GetConnectionString2() { </span><span>return</span> <span>@"</span><span>server=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>server</span><span>"</span>] + <span>"</span><span>;database=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>dbname</span><span>"</span>] + <span>"</span><span>;uid=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>user</span><span>"</span>] + <span>"</span><span>;pwd=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>pwd</span><span>"</span><span>]; } } }</span>
12.安装类点击生成,又击WEB安装包一>添加一>项目输出,选中安装类为主输出,如图(2.5)
如图(2.5)
13.有击WEB安装包一>视图一>自定义操作,右击安装一>添加自定义操作一>双击Web应用程序文件夹,选中主输出来自安装类(活动),如图(2.6)
如图(2.6)
14.依次对WEB程序、安装类、安装包重新生成
15.右击安装包一>打开资源管理文件夹一>debug,在debug文件夹中会存在exe、msi两个文件,如图(2.7)
如图(2.7)
16.双击setup.exe 安装步骤如下
17.基本上再这里就算结束了,后面的我就不用演示了。
下面讲解如何把SQLSERVER数据库和程序一键打包,打包数据库其实很简单
分离数据库,找到对应的ldf、mdf文件进行复制,粘贴到任意盘,我是放到桌面了,如图(3.1)
图(3.1)
右击安装包一>添加一>文件,把ldf、mdf文件添加进去,如图(3.2)
、
图(3.2)
打开安装类,添加一段代码,结合WEB源码如下
<span>using</span><span> System; </span><span>using</span><span> System.Collections; </span><span>using</span><span> System.Collections.Generic; </span><span>using</span><span> System.ComponentModel; </span><span>using</span><span> System.Configuration.Install; </span><span>using</span><span> System.Data.SqlClient; </span><span>using</span><span> System.IO; </span><span>using</span><span> System.Linq; </span><span>namespace</span><span> 安装类 { [RunInstaller(</span><span>true</span><span>)] </span><span>public</span> <span>partial</span> <span>class</span><span> Installer : System.Configuration.Install.Installer { </span><span>public</span><span> Installer() { InitializeComponent(); } </span><span>///</span> <span><summary></summary></span> <span>///</span><span> 重写安装方法 </span><span>///</span> <span></span> <span>///</span> <span><param name="stateSaver"></span> <span>public</span> <span>override</span> <span>void</span><span> Install(IDictionary stateSaver) { </span><span>base</span><span>.Install(stateSaver); </span><span>string</span> Server = Context.Parameters[<span>"</span><span>server</span><span>"</span><span>].ToString(); </span><span>string</span> dbName = Context.Parameters[<span>"</span><span>dbname</span><span>"</span><span>].ToString(); </span><span>string</span> userName = Context.Parameters[<span>"</span><span>user</span><span>"</span><span>].ToString(); </span><span>string</span> userPass = Context.Parameters[<span>"</span><span>pwd</span><span>"</span><span>].ToString(); </span><span>string</span> targetdir = Context.Parameters[<span>"</span><span>targetdir</span><span>"</span><span>].ToString(); </span><span>/*</span><span> * 设置webconfig连接字符串 </span><span>*/</span> <span>string</span> webconfigpath = Path.Combine(<span>this</span>.Context.Parameters[<span>"</span><span>targetdir</span><span>"</span>].ToString(), <span>"</span><span>web.config</span><span>"</span><span>); </span><span>//</span><span>修改第一个数据库连接</span> <span>string</span> webcofnigstring2 = File.ReadAllText(webconfigpath).Replace(<span>@"</span><span>server=JEFFREY9061\SQL2008;database=yd_esms;uid=sa;pwd=********</span><span>"</span><span>, GetConnectionString2()); File.WriteAllText(webconfigpath, webcofnigstring2); </span><span>//</span><span>修改第二个数据连接</span> <span>string</span> webcofnigstring = File.ReadAllText(webconfigpath).Replace(<span>@"</span><span>Data Source=JEFFREY9061\SQL2008;Initial Catalog=yd_esms;Persist Security Info=True;User ID=sa;Password=******</span><span>"</span><span>, GetConnectionString()); File.WriteAllText(webconfigpath, webcofnigstring); </span><span>//</span><span>这个是测试在安装目录下添加接收到的用户填写的数据库信息</span> File.WriteAllText(Path.Combine(targetdir, <span>"</span><span>log.txt</span><span>"</span>), Server + <span>"</span><span>/n/r</span><span>"</span> + dbName + <span>"</span><span>/n/r</span><span>"</span> + userName + <span>"</span><span>/n/r</span><span>"</span> +<span> userPass); </span><span>#region</span> 数据库处理 <span>string</span> strSql = <span>""</span><span>; </span><span>if</span> (userPass == <span>""</span><span>) { strSql </span>= <span>"</span><span>server=</span><span>"</span> + Server + <span>"</span><span>;database=master;Integrated Security=True</span><span>"</span>;<span>//</span><span>连接数据库字符串 </span> <span> } </span><span>else</span><span> { strSql </span>= <span>"</span><span>server=</span><span>"</span> + Server + <span>"</span><span>;uid=</span><span>"</span> + userName + <span>"</span><span>;pwd=</span><span>"</span> + userPass + <span>"</span><span>;database=master</span><span>"</span>;<span>//</span><span>连接数据库字符串 </span> <span> } </span><span>string</span> DataName = <span>"</span><span>TEST</span><span>"</span>;<span>//</span><span>数据库名 </span> <span>string</span> strMdf = targetdir + <span>@"</span><span>TEST.mdf</span><span>"</span>;<span>//</span><span>MDF文件路径,这里需注意文件名要与刚添加的数据库文件名一样! </span> <span>string</span> strLdf = targetdir + <span>@"</span><span>TEST_log.ldf</span><span>"</span>;<span>//</span><span>LDF文件路径 </span> <span>base</span><span>.Install(stateSaver); </span><span>this</span>.CreateDataBase(strSql, DataName, strMdf, strLdf, targetdir);<span>//</span><span>开始创建数据库 </span> <span>#endregion</span><span> } </span><span>///</span> <span><summary></summary></span> <span>///</span><span> 执行sql语句 </span><span>///</span> <span></span> <span>///</span> <span><param name="connection"></span> <span>///</span> <span><param name="sql"></span> <span>void</span> ExecuteSQL(SqlConnection connection, <span>string</span><span> sql) { SqlCommand cmd </span>= <span>new</span><span> SqlCommand(sql, connection); cmd.ExecuteNonQuery(); } </span><span>///</span> <span><summary></summary></span> <span>///</span><span> 获取文本框输入的信息,来插入到登录连接字符串 </span><span>///</span> <span></span> <span>///</span> <span><returns></returns></span> <span>private</span> <span>string</span><span> GetConnectionString() { </span><span>return</span> <span>@"</span><span>Data Source=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>server</span><span>"</span>] + <span>"</span><span>;Initial Catalog=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>dbname</span><span>"</span>] + <span>"</span><span>;Persist Security Info=True;User ID=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>user</span><span>"</span>] + <span>"</span><span>;Password=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>pwd</span><span>"</span>] + <span>""</span><span>; } </span><span>private</span> <span>string</span><span> GetConnectionString2() { </span><span>return</span> <span>@"</span><span>server=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>server</span><span>"</span>] + <span>"</span><span>;database=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>dbname</span><span>"</span>] + <span>"</span><span>;uid=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>user</span><span>"</span>] + <span>"</span><span>;pwd=</span><span>"</span> + <span>this</span>.Context.Parameters[<span>"</span><span>pwd</span><span>"</span><span>]; } </span><span>///</span> <span><summary></summary></span> <span>///</span><span> 附加数据库方法 </span><span>///</span> <span></span> <span>///</span> <span><param name="strSql"></span><span>连接数据库字符串,连接master系统数据库</span><span></span> <span>///</span> <span><param name="DataName"></span><span>数据库名字</span><span></span> <span>///</span> <span><param name="strMdf"></span><span>数据库文件MDF的路径</span><span></span> <span>///</span> <span><param name="strLdf"></span><span>数据库文件LDF的路径</span><span></span> <span>///</span> <span><param name="path"></span><span>安装目录</span><span></span> <span>private</span> <span>void</span> CreateDataBase(<span>string</span> strSql, <span>string</span> DataName, <span>string</span> strMdf, <span>string</span> strLdf, <span>string</span><span> path) { SqlConnection myConn </span>= <span>new</span><span> SqlConnection(strSql); String str </span>= <span>null</span><span>; </span><span>try</span><span> { str </span>= <span>"</span><span> EXEC sp_attach_db @dbname='</span><span>"</span> + DataName + <span>"</span><span>',@filename1='</span><span>"</span> + strMdf + <span>"</span><span>',@filename2='</span><span>"</span> + strLdf + <span>"</span><span>'</span><span>"</span><span>; SqlCommand myCommand </span>= <span>new</span><span> SqlCommand(str, myConn); myConn.Open(); myCommand.ExecuteNonQuery(); </span><span>//</span><span>MessageBox.Show("数据库安装成功!点击确定继续"); </span><span>//</span><span>需Using System.Windows.Forms </span> <span> } </span><span>catch</span><span> (Exception ex) { Console.Write(ex.StackTrace.ToString()); </span><span>//</span><span>MessageBox.Show("数据库安装失败!" + e.Message + "\n\n" + "您可以手动附加数据"); </span> <span> System.Diagnostics.Process.Start(path); </span><span>//</span><span>打开安装目录 </span> <span> } </span><span>finally</span><span> { myConn.Close(); } } } }</span>
最后把解决方案全部重新生成,再次重复上面的WEB打包、安装就好了。。。
由于空余的时间不是很多,写的不是很详细,如有不懂的,可以来我QQ群一起讨论
QQ群号: 8017417 身份认证:Rach技术讨论
http://www.cnblogs.com/hank-hu/p/3967101.html

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

iPhone上的默认地图是Apple专有的地理位置提供商“地图”。尽管地图越来越好,但它在美国以外的地区运行不佳。与谷歌地图相比,它没有什么可提供的。在本文中,我们讨论了使用Google地图成为iPhone上的默认地图的可行性步骤。如何在iPhone中使Google地图成为默认地图将Google地图设置为手机上的默认地图应用程序比您想象的要容易。请按照以下步骤操作–先决条件步骤–您必须在手机上安装Gmail。步骤1–打开AppStore。步骤2–搜索“Gmail”。步骤3–点击Gmail应用旁

C++是一种广泛使用的编程语言,在编写倒计时程序方面非常方便和实用。倒计时程序是一种常见的应用,它能为我们提供非常精确的时间计算和倒计时功能。本文将介绍如何使用C++编写一个简单的倒计时程序。实现倒计时程序的关键就是使用计时器来计算时间的流逝。在C++中,我们可以使用time.h头文件中的函数来实现计时器的功能。下面是一个简单的倒计时程序的代码

您的手机中缺少时钟应用程序吗?日期和时间仍将显示在iPhone的状态栏上。但是,如果没有时钟应用程序,您将无法使用世界时钟、秒表、闹钟等多项功能。因此,修复时钟应用程序的缺失应该是您的待办事项列表的首位。这些解决方案可以帮助您解决此问题。修复1–放置时钟应用程序如果您错误地从主屏幕中删除了时钟应用程序,您可以将时钟应用程序放回原位。步骤1–解锁iPhone并开始向左侧滑动,直到到达“应用程序库”页面。步骤2–接下来,在搜索框中搜索“时钟”。步骤3–当您在搜索结果中看到下方的“时钟”时,请按住它并

您是否每天在大约相同的时间频繁访问同一网站?这可能会导致花费大量时间打开多个浏览器选项卡,并在执行日常任务时使浏览器充满混乱。好吧,打开它而不必手动启动浏览器怎么样?这非常简单,不需要您下载任何第三方应用程序,如下所示。如何设置任务计划程序以打开网站?按键,在搜索框中键入任务计划程序,然后单击打开。Windows在右侧边栏上,单击“创建基本任务”选项。在名称字段中,输入要打开的网站的名称,然后单击下一步。接下来,在触发器下,单击时间频率并点击下一步。选择您希望活动重复多长时间并点击下一步。选择启

在iOS17中,苹果不仅增加了几个新的消息功能,而且还调整了消息应用程序的设计,使其外观更干净。现在,所有iMessage应用程序和工具(如相机和照片选项)都可以通过点击键盘上方和文本输入字段左侧的“+”按钮来访问。点击“+”按钮会弹出一个菜单列,该列具有默认的选项顺序。从顶部开始,有相机,照片,贴纸,现金(如果可用),音频和位置。最底部是一个“更多”按钮,点击该按钮时会显示任何其他已安装的消息应用程序(您也可以向上滑动以显示此隐藏列表)。如何重新组织您的iMessage应用程序您可以通过以下方

您在尝试使用应用程序时是否收到“无法允许访问摄像头和麦克风”?通常,您可以在需要提供的基础上向特定对象授予摄像头和麦克风权限。但是,如果您拒绝权限,摄像头和麦克风将无法工作,而是显示此错误消息。解决这个问题是非常基本的,你可以在一两分钟内完成。修复1–提供相机、麦克风权限您可以直接在设置中提供必要的摄像头和麦克风权限。步骤1–转到“设置”选项卡。步骤2–打开“隐私与安全”面板。步骤3–在那里打开“相机”权限。步骤4–在里面,您将找到已请求手机相机权限的应用程序列表。步骤5–打开指定应用的“相机”

图形驱动程序是PC上最重要的驱动程序之一,直接影响性能和游戏体验。但是,当通过安装程序更新驱动程序时,许多人遇到“您的系统具有锁定到制造商规格的驱动程序”错误。出现此问题的原因是制造商限制更新,除非从其末端专门推送更新。这确保了稳定性,但对许多人来说可能是一个问题。因此,让我们找出如何立即解决问题!如何修复您的系统具有锁定在Windows11上的制造商规范的驱动程序?在我们转向稍微复杂的解决方案之前,请先尝试以下快速解决方案:确保你的电脑和操作系统满足驱动程序的系统要求。将电脑启动到安全模式,然

Windows10和11附带了多个你可能不需要的应用。据报道,又有一个应用程序加入了英国媒体报道软件列表,即HPSmart应用程序。一份报告由WindowsLatest表示,他们注意到一个名为HPSmart的新应用程序已添加到其Windows10笔记本电脑的“开始”菜单中。然而,它并没有就此结束,作者发现该应用程序也已自动安装在他们在Windows11上运行的虚拟机上。这种情况的有趣之处在于,报告称即使没有惠普产品连接到PC,该应用程序也会自动安装。部分用户在reddit的报告说他们也遇到过类似
