最近有个项目需要生成一个自动打包安装App和数据库的MSI文件,经同事推荐WIX,于是乎就试了一试。遇到了一些问题觉得有分享的价值,所以写篇博客记录一下 :)

使用感觉:

WIX特点:功能很强大,用XML配置实现,没有界面,弹性很大,但learning curve比较长。

WIX貌似对LocalDB不支持,如果是其它版本的SQL Server,WIX有内置配置支持,很简单。

问题一:

WIX内置不支持SQL LocalDB,怎么实现对SQL LocalDB安装及配置

解决方案:

我的第一想法和现在的做法是用Powershell调用SQL Scripts,然后再用WIX调用Powershell

代码实现:

Powershell调用SQL Scripts

$dbName = 'LocalDBTest' $serverName = '(localdb)\localdbtest'

# determine path of script. all paths in script are relative to script file.

$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path

' setting up database...'

sqlcmd -U 'sa' -P 'test!123' -S $serverName -i "$scriptDir\.\LocalDBTestSchema.sql" -X

WIX 调用Powershell

<ComponentGroup Id="LocalDBTest_Project" Directory="LocalDBTest">

<Component Id="SetupDatabase" Guid="8DE013D2-BB7D-4958-973A-3C54606D5CDC" KeyPath="yes">

<File Id="SetupDatabase" Name="SetupDatabase.ps1" Source="$(var.ProjectDir)DB\SetupDatabase.ps1" Vital="yes" />

</Component>

...

</ComponentGroup>

<!--Define the CustomAction for running the PowerShell script-->

<CustomAction Id="RunPowerShellScript" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="yes" />

<InstallExecuteSequence>

<!--Invoke PowerShell script -->

<Custom Action="RunPowerShellScript" After="InstallFiles"><![CDATA[NOT Installed]]></Custom>

</InstallExecuteSequence>

<!-- Ensure PowerShell is installed and obtain the PowerShell executable location -->

<Property Id="POWERSHELLEXE">

<RegistrySearch Id="POWERSHELLEXE"

Type="raw"

Root="HKLM"

Key="SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"

Name="Path" />

</Property>

<Condition Message="This application requires Windows PowerShell.">

<![CDATA[Installed OR POWERSHELLEXE]]>

</Condition>

<!-- Define the PowerShell command invocation -->

<SetProperty Id="RunPowerShellScript"

Before ="InstallFiles"

Sequence="execute"

Value ="&quot;[POWERSHELLEXE]&quot; -Version 2.0 -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command &quot;&amp; '[#SetupDatabase]' ; exit $$($Error.Count)&quot;" />

问题二:

Window 7 对权限管控比较严,SQL Scripts对C:盘大多数目录没有创建文件的权限

解决方案:

查找了一下,发现%UserProfile%目录好像SQL有读写权限,因为我们程序首先需要安装LocalDB所以选择了以下目录

%UserProfile%\AppData\Local\Microsoft\Microsoft SQL Server Local DB

问题三:

怎么把一个%UserProfile%目录从Powershell中传给SQL Script使用

解决方案:

在Powershell中拿到%UserProfile%目录,然后调用Sqlcmd传给SQL Scripts

代码实现:

在Powershell中拿到%UserProfile%目录

$dbName = 'LocalTestDB'

$serverName = '(localdb)\localDBTest'

# get the user profile folder which no need access rights to create DB files

$userProfile = $env:USERPROFILE

$userProfile = $userProfile+'\AppData\Local\Microsoft\Microsoft SQL Server Local DB'

# 注意底下双引号和单引号的使用依次是 ,开始[单引][双引][单引],结束[双引][单引],这里折腾了我不少时间,地址老是传得不对

$RingDB = '"'+$userProfile+'\LocalTestDB.mdf"'

$RingLog = '"'+$userProfile+'\LocalTestDB_log.ldf"'

# determine path of script. all paths in script are relative to script file.

$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path

调用Sqlcmd传给SQL Scripts

' setting up database...'

#sqlcmd -U 'sa' -P 'test!123' -S $serverName -i "$scriptDir\.\LocalDBTestSchema.sql" -v varMDF= $RingDB varLDF= $RingLog

LocalDBTestSchema.sql 中对应的变量写法如下:

USE [master]

GO

/****** Object:  Database [LocalTestDB]    Script Date: 2014/4/1 12:24:09 ******/

CREATE DATABASE [LocalTestDB]

CONTAINMENT = NONE

ON  PRIMARY

( NAME = N'LocalTestDB', FILENAME = N'$(varMDF)' , SIZE = 15552KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )

LOG ON

( NAME = N'LocalTestDB_log', FILENAME = N'$(varLDF)' , SIZE = 76736KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)

GO

问题四:

LocalDB默认安装时没有界面的,用户不会用SQL Command去创建SQL instance和修改sa的密码,App怎么用sa连接数据库呢?

解决方案:

在Powershell中用Windows 集成登陆模式启用sa账号,然后修改sa密码

代码实现:

' Create instance for localDB'

SQLLocalDB create "LocalDBTest"

' Grant & Enable sa account'

sqlcmd -S $serverName -E -Q "GRANT CONNECT SQL TO [sa]"

sqlcmd -S $serverName -E -Q "ALTER LOGIN [sa] ENABLE"

' Change sa password'

sqlcmd -S $serverName -E -Q "EXEC sp_password NULL, 'test!123','sa'"

以上是本人实践的一些方法和遇到的问题及解决方案,可能不是最佳解决方案,但确实可运行\可工作的方案。

如有问题或建议,希望能和大家探讨,同时也希望本文能帮到一部分人~~

初试WIX加SQL LocalDB的更多相关文章

  1. VS2017使用 SQL Localdb问题两则

    VS2017使用 SQL  Localdb问题两则 来博客园不算短了,总是索取者.最近使用VS2017,遇到一些问题,在解决时总是找不到拿来就能用的解决方案,在多方寻找,自行探索下,总算圆满解决,在这 ...

  2. TOP字句加SQL变量的相关问题

    SQL Server数据库中的变量可以加载TOP字句之后,下文将对TOP字句加SQL变量的相关问题进行讨论,供您参考,希望对您学习SQL数据库有所帮助. SQL Server2005开始,TOP子句后 ...

  3. sql LocalDB 的安装环境和使用方法

    LocalDB LocalDB专门为开发商.它是非常容易安装,无需管理,但它提供了相同的T-SQL语言,编程表面和客户端供应商定期的SQL Server Express.实际上,目标SQL Serve ...

  4. SQL localdb 连接字符串

    http://blog.csdn.net/greystar/article/details/47699797 原来SQL 2012 下连接LOCALDB,字符串为: Data Source=(Loca ...

  5. 初试PHP连接sql server

    最开始想使用 pdo_sqlsrv 拓展,但是一直没成功,本文采用的是 pdo_dblib + freetds. 环境:CentOS 6.8.PHP 5.6.20 freetds wget ftp:/ ...

  6. SQL注入:突破关键字过滤

    一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败).回车的ascii ...

  7. 测试常用SQL注入语句大全

    转载自Cracer,标题:<渗透常用SQL注入语句大全>,链接http://www.xxxx.com/?p=2226 1.判断有无注入点 整形参数判断 1.直接加' 2.and 1=1 3 ...

  8. 记一次苦逼的SQL查询优化

    最近在维护公司项目时,需要加载某页面,总共加载也就4000多条数据,竟然需要35秒钟,要是数据增长到40000条,我估计好几分钟都搞不定.卧槽,要我是用户的话估计受不了,趁闲着没事,就想把它优化一下, ...

  9. Sql存储过程解密方法

    在网上查到这样一个存储过程解密的方法,用起来简单,收藏到这里: )) AS ------------------------sql2000大于40000的----------------- --原作: ...

随机推荐

  1. Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护

    CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...

  2. ABP源码分析二十四:Notification

    NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...

  3. 游戏编程系列[2]--游戏编程中RPC与OpLog协议的结合--序

    在系列[1]中,我们展示了RPC调用协议的定义以及演示,通过方法定义以及协议约定,进行了协议约定以及调用过程的约定.然而,实际上在游戏中,调用过程之后,需要传输相对多的数据给服务端. 常用场景,客户端 ...

  4. 通过Gradle为APK瘦身

    引言:在过去几年中,APK 文件的大小曾急剧增长态势.一般来说,其原因如下:Android开发者获取了更多的依赖库,添加了更多的密度,Apps 增加了更多的功能.但实际上我们应该让APKs 尽可能的小 ...

  5. Linux下常见的IO模型

    前言 阻塞IO(blocking IO) 非阻塞IO(nonblocking IO) IO复用(IO multiplexing) 异步IO(asynchronous IO (the POSIX aio ...

  6. .NET Core RC2发布在即,我们试着用记事本编写一个ASP.NET Core RC2 MVC程序

    在.NET Core 1.0.0 RC2即将正式发布之际,我也应应景,针对RC2 Preview版本编写一个史上最简单的MVC应用.由于VS 2015目前尚不支持,VS Code的智能感知尚欠火候,所 ...

  7. angular2系列教程(四)Attribute directives

    今天我们要讲的是ng2的Attribute directives.顾名思义,就是操作dom属性的指令.这算是指令的第二课了,因为上节课的components实质也是指令. 例子

  8. 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)

    在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...

  9. YYModel 源码解读(二)之NSObject+YYModel.h (4)

    接下来我们继续向下看 typedef struct { void *modelMeta; ///< _YYModelMeta void *model; ///< id (self) voi ...

  10. ORACLE 11gR2 DG(Physical Standby)日常维护02

    环境:RHEL 6.5 + Oracle 11.2.0.4 三.监控DG的状态 3.1监控DG备库的状态 3.2监控主库传输日志链路的状态 四.备库切换为snapshot standby 4.1备库切 ...