【问题标题】:SqlException thrown for invalid conversion无效转换引发 SqlException
【发布时间】:2012-05-31 12:47:03
【问题描述】:

我在 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

在这种情况下,&lt;&lt;GUID&gt;&gt; 类似于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 查询读取。如果可以的话,我真的不想修改它们,因为它增加了一个不需要的额外步骤。

【问题讨论】:

  • 您能检查一下通过 Profiler 工具实际传递给数据库的内容吗?请粘贴它,以便我们进行更多调查
  • 您需要检查变量中有哪些值,该变量用于在 C# 代码中存储 GUID 数据。该变量是否包含正确的值?并检查是否通过 sql 中的参数将相同的值传递到查询中。

标签: c# sql-server wix ssms


【解决方案1】:

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

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

【讨论】:

  • 我刚刚更新了原始问题,为什么这不是我所拥有的真正理想的解决方案。它可以正常工作,但我仍然觉得奇怪的是 management studio 运行相同的 SQL 没有问题。
  • 好吧,似乎没有办法将这样的字符串传递回 SQLServer。我试图找到一种方法来告诉 SSMS 在其输出脚本中插入一个 CONVERT 但没有成功。可能它认为脚本是供自己使用的副本。另一方面,如果 uniqueidentifier 在 SqlCommand 中作为字符串传递,则会因上述错误而失败。我认为您应该在通过 ADO.NET 将 INSERT 提交到 SqlServer 之前实现转换。
【解决方案2】:

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

【讨论】:

  • 不,我正在使用 VS 2010,无论如何我已经弄清楚了问题所在。我可能也应该考虑早点检查它...请参阅下面的答案
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多