Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以导出SqlString编辑字符串的结果?_Sql_Wix_Wix Extension_Database Installation - Fatal编程技术网

是否可以导出SqlString编辑字符串的结果?

是否可以导出SqlString编辑字符串的结果?,sql,wix,wix-extension,database-installation,Sql,Wix,Wix Extension,Database Installation,我有一个安装数据库的安装程序。数据库与一些登录名一起创建。为了创建登录,我正在使用SqlString元素中的主数据库。只有在SQL server上具有非常高权限的用户才能访问主数据库。通常,由于缺少权限,无法执行为主数据库指定的SQL字符串,因此安装会中止 我想编辑我的安装程序,以便在无法执行SqlString元素时,跳过安装的SQL部分。安装完成后,我希望用户能够自己执行SQL语句。我的安装程序执行的每个SQL操作都存储在SqlString元素中。SqlString元素包含许多在安装过程中被替

我有一个安装数据库的安装程序。数据库与一些登录名一起创建。为了创建登录,我正在使用SqlString元素中的主数据库。只有在SQL server上具有非常高权限的用户才能访问主数据库。通常,由于缺少权限,无法执行为主数据库指定的SQL字符串,因此安装会中止

我想编辑我的安装程序,以便在无法执行SqlString元素时,跳过安装的SQL部分。安装完成后,我希望用户能够自己执行SQL语句。我的安装程序执行的每个SQL操作都存储在SqlString元素中。SqlString元素包含许多在安装过程中被替换的属性。我想将所有编辑过的SqlString元素的内容提取到存储在用户目录中的一个sql文件中

我想我必须编写一个customaction,它发生在sqlextension替换属性之后。然后我必须访问这些修改过的字符串。我有什么办法可以做到这一点吗

示例SqlString元素:

    <sql:SqlDatabase Id="MasterDB" Server="[SQLSERVER_SERVER]" Instance="[SQLSERVER_INSTANCENAME]" Database="master" />

<sql:SqlString
      SqlDb="MasterDB"
      Id="CreateNetworkServiceAccount"
      ExecuteOnInstall="yes"
      ContinueOnError="no"
      SQL="IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'{[WIX_ACCOUNT_NETWORKSERVICE]}')
        CREATE LOGIN [\[]{[WIX_ACCOUNT_NETWORKSERVICE]}[\]] FROM WINDOWS WITH DEFAULT_DATABASE=[\[]master[\]]"
      Sequence="101"/>

我用一种相当奇怪的方法解决了这个问题。我编写了一个CustomAction,它从SqlString表中提取字符串元素,然后用存储在会话中的适当属性替换格式化字段。要访问会话变量,必须以
立即
的方式执行CustomAction。我已经在
InstallFinalize
之前安排了访问
PersonalFolder
属性的权限。有了这个属性,我就可以在users Documents目录中存储由SqlScript表中的条目生成的Sql脚本。为了说明安装中的不同数据库,我在SqlDatabase表中包含了一个查找

以下是CustomAction的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Deployment.WindowsInstaller;
using System.IO;
using System.Text.RegularExpressions;

namespace SaveSqlStrings
{
    public class CustomActions
    {
        [CustomAction]
        public static ActionResult SaveSqlStrings(Session session)
        {
            StringBuilder sqlStrings = new StringBuilder();
            Database db = session.Database;
            View view = db.OpenView("SELECT * FROM `SqlString`");
            IList<string> SqlStringElements = db.ExecuteStringQuery("SELECT `String` FROM `SqlString`");
            Regex bracketedProperties = new Regex(@"\[(\b[A-Z_]*\b)\]");
            Regex formattedProperties = new Regex(@"{\[(\b[A-Z_]*\b)\]}");
            Regex openeningSquareBrackets = new Regex(@"\[\\\[\]");
            Regex closingSquareBrackets = new Regex(@"\[\\\]\]");
            string sqlDb_ = "";
            string sqlString = "";
            string Database = "";
            foreach (string dbString in SqlStringElements)
            {
                sqlDb_ = (string)db.ExecuteScalar("SELECT `SqlDb_` FROM `SqlString` WHERE `String` ='{0}'",dbString);
                sqlString = (string)db.ExecuteScalar("SELECT `SQL` FROM `SqlString` WHERE `String` ='{0}'",dbString);
                view.Close();
                view = db.OpenView("SELECT * FROM `SqlDatabase`");
                Database = (string)db.ExecuteScalar("SELECT `Database` from `SqlDatabase` WHERE `SqlDb`='{0}'", sqlDb_);
                if(bracketedProperties.IsMatch(Database))
                {
                    Database = bracketedProperties.Match(Database).Groups[1].Value;
                    Database = session[Database];
                }
                if (openeningSquareBrackets.IsMatch(sqlString))
                    sqlString = openeningSquareBrackets.Replace(sqlString, "[");
                if (closingSquareBrackets.IsMatch(sqlString))
                    sqlString = closingSquareBrackets.Replace(sqlString, "]");
                if(formattedProperties.IsMatch(sqlString))
                {
                    string propertyName = formattedProperties.Match(sqlString).Groups[1].Value;
                    string propertyValue = session[propertyName];
                    sqlString = formattedProperties.Replace(sqlString, propertyValue);
                }
                sqlStrings.AppendLine(String.Format("use {0}",Database));
                sqlStrings.AppendLine(sqlString);
            }
            string home = session["PersonalFolder"];
            string sqlPath = string.Concat(home, @"Script.sql");
            try
            {
                File.WriteAllText(sqlPath, sqlStrings.ToString());
            }
            catch (Exception ex)
            {
                session["FailedTowrite"] = sqlPath;
            }
            view.Close();
            db.Close();
            return ActionResult.Success;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Microsoft.Deployment.WindowsInstaller;
使用System.IO;
使用System.Text.RegularExpressions;
名称空间SaveSqlStrings
{
公共集体诉讼
{
[海关行动]
公共静态ActionResult SaveSqlStrings(会话)
{
StringBuilder sqlStrings=新的StringBuilder();
Database db=session.Database;
View=db.OpenView(“从`SqlString`中选择*”;
IList SqlStringElements=db.ExecuteStringQuery(“从`SqlString`中选择`String`”);
Regex-bracketedProperties=new Regex(@“\[(\b[A-Z\]*\b)\]”);
Regex formattedProperties=newregex(@“{\[(\b[A-Z\]*\b)\]}”);
正则表达式openeringsquare括号=新正则表达式(@“\[\\\\[\]”);
正则表达式closingsquare括号=新正则表达式(@“\[\\\]\]”);
字符串sqlDb_u=“”;
字符串sqlString=“”;
字符串数据库=”;
foreach(SqlStringElements中的字符串dbString)
{
sqlDb_=(string)db.ExecuteScalar(“从`SqlString`中选择`sqlDb_`WHERE`string`='{0}',dbString”);
sqlString=(string)db.ExecuteScalar(“从`sqlString`中选择`SQL`,其中`string`='{0}',dbString);
view.Close();
view=db.OpenView(“从`SqlDatabase`中选择*”;
Database=(string)db.ExecuteScalar(“从`SqlDatabase`中选择`Database`,其中`SqlDb`='{0}'”,SqlDb_);
if(bracketedProperties.IsMatch(数据库))
{
数据库=bracketedProperties.Match(数据库).Groups[1]。值;
数据库=会话[数据库];
}
if(openiningsquaresholds.IsMatch(sqlString))
sqlString=openiningsquarestores.Replace(sqlString,“[”);
if(ClosingSquare括号.IsMatch(sqlString))
sqlString=ClosingSquare括号。替换(sqlString,“]”);
if(formattedProperties.IsMatch(sqlString))
{
string propertyName=formattedProperties.Match(sqlString).Groups[1]。值;
字符串propertyValue=会话[propertyName];
sqlString=formattedProperties.Replace(sqlString,propertyValue);
}
AppendLine(String.Format(“使用{0}”,数据库));
AppendLine(sqlString);
}
字符串home=会话[“个人文件夹”];
string sqlPath=string.Concat(home,@“Script.sql”);
尝试
{
File.WriteAllText(sqlPath,sqlStrings.ToString());
}
捕获(例外情况除外)
{
会话[“FailedTowrite”]=sqlPath;
}
view.Close();
db.Close();
返回操作结果。成功;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Deployment.WindowsInstaller;
using System.IO;
using System.Text.RegularExpressions;

namespace SaveSqlStrings
{
    public class CustomActions
    {
        [CustomAction]
        public static ActionResult SaveSqlStrings(Session session)
        {
            StringBuilder sqlStrings = new StringBuilder();
            Database db = session.Database;
            View view = db.OpenView("SELECT * FROM `SqlString`");
            IList<string> SqlStringElements = db.ExecuteStringQuery("SELECT `String` FROM `SqlString`");
            Regex bracketedProperties = new Regex(@"\[(\b[A-Z_]*\b)\]");
            Regex formattedProperties = new Regex(@"{\[(\b[A-Z_]*\b)\]}");
            Regex openeningSquareBrackets = new Regex(@"\[\\\[\]");
            Regex closingSquareBrackets = new Regex(@"\[\\\]\]");
            string sqlDb_ = "";
            string sqlString = "";
            string Database = "";
            foreach (string dbString in SqlStringElements)
            {
                sqlDb_ = (string)db.ExecuteScalar("SELECT `SqlDb_` FROM `SqlString` WHERE `String` ='{0}'",dbString);
                sqlString = (string)db.ExecuteScalar("SELECT `SQL` FROM `SqlString` WHERE `String` ='{0}'",dbString);
                view.Close();
                view = db.OpenView("SELECT * FROM `SqlDatabase`");
                Database = (string)db.ExecuteScalar("SELECT `Database` from `SqlDatabase` WHERE `SqlDb`='{0}'", sqlDb_);
                if(bracketedProperties.IsMatch(Database))
                {
                    Database = bracketedProperties.Match(Database).Groups[1].Value;
                    Database = session[Database];
                }
                if (openeningSquareBrackets.IsMatch(sqlString))
                    sqlString = openeningSquareBrackets.Replace(sqlString, "[");
                if (closingSquareBrackets.IsMatch(sqlString))
                    sqlString = closingSquareBrackets.Replace(sqlString, "]");
                if(formattedProperties.IsMatch(sqlString))
                {
                    string propertyName = formattedProperties.Match(sqlString).Groups[1].Value;
                    string propertyValue = session[propertyName];
                    sqlString = formattedProperties.Replace(sqlString, propertyValue);
                }
                sqlStrings.AppendLine(String.Format("use {0}",Database));
                sqlStrings.AppendLine(sqlString);
            }
            string home = session["PersonalFolder"];
            string sqlPath = string.Concat(home, @"Script.sql");
            try
            {
                File.WriteAllText(sqlPath, sqlStrings.ToString());
            }
            catch (Exception ex)
            {
                session["FailedTowrite"] = sqlPath;
            }
            view.Close();
            db.Close();
            return ActionResult.Success;
        }
    }
}