抛出SqlException以进行无效转换

时间:2012-05-31 12:47:04

标签: c# sql-server wix ssms

我在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查询读取。如果我能提供帮助,我真的不想修改它们,因为它增加了一个不应该需要的额外步骤。

3 个答案:

答案 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上做了一个傻瓜。无论如何,谢谢你们的答案,希望它们对那些偶然发现这个问题的人有用。