2016-06-29 8 views
1

Ich bin ein Setup-Projekt mit WIX 3.10 erstellen. Ich muss eine SQL Server-Datenbank vom Installer erstellen, dafür verwende ich ein Skript, das von Visual Studio Database Project generiert wird.Wix Fehler -2147217900 beim Ausführen der SQL-Abfrage

Mein WIX-Code ist:

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

UND

<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> 

Es diesen Fehler führt:

it throws following Error while installation

I-Datei in Editor erzeugt opened ++, aber nicht Zeichen sehen . Fehlermeldung hat

File In Notepad++

+0

Visual Studio-Datenbank Projekt erstellen generierte Skript hat encodding ** UTF-8-BOM ** dass verursacht Problem Skripte mit ** UTF-8 ** -Encodierung läuft ohne Probleme. – goyaltushar92

+0

Kann ich die Codierung für Project ändern? – goyaltushar92

Antwort

0

Zu meinem Problem ich benutzerdefinierte MSBuild-Aufgabe verwenden zu lösen, dass entfernen BOM Informationen aus Text (SQL) Datei. Hier ist Code:

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; 
     } 
    } 
} 

und in MSBuild-Skript als:

<Target Name="AfterResolveReferences" > 
    <RemoveBOMInfo FilesToRemoveBOMInfo="%(_ResolvedProjectReferencePaths.RelativeDir)%(_ResolvedProjectReferencePaths.Name)_Create.sql" Condition="'%(_ResolvedProjectReferencePaths.IsSQLProj)' == 'True'" ></RemoveBOMInfo>  
</Target> 
+0

Skript läuft jedoch immer noch nicht, da Skript SQLCMD benötigt. Also muss benutzerdefinierte Aktion schreiben. – goyaltushar92