我在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内容作为SQL查询读取。如果我能提供帮助,我真的不想修改它们,因为它增加了一个不应该需要的额外步骤。
答案 0 :(得分:1)
uniqueidentifier
列的T-SQL上有转换函数
试试这个:
INSERT [dbo].[Table] ([ItemId], [Description]) VALUES (CONVERT(uniqueidentifier,N'<<GUID>>'), N'The 2nd Item')
答案 1 :(得分:0)
有趣的问题。您是不是有机会使用Visual Studio 2008?您使用的驱动程序可能已过时。
答案 2 :(得分:0)
我现在已经解决了这个问题。事实证明其中一个脚本已过期,那个表的ID已从nvarchar
更改为uniqueidentifier
。
然后发生了两件事,第一件事是没有其他人更新填充表默认数据的脚本。第二个是wix(或运行SQL的自定义操作,我不确定究竟是哪个)在第一个脚本之后报告错误,它恰好具有非常相似的表结构。
所以,总而言之,我应该早点发现问题所在。相反,由于没有这样做,我在SA上做了一个傻瓜。无论如何,谢谢你们的答案,希望它们对那些偶然发现这个问题的人有用。