我有一个DBML文件,它定义了大量实体供我们的LINQ-to-SQL查询使用。它在SQL Server 2005和SQL Server 2008以及我们正在集成的特定版本的第三方软件上运行良好。但是,我们正在调查在新操作系统(Windows Server 2012)和数据库平台(SQL Server 2012)上运行的第三方软件的较新版本,以及64位进程。
当我尝试从这个新的环境中的数据库(而不是第三方软件)中定义的我们中的一个表中检索对象时,我得到了异常,“字符串必须是只有一个字符长。“现在我从其他问题和文章中了解到,过去Visual Studio中存在一些错误行为,因为nvarchar(1)
列创建了某些列作为Char类型而不是String类型。但是有很多因素让我相信我在处理一个不同的问题:
nvarchar(1)
数据库列。Dim dtl = Aggregate i In context.FSE_ItemDetails Into First()
)查询数据。我需要帮助的是确定导致此错误的表和列。我假设错误来自我试图从中检索数据的表,但是当我看到模式时,很难想象如何。 FormatException
几乎没有关于错误来源的信息,当我抓住它时,我无法了解发生了什么。我可以在调用堆栈中看到(不幸的是只提供一个字符串),System.Convert.ToChar
是抛出它的函数,而我们的ItemDetail.get_Item()
生成函数是我们代码中的最后一级代码。堆。但是没有暗示一个专栏。如果可能的话,我希望通过更改我的重现错误的测试程序来缩小范围,因为我没有在可以重现错误的相同环境中设置调试环境。但是,一旦异常解除到我的级别,我不知道如何以编程方式访问调用堆栈中的数据。
修改
我错误地认为我只访问了一张桌子。我忘记了我的测试输出是指来自第三方模式的关联对象,实际上可能已经更新了。然而,问题仍然是有一种很好的方法来识别导致错误的源列。该表中有许多列。
答案 0 :(得分:0)
在发现我正在查看错误的表之后,我刚刚在XML编辑器中打开了DBML文件,找到了我现在怀疑是问题的表的定义,并查找了每个Column
元素{ {1}}已设置为Type
。我查询了新数据库中的每一列,最后找到了一个不包含1个字符的列。检查进一步表明它曾经被定义为System.Char
,但现在是Char(1) NULL
。我已经确认这是我看到的问题的根源,通过纠正它并再次运行测试而没有错误。