0

我在 wix 中使用 C# 进行自定义操作,效果很好。自定义操作本质上只是根据传递给方法的参数运行 sql 脚本。

我正在运行的脚本之一用数据填充我的一个表,如果其中没有任何内容,并且看起来像这样:

IF (SELECT COUNT(*) FROM [dbo].[Table]) = 0
BEGIN

INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (N'<<GUID>>', NULL)
INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (N'<<GUID>>', N'The 2nd Item')

...

END

在这种情况下<<GUID>>,类似于e00104e4-7e5f-4563-9356-30732d5ca57e- 这些脚本是使用相应版本的 Management Studio 从 SQL Server 2008 R2 的数据导出生成的。

当我在 Management Studio 中运行此脚本时,它可以正常工作并且如预期的那样,如果那里没有任何数据,则所有数据都会被插入。但是,通过 C# 代码运行它,我得到以下异常:

Conversion failed when converting from a character string to uniqueidentifier

作为表中唯一uniqueidentifier的列,这必须是 ItemId 列,但我无法弄清楚为什么会发生这种情况,或者如何解决问题,最后一小时在线搜索也没有给出任何结果。

编辑

我应该补充一点,这些 SQL 查询位于一个文件中,然后 C# 代码将其内容作为 SQL 查询读取。如果可以的话,我真的不想修改它们,因为它增加了一个不需要的额外步骤。

4

3 回答 3

1

T-SQL 上有一个用于列的转换函数uniqueidentifier试试这个:

INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (CONVERT(uniqueidentifier,N'<<GUID>>'), N'The 2nd Item') 
于 2012-05-31T12:56:55.260 回答
0

有趣的问题。您没有使用 Visual Studio 2008 吗?您使用的驱动程序可能已过期。

于 2012-05-31T13:18:57.567 回答
0

我现在已经解决了这个问题。结果发现其中一个脚本已过期,并且该表的 ID已从an 更改nvarchar为 a uniqueidentifier

然后发生了两件事,第一件事是没有其他人更新填充该表默认数据的脚本。第二个是 wix(或运行 SQL 的自定义操作,我不确定是哪个)在第一个脚本之后报告错误,它恰好具有非常相似的表结构。

所以,总而言之,我应该早点发现问题所在。相反,我会因为不这样做而在 SA 上自欺欺人。无论如何,感谢您的答案,希望它们对偶然发现这个问题的人有用。

于 2012-05-31T13:36:13.767 回答