执行 SQL 查询时出现 Wix 错误 -2147217900
Wix Error -2147217900 while executing SQL query
我正在使用 WIX 3.10 构建安装项目。我需要从安装程序创建一个 SQL 服务器数据库,因为我正在使用 Visual Studio 数据库项目生成的脚本。
我的 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++ 生成的文件,但看不到字符。错误信息有
为了解决我的问题,我使用了自定义 MSbuild 任务,它从文本 (SQL) 文件中删除了 BOM 信息。这是代码:
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>
我正在使用 WIX 3.10 构建安装项目。我需要从安装程序创建一个 SQL 服务器数据库,因为我正在使用 Visual Studio 数据库项目生成的脚本。
我的 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++ 生成的文件,但看不到字符。错误信息有
为了解决我的问题,我使用了自定义 MSbuild 任务,它从文本 (SQL) 文件中删除了 BOM 信息。这是代码:
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>