我有一个 DBML 文件,它定义了大量的实体供我们的 LINQ-to-SQL 查询使用。它在 SQL Server 2005 和 SQL Server 2008 以及我们正在与之集成的第三方软件的特定版本上运行良好。但是,我们现在正在调查在新操作系统 (Windows Server 2012) 和数据库平台 (SQL Server 2012) 上运行的第三方软件的更新版本,并作为 64 位进程。
当我尝试在这个新环境中从我们在数据库(不是第三方软件)中定义的表中检索一个对象时,我遇到了异常,“字符串必须恰好是一个字符长。” 现在我从其他问题和文章中了解到,过去 Visual Studio 将某些列创建为 Char 类型而不是列的 String 类型时出现了一些错误行为nvarchar(1)
。但是有很多因素让我相信我在这里处理的是一个不同的问题:
- 根据 DBML 文件,我从中检索数据的表中没有 Char 列,甚至没有
nvarchar(1)
数据库列。 - 尽管第三方表的架构发生了变化,但我们的数据库架构和 DBML 文件在有效版本和引发此异常的版本之间没有发生变化。而且我只是从我们的一张表(
Dim dtl = Aggregate i In context.FSE_ItemDetails Into First()
)中查询数据。
我需要帮助的是确定导致此错误的表和列。我假设错误来自我试图从中检索数据的表,但是当我查看架构时,很难想象如何。AFormatException
几乎没有关于错误来源的信息,当我发现它时,我无法获得太多关于发生了什么的信息。我可以在调用堆栈中看到(不幸的是,仅作为字符串提供),这System.Convert.ToChar
是抛出它的函数,以及我们的ItemDetail.get_Item()
生成的函数是堆栈中代码的最后一层。但是没有柱子的提示。如果可能的话,我想通过更改重现错误的测试程序来缩小范围,因为我没有在可以重现错误的相同环境上设置调试环境。但是一旦异常解除到我的级别,我不知道如何以编程方式访问调用堆栈中的数据。
编辑
我误认为我只访问一张表。我忘记了我的测试输出是指来自第三方模式的关联对象,该对象确实可能已更新。但是,问题仍然存在,是否有一种好的方法来识别导致错误的源列。该表中有很多很多列。