繁体   English   中英

如何从LINQ to SQL中的SQL Server 2012识别FormatException的来源

[英]How to identify source of a FormatException from SQL Server 2012 in LINQ to SQL

我有一个DBML文件,该文件定义了供LINQ-to-SQL查询使用的大量实体。 它在SQL Server 2005和SQL Server 2008以及我们正在与之集成的特定版本的第三方软件上运行良好。 但是,我们现在正在研究在新OS(Windows Server 2012)和数据库平台(SQL Server 2012)上以及作为64位进程运行的第三方软件的较新版本。

当我尝试从我们在这个新环境中的数据库(而不是第三方软件)中定义的表的一个获取对象,我得到异常,“字符串必须是一个字符长。” 现在,从其他问题和文章中我知道,Visual Studio过去将某些列创建为Char类型而不是String为nvarchar(1)列创建了一些错误行为。 但是有很多因素使我相信我正在这里处理另一个问题:

  1. 根据DBML文件,我从中检索数据的表中没有Char列,甚至没有nvarchar(1)数据库列。
  2. 尽管第三方表的架构已更改,但在起作用的版本和引发此异常的版本之间,我们的数据库架构和DBML文件并未更改。 而且我只从其中一个表中查询数据( Dim dtl = Aggregate i In context.FSE_ItemDetails Into First() )。

我需要帮助的是确定导致此错误的表和列。 我假设错误是来自我要从中检索数据的表,但是当我查看架构时,很难想象它是怎么回事。 FormatException很少提供有关错误源的信息,而当我捕获到该错误时,我没有太多了解发生了什么情况的信息。 我可以在调用堆栈(不幸的是,仅以字符串形式提供)中看到, System.Convert.ToChar是抛出该函数的函数,而我们的ItemDetail.get_Item()生成的函数是代码中的最后一层堆。 但是没有专栏的提示。 如果可能,我希望通过更改重现错误的测试程序来缩小此范围,因为我没有在可以重现错误的环境中设置调试环境。 但是,一旦异常解除到我的水平,我不知道如何以编程方式访问调用堆栈中的数据。

编辑

我只访问一个表这一事实使我感到误解。 我忘记了我的测试输出是引用了第三方架构中的关联对象,该对象确实可能已更新。 问题仍然存在,但是,有没有一种好的方法来识别导致错误的源列。 该表中有很多列。

在发现我查看了错误的表之后,我只是在XML编辑器中打开了DBML文件,找到了我现在怀疑是问题所在的表的定义,并查找了Type设置为System.Char每个Column元素。 我查询了新数据库中的每一列,最后找到了一个不完全包含1个字符的列。 对其进行进一步检查表明,它曾经被定义为Char(1) NULL ,但是现在是nvarchar(2) NULL 通过更正并再次运行测试而没有错误,我已经确认这是我所看到的问题的根源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM