最近有个项目需要生成一个自动打包安装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. Redis集群案例与场景分析

    1.背景 Redis的出现确实大大地提高系统大并发能力支撑的可能性,转眼间Redis的最新版本已经是3.X版本了,但我们的系统依然继续跑着2.8,并很好地支撑着我们当前每天5亿访问量的应用系统.想当年 ...

  2. Egret3D 研究报告(一)初试

    了解的朋友应该知道我最近一直都在鼓吹webgl. 今天有一点时间,加了一个Egret3D的群,就开始了这个坑. 耳听为虚,眼见为实.让我们荡起双桨,一起去刷一下egret 打开姿势 至于以什么姿势打开 ...

  3. salesforce 零基础学习(六十一)apex:component简单使用以及图片轮转播放的实现

    有的时候,我们项目有可能有类似需求:做一个简单的图像轮转播放功能,不同的VF页面调用可以显示不同的图片以及不同的图片描述.这种情况,如果在每个页面单独处理相关的图像轮转播放则显得代码特别冗余,此种情况 ...

  4. iOS-开发进阶

    iOS完整学习路线图 iOS进阶介绍: 一.iOS-常用的第三方框架的介绍 二.iOS-提高iOS开发效率的方法和工具 三.常用的调试方法 1.iOS-调试技巧 2.iOS-Xcode的使用技巧 四. ...

  5. python支持mysql

    MySQLdb只支持Python2.,还不支持3. 可以用PyMySQL代替.安装方法:pip install PyMySQL 然后在需要的项目中,把 init.py中添加两行: import pym ...

  6. 【Win 10应用开发】延迟加载图片的另一种方法

    上一篇文章中老周给大伙介绍了x:Phase和x:Bind的用法,并演示了一个延迟加载的示例.不过,那个例子会遗留一个问题,就是UI线程被阻塞,所以启动应用较慢. 如果希望图片可以延迟加载,或许我们可以 ...

  7. JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

    1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法.   2.有时候需要传递大量可选参数的情形时,一 ...

  8. C/S架构和B/S架构的概念和区别

    C/S 架构 C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端 ...

  9. ffmpeg用法及如何使用fluent-ffmpeg

    http://ffmpeg.org/ 官网 ffmpeg(命令行工具) 是一个快速的音视频转换工具. 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an o ...

  10. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...