簡體   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