Ошибка Wix -2147217900 при выполнении запроса SQL

Я создаю проект установки, используя WIX 3.10. Мне нужно создать базу данных SQL Server из установщика, для этого я использую скрипт, сгенерированный Visual Studio Database Project.

Мой код WIX:

<Binary Id="SQLCreateScript" SuppressModularization="no"  SourceFile="$(var.TestInstallDBProject.TargetDir)$(var.TestInstallDBProject.ProjectName)_Create.sql" />

И

<Component Guid="3B413DBB-603B-42BA-80A6-BA8ED5216ACE" Id="FornetDB" Directory="DirIIS" KeyPath="yes">

  <sql:SqlScript BinaryKey="SQLCreateScript" ExecuteOnInstall="yes" SqlDb="MasterDB"  Id="CreateScript" />
</Component>
<sql:SqlDatabase Database="Master"
                       Server="TUSHAR"
                       Instance="SQLSERVER2008R2"
                       Id="MasterDB"
                       ></sql:SqlDatabase>

Выдает эту ошибку:

при установке выдает следующую ошибку

Я открыл файл, сгенерированный в Notepad++, но не вижу символов. Сообщение об ошибке имеет

Файл в Notepad++


person goyaltushar92    schedule 29.06.2016    source источник
comment
Сценарий создания, сгенерированный проектом базы данных Visual Studio, имеет кодировку UTF-8-BOM, которая вызывает проблемы. Скрипты с кодировкой UTF-8 выполняются без каких-либо проблем.   -  person goyaltushar92    schedule 30.06.2016
comment
Могу ли я изменить кодировку для проекта?   -  person goyaltushar92    schedule 30.06.2016


Ответы (1)


Чтобы решить мою проблему, я использую пользовательскую задачу MSbuild, которая удаляет информацию о спецификации из текстового (SQL) файла. Вот код:

using System.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace CustomBuildTasks
{
    public class RemoveBOMInfo : Task
    {
        private  ITaskItem[] _FilesToRemoveBOMInfo;

        [Required]
        public  ITaskItem[] FilesToRemoveBOMInfo { get { return _FilesToRemoveBOMInfo; } set { _FilesToRemoveBOMInfo = value; } } 

        public override bool Execute()
        {
            if (FilesToRemoveBOMInfo == null || FilesToRemoveBOMInfo.Count() < 1)
            {
                Log.LogError("FilesToRemoveBOMInfo can't be null or Empty.");
                return false; 
            }
            //var Files = FilesToRemoveBOMInfo.Split(';');
            foreach (var File in FilesToRemoveBOMInfo) 
            {
                var str = File.GetMetadata("Identity");
                if (!System.IO.File.Exists(str)) 
                {
                    Log.LogError("File {0} not found.", str);
                    continue;
                }
                using (var file = System.IO.File.Open(str, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                {
                    int fByte = file.ReadByte();
                    if (fByte != 239)
                        continue;
                    fByte = file.ReadByte();
                    if (fByte != 187)
                        continue;
                    fByte = file.ReadByte();
                    if (fByte != 191)
                        continue;
                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                    {
                        for (int i = 0; i > -1; ) 
                        {
                            i = file.ReadByte();
                            if (i > 0)
                            {
                                ms.WriteByte((byte)i);
                            }
                        }
                        file.Close();
                        System.IO.File.Delete(str);
                        using (var oFile = System.IO.File.Create(str))
                        {
                            ms.WriteTo(oFile);
                            oFile.Close();
                        }
                    }
                }
            }
            return true;
        }
    }
}

и используется в сценарии MSBuild как:

<Target Name="AfterResolveReferences" >
    <RemoveBOMInfo FilesToRemoveBOMInfo="%(_ResolvedProjectReferencePaths.RelativeDir)%(_ResolvedProjectReferencePaths.Name)_Create.sql" Condition="'%(_ResolvedProjectReferencePaths.IsSQLProj)' == 'True'" ></RemoveBOMInfo>    
</Target>
person goyaltushar92    schedule 03.07.2016
comment
однако скрипт по-прежнему не работает, так как скрипту требуется SQLCMD. Поэтому нужно написать пользовательское действие. - person goyaltushar92; 04.07.2016