为无效转换引发的 SqlException

本文关键字:SqlException 无效 转换 | 更新日期: 2023-09-27 18:35:48

我在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 的数据导出生成的。

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

Conversion failed when converting from a character string to uniqueidentifier

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

编辑

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

为无效转换引发的 SqlException

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

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

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

我现在已经解决了这个问题。原来其中一个脚本已过期,表的 ID 已从nvarchar更改为uniqueidentifier

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

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