2016-06-29 1 views
1

Je suis en train de créer un projet d'installation en utilisant WIX 3.10. J'ai besoin de créer une base de données SQL Server à partir du programme d'installation, pour cela j'utilise un script généré par Visual Studio Database Project.Wix Erreur -2147217900 lors de l'exécution de la requête SQL

Mon code Wix est:

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

ET

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

Il lance cette erreur:

it throws following Error while installation

J'ouvris fichier généré dans Notepad ++, mais ne peut pas voir les caractères . Message d'erreur a

File In Notepad++

+0

projet de base de données Visual Studio généré créer script a encodding ** UTF-8 BOM ** qui provoque des scripts d'émission avec ** L'encodage UTF-8 ** fonctionne sans problème. – goyaltushar92

+0

Puis-je changer l'encodage pour Project? – goyaltushar92

Répondre

0

Pour résoudre mon problème, j'utilise la coutume MSBuild tâche, qui éliminent les informations de nomenclature du fichier texte (SQL). Voici le 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; 
     } 
    } 
} 

et utilisé dans le script MSBuild:

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

Toutefois, le script ne fonctionne toujours pas car le script nécessite SQLCMD. Il faut donc écrire une action personnalisée. – goyaltushar92