随笔 - 59  文章 - 20  评论 - 61  阅读 - 85494

VS2015打包发布SQL Server Express

最近把一个WinForms项目从VS2010迁移到VS2015,遇到SQL Server Express打包问题,折腾了好几天,解决过程曲折离奇,所以记录分享一下。

VS2010打包SQL Server Express数据库

先回顾一下VS2010中怎么打包SQL Server Express。
VS2010自带安装项目模版,新建一个安装项目,就可以很方便地打包WinForm产品。
这里写图片描述

在安装项目属性中点击系统必备:
这里写图片描述

打勾SQL Server 2008 Express,选择从与我的应用程序相同的位置下载系统必备组件:
这里写图片描述

就可以把SQL Server 2008 Express数据库文件包含到安装包中,在目标系统上能够自动安装数据库。
这个方法发布的安装包在Win7,Win10上测试都是正常的。

VS2015打包方案

VS2015中没有安装项目模版,其实VS2010之后都没有了,这么简单好用的一个东西,微软怎么不保留下来,发扬光大呢?太遗憾了……
VS2015中有2种方式打包WinForm项目,一是Click Once,二是InstallShield,当然还有一些其他第三方的打包工具,但是如果系统自带或者推荐的工具够用了,就不想再找第三方的了,毕竟每引入一种技术都是要学习成本的,而且都存在新的技术风险。

Click Once打包

Click Once打包方式比较简单,在解决方案资源管理器中,右键点击项目,选择发布菜单,就可以生成安装包。
这里写图片描述

在项目的发布设置中,点击系统必备组件。
这里写图片描述

打勾SQL Server 2008 R2 Express,选择从与我的应用程序相同的位置下载系统必备组件。
这里写图片描述

确定后,点击发布设置中的立即发布,系统提示要去下载一堆东西,看得我心头上火。为什么不能自动去下载呢?这个设计太不人性化了。
这里写图片描述
抛开下载这个问题不说,Click Once创建的安装包,安装体验不够友好。点击安装后,要验证发行者。软件安装在C:\Users\xxx\AppData\Local\Apps\2.0,隐藏得非常深,太难找了,我希望它像以前的VS2010安装包那样,依次点击下一步,默认安装在C:\Program Files。所以,先把Click Once方案搁置了。

InstallShield打包
这个打包方案历史非常悠久了,伴随着微软历代Visual Studio发布,应用非常广泛,我觉得微软应该把它给收购了。对照一下Xamarin,跟着微软混了几年就明媒正娶了,而InstallShield都混十几年了还没转正,真是个丫鬟的命。
VS2015不能直接创建InstallShield项目,需要安装并注册激活InstallShield软件,注册码需要到InstallShield官网填报资料才能获得。
在VS2015中新建其他项目类型->安装和部署,双击启用InstallShield Limited Edition:
这里写图片描述

系统自动弹出一个网页,点击网页上的步骤2:转到下载网站,http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visual-Studio?lang=1033&ver=pro,填写注册信息,到注册邮箱查收注册码,下载InstallShield2015LimitedEdition.exe并安装。这个官网之前还要FQ才能填单,现在已经不用了。
然后在VS2015中可以新建InstallShield项目了。首次运行会提示激活,输入注册码即可。
这里写图片描述
百度上有InstallShield的教程,一看就会。重点问题是打包SQL Server Express数据库。
双击解决方案资源管理器中的Redistributables:
这里写图片描述

这里有各种各样的可重新发布的安装包,点击SQL Server 2008 Express SP1(x86)后就会自动下载安装文件以及它的全部依赖文件,比Click Once智能很多,就是下载有点慢。注意,必须以管理员权限打开VS2015,否则点击下载时会提示权限不足的错误。如果用管理员权限仍然下载失败,可以开VPN试一下。
这里写图片描述
为了兼容32位和64位目标系统,再下载SQL Server 2008 Express SP1(x86 & x64Wow),但是生成安装包时会提示几个错误,缺少一些(x64).prq文件,这些文件本来应该是InstallShield自带的,但是不知为何会缺失。虽然少了一些文件,但是仍然生成了安装包,在64位系统上安装时会报错,虽然忽略这些报错仍然可以完成安装,但是用户体验不好。
这里写图片描述

如果不勾选SQL Server 2008 Express SP1(x86 & x64Wow),在64位系统上不会安装x86的数据库文件。考虑到SQL Server 2008 Express版本已经非常古老了,干脆直接改用最新的SQL Server 2014 Express算了,2014版不需要那些缺少的(x64).prq文件,打包不会报错,并且功能上完全兼容2008版。
注意,2014版有三个文件,打勾(x64)和(x86 & x64Wow)就好了,不要打勾(x86)。如果选择的是(x64)和(x86),在64位系统中会提示安装2个数据库。
这里写图片描述

下载完成后,重新生成InstallShield安装项目,创建安装包,此时安装包内就包含了SQL Server Express数据库文件。

SQL Server Express静默安装问题

运行这个安装包,会弹出数据库安装界面,需要不断点击下一步安装,步骤太多太繁琐,我希望能够像以前用VS2010打包那样,数据库是自动安装的,需要设置SQL Server Express安装模式为静默安装。
InstallShield的安装包配置文件位于C:\Program Files (x86)\InstallShield\2015LE\SetupPrerequisites,用管理员权限运行记事本,打开Microsoft SQL Server 2014 Express RTM (x86 & x64Wow).prq,发现它里面带有安装参数/q /HIDECONSOLE:

但是貌似无效,百度学习加摸索,找到了静默安装的参数:

/IACCEPTSQLSERVERLICENSETERMS /Q /Hideconsole /ACTION=Install /FEATURES=SQL /INSTANCENAME=SQLEXPRESS /AddCurrentUserAsSQLAdmin /SQLSVCACCOUNT="NT AUTHORITY\SYSTEM" /AGTSVCACCOUNT="NT AUTHORITY\Network Service"
  • 1

在prq文件中添加cmdline=静默安装参数,表示正常安装时数据库也采用静默安装。注意,prq文件格式是XML,所以需要把双引号转换为"

<execute file="SQLEXPR_x86_ENU.exe" cmdline="/IACCEPTSQLSERVERLICENSETERMS /Q /Hideconsole /ACTION=Install /FEATURES=SQL /INSTANCENAME=SQLEXPRESS /AddCurrentUserAsSQLAdmin /SQLSVCACCOUNT=&quot;NT AUTHORITY\SYSTEM&quot; /AGTSVCACCOUNT=&quot;NT AUTHORITY\Network Service&quot;" cmdlinesilent="/q /HIDECONSOLE" requiresmsiengine="1"></execute>
  • 1

部分参数简介:
IACCEPTSQLSERVERLICENSETERMS:接受协议
Q:静默安装
AddCurrentUserAsSQLAdmin:添加当前windows登录用户为数据库管理员
SQLSVCACCOUNT:设置数据库账户,我也不太懂
同样修改Microsoft SQL Server 2014 Express RTM (x64).prq。
在Redistributables中点击Show Details:
这里写图片描述
可以看到转换后的静默安装参数:
这里写图片描述

然后再次生成安装包,不会再弹出数据库安装界面了。

.Net 3.5依赖问题

在Win7运行InstallShield创建的安装包,没问题,在Win10运行,弹窗提示要先安装.Net 3.5,如果取消安装.Net 3.5,数据库是装不上的。
这里写图片描述
更换为SQL Server 2008 Express SP1再打包,测试发现仍然要先安装.Net 3.5。
注意:SQL Server 2008 Express不支持IACCEPTSQLSERVERLICENSETERMS参数,需要从静默参数中删除。
但是,为什么VS2010创建的安装包可以在Win10中一键安装数据库呢?难道它有什么特殊的安装参数?把VS2010创建的安装包再拿到Win10中测试,查看它的安装参数,并没有发现什么新东西。
这里写图片描述

把这个安装参数用于InstallShield创建的SQL Server 2008 Express SP1安装包,仍然提示要安装.Net 3.5。
再次仔细检查两个安装包的数据库文件,发现VS2010创建的安装包中的SQLEXPR32_x86_CHS.EXE的版本号是2731:
这里写图片描述

而InstallShield创建的安装包的SQLEXPR32_x86_ENU.exe的版本号是2531:
这里写图片描述

关于这个问题,微软在https://www.microsoft.com/zh-CN/download/details.aspx?id=25052有相关介绍:
Microsoft SQL Server 2008 Express 是一个功能强大且可靠的数据管理系统,它功能丰富,能保护数据,并且可改善嵌入式应用程序客户端、轻型 Web 应用程序以及本地数据存储区的性能。SQL Server 2008 Express 具有易于部署以及可以快速设计原型的特点,您可以无偿获取并可以随应用程序免费再分发。它设计成可与其他服务器基础结构资产无缝集成。Microsoft SQL Server 2008 Express Service Pack 1 (SP1) 现以下面两种格式提供:

  1. 具有 Microsoft .NET Framework 3.5 SP1 支持的 SQL Server 2008 Express SP1
  2. 具有 Microsoft .NET Framework 4 Beta 2 支持的 SQL Server 2008 Express SP1

这两种格式在功能上没有任何区别。有关具有 Microsoft .NET Framework 4.0 Beta 2 支持的 SQL Server 2008 Express SP1 的详细信息,请参阅知识库文章 977813。

要下载和安装具有 .Net Framework 4 Beta 2 支持的 SQL Server 2008 Express,请单击相应的链接:

注意:对于装有 Microsoft .NET Framework 2.0 Service Pack 2 (SP2) 或 .NET Framework 3.5 SP1 的计算机,您可以安装具有 .NET Framework 3.5 SP1 支持的 SQL Server 2008 Express SP1 或安装具有 .NET Framework 4 Beta 2 支持的 SQL Server 2008 Express SP1。对于只安装了 .NET Framework 4 Beta 2 的计算机,请安装具有 .NET Framework 4 Beta 2 支持的 SQL Server 2008 Express SP1。这两种包在功能上没有任何区别。有关安装 .NET Framework 4.0 Beta 2 的详细信息,请参阅知识库文章 977813。

用户:开发人员、客户和合作伙伴

• 具有 .Net 4 支持的 SQLEXPR x86 可执行文件

• 具有 .Net 4 支持的 SQLEXPR x64 可执行文件

• 具有 .Net 4 支持的 SQLEXPR x86(仅 32 位)可执行文件

就是说,微软当年同时发布过2个SQL Server 2008 Express SP1文件,一个是依赖.Net 3.5的2531,另外一个是依赖.Net 4.0 Beta 2的2731。这对双胞胎虽然外表相同但是DNA不一样,导致在不同的windows环境下安装结果不一样。
问题原因找到了,但是解决方案仍然没有。InstallShield没有2731这个版本可供选择,即使更换为其他后续版本的SQL Server Express也没用,因为它们都依赖.Net 3.5。那个依赖.Net 4.0 Beta 2的2731成为了一个绝版。非常凑巧的是,在VS2010中打包SQL Server 2008 Express数据库,用的正好是2731这个绝版,所以在Win10中安装反而非常顺利。
如果想继续使用SQL Server Express打包,必须在目标计算机上安装.Net 3.5。有2个方法可以在目标计算机上安装.Net 3.5。
方法1:联网安装
如果目标计算机可以连接互联网,在系统弹出安装.Net 3.5的窗口时,点击下载并安装此功能,在网络良好的情况下是可以完成.Net 3.5安装的。
这里写图片描述

方法2:通过win10安装盘安装
如果目标计算机有Win10安装盘,假设在E:\win10,用管理员权限打开控制台,执行命令:
Dism /online /enable-feature /featurename:NetFx3 /All /Source:E:\win10\sources\sxs /LimitAccess
就可以完成安装。

但是如果目标计算机既不能联网又没有Win10安装盘怎么办?能否通过InstallShield打包.Net 3.5安装文件呢?
在Redistributables打勾.Net 3.5,重新创建安装包,在Win10中测试,发现.Net 3.5根本不会自动安装。而且,目标计算机还有可能是Windows Server之类,这个.Net 3.5文件不知道能不能通用,觉得这个方法行不通。
其实,让用户拿计算机去联一下网,或者找一个Win10安装盘,是不会死的,但是作为一个重度强迫症患者,我坚持认为一定要做到像VS2010创建的安装包那样,一键完成安装数据库,不需要再手工安装什么.Net 3.5之类的东西,哎,药不能停啊……
最后只好改用SQL Server Express LocalDB数据库。

LocalDB配置和静默安装

对SQL Server Express和LocalDB在10万记录下测试,确认两者性能接近,不影响使用。而且LocalDB体积更小,安装更快。LocalDB数据库的访问方式跟SQL Server Express完全相同,代码不用改,改一下配置文件的数据库连接字符串就可以了。
SQL Server Express的连接字符串:

<add name="SQLExpressConnStr" connectionString="Data Source=.\SQLEXPRESS;Integrated Security=true;
         Initial Catalog=testdb" providerName="System.Data.SqlClient"/>
  • 1
  • 2

LocalDB的连接字符串:

<add name="LocalDBConnStr" connectionString="Data Source=(localdb)\MSSQLLocalDB;Integrated Security=true;
         AttachDbFilename=d:\db\testdb.mdf" providerName="System.Data.SqlClient"/>
  • 1
  • 2

注意必须要设置AttachDbFilename,并且d:\db目录必须已经存在,系统会自动在指定目录下创建数据库文件。

然后修改InstallShield的Microsoft SQL Server 2014 Express RTM LocalDB (x86).prq和(x64) .prq,设置静默安装参数,LocalDB的静默安装参数比SQL Server Express简单得多:

<execute file="SqlLocalDB.MSI" cmdline="/qb IACCEPTSQLLOCALDBLICENSETERMS=YES" cmdlinesilent="/qn" requiresmsiengine="1"></execute>
  • 1

参数简介:
IACCEPTSQLLOCALDBLICENSETERMS=YES:接受协议
qb:静默安装,但是保留基本界面,可以看得到安装进度,这个友好度比qn完全无界面要好一些;
这里写图片描述
问题算是解决了。

然而最后仍然深感遗憾,SQL Server Express数据库明明可以不依赖.Net 3.5,2731这个版本就是最好的证明,微软为什么还要保留这个古老的陋习?既然打算一直依赖下去,为什么不在Win10系统中默认安装好.Net 3.5呢?

最后,试装了一下SQL Server Express 2016,发现它已经不再依赖.Net Framework 3.5了,总算看到了进步,然而Winform应用也没有必要因此而放弃LocalDB,毕竟LocalDB体积小,安装快。还要等InstallShield新版本发布支持安装2016版SQL Server Express才能用。

原文链接: https://blog.csdn.net/woodsun2008/article/details/52877792
posted on   SunnyTrudeau  阅读(985)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示