2012-03-20 115 views
8

我收到一個零星的'無法轉換類型爲'System.Int32'的對象來在.SingleorDefault類型'System.String'異常()在下面的代碼。它的工作原理是9/10次,但隨機拋出一個異常。我確保我傳遞的SettingID沒有空值,表中的數據總是存在於設置ID中,而且我始終將設置ID作爲整數傳遞。無法投入'System.Int32'類型的對象來鍵入'System.String'

任何想法這段代碼有什麼問題。

這裏是異常的信息:

System.InvalidCastException:無法轉換類型 'System.Int32' 的對象爲類型 'System.String'。
在System.Data.SqlClient.SqlBuffer.get_String()
在Read_CPT_Setting(ObjectMaterializer`1)
在System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
在System.Linq的。 Enumerable.SingleOrDefault [TSource](IEnumerable`1源)
在System.Linq.Queryable.SingleOrDefault [TSource](IQueryable`1源)
在CPT.Service.SettingLinqProvider.GetSettingFromDBById(的Int32 SettingId)

CODE:

Public Function GetSettingFromDBById(ByVal SettingId As Integer) As ReturnObject(Of Model.ISettingBase) 

    Dim retObj As New ReturnObject(Of Model.ISettingBase) 
    Dim dbSetting As CPT_Setting 

    Try 
     Dim _cptDB As New CPT.Data.CPTLinqRepository.DB(_connString) 
     Using _cptDB 

      dbSetting = (From s In context.CPT_Settings _ 
            Where s.SettingId = settingId _ 
            Select s).SingleOrDefault 

      If dbSetting IsNot Nothing Then 
       retObj.ReturnValue = Mapping.Setting.MapDBToModel(dbSetting) 
      End If 

     End Using 
    Catch ex As Exception 
     retObj.ReturnValue = Nothing 
     retObj.AddErrorMessage("Error returning the site: " & ex.Message) 
     _log.Error(ex.Message, _userId, ex) 
    End Try 

    If retObj.ReturnValue Is Nothing Then 
     retObj.AddErrorMessage("Site Not Found.") 
    End If 

    Return retObj 
End Function 

我已經更新了每一行後的一些記錄在地方上面的代碼。

Public Function GetSettingFromDBById(ByVal SettingId As Integer) As ReturnObject(Of Model.ISettingBase) 

    Dim retObj As New ReturnObject(Of Model.ISettingBase) 
    Dim dbSetting As CPT_Setting 
    Dim SettingsList As New List(Of CPT_Setting) 

    Dim errStr As String = " ENTER " 

    Try 
     Dim _cptDB As New CPT.Data.CPTLinqRepository.DB(_connString) 
     Using _cptDB 
      errStr &= " - Inside Context " 
      If _cptDB Is Nothing Then 
       errStr &= " - With Context is Nothing " 
       _log.Error("Unusual Object - Unable to create connection object - Object is NOTHING", _userId) 
      End If 

      If System.DBNull.Value.Equals(_cptDB) Then 
       errStr &= " - With Context is NULL " 
       _log.Error("Unusual Object - Unable to create connection object - Object is NULL", _userId) 
      End If 

      errStr &= " - Querying With SettingID = " & SettingId.ToString() 

      Dim dbSettingTemp = (From s In context.CPT_Settings _ 
           Where s.SettingId = settingId _ 
           Select s) 

      If dbSettingTemp Is Nothing Then 
       errStr &= " -- Nothing is returned from DB - Object is NOTHING -- " 
       _log.Error(errStr, _userId) 
      End If 
      If System.DBNull.Value.Equals(dbSettingTemp) Then 
       errStr &= " -- Nothing is returned from DB - Object is NULL -- " 
       _log.Error(errStr, _userId) 
      End If 

      errStr &= " -- Before SingleOrDefault -- " 
      dbSetting = dbSettingTemp.SingleOrDefault 
      errStr &= " -- After SingleOrDefault -- " 

      If dbSetting IsNot Nothing Then 
       If System.DBNull.Value.Equals(dbSetting) Then 
        errStr &= " - NULL OBJECT RETURNED - Before Mapping " 
        _log.Error("Unusual Exception - NULL OBJECT RETURNED " & errStr, _userId) 
       End If 

       retObj.ReturnValue = Mapping.Setting.MapDBToModel(dbSetting) 
       errStr &= " - After Mapping With SettingID=" & dbSetting.SettingId.ToString() & " SettingName=" & dbSetting.SettingName.ToString() & " StartDate=" & dbSetting.StartDate.ToShortDateString() & " EndDate=" & dbSetting.EndDate.ToShortDateString() 

      Else 
       errStr &= " - DBSetting Is Nothing " 
       _log.Error("Unusual Object - No Data Retrieved for SettingID=" & SettingId.ToString() & " " & errStr, _userId) 
      End If 

     End Using 
    Catch ex As Exception 
     retObj.ReturnValue = Nothing 
     retObj.AddErrorMessage("Error returning the site: " & ex.Message) 
     _log.Error("Unusual Exception for SettingID=" & SettingId.ToString() & "--" & errStr & "--" & ex.Message, _userId, ex) 
    End Try 

    If retObj.ReturnValue Is Nothing Then 
     retObj.AddErrorMessage("Site Not Found.") 
     _log.Info("Unusual Object - MRDD Solutions - No Data Retrieved for SettingID=" & SettingId.ToString() & " " & errStr, _userId) 
    End If 

    Return retObj 
End Function 

記住:DB有下面的消息中提到的所有settingIDs所有行。

結果:

方案1:

對象異常 - 未檢索到數據的SettingID = 142176 ENTER - 內部語境 - 詢問與SettingID = 142176 - 之前的SingleOrDefault - - 在SingleOrDefault之後 - - 數據集沒有任何數據

不尋常的對象 - MRDD解決方案 - 沒有數據檢索設置ID = 142176 ENTER - 內部上下文 - 查詢設置ID = 142176 - SingleOrD EFAULT - - 的SingleOrDefault後 - - DBSetting是沒有

方案2

爲SettingID = 138145-- ENTER不尋常的例外 - 內語境 - 詢問與SettingID = 138145 - 之前的SingleOrDefault - - - SingleOrDefault後 - - 指定的強制轉換無效。

對象異常 - MRDD解決方案 - 未檢索到數據的SettingID = 138145 ENTER - 內部語境 - 詢問與SettingID = 138145 - 之前的SingleOrDefault - - 的SingleOrDefault後 -

方案3

異常例外爲SettingID = 164638-- ENTER - 內部上下文 - 詢問與SettingID = 164638 - 的SingleOrDefault前 - --index是陣列的邊界之外。

對象異常 - MRDD解決方案 - 未檢索到數據的SettingID = 164638 ENTER - 內部語境 - 詢問與SettingID = 164638 - 之前的SingleOrDefault -

+0

數據庫中的SettingID列是什麼類型? – 2012-03-21 02:31:46

+1

您的任何'CPT_Setting'類的屬性和數據庫表的列之間的類型是否存在不匹配?如:一列是文本,相應的屬性是int。 – 2012-03-21 10:58:07

+0

沒有。 DB列和DBML/Class屬性之間沒有不匹配。我確定第二組眼睛是正確的。 – ravi 2012-03-21 15:40:25

回答

0

你應該檢查

From s In context.CPT_Settings _ 
Where s.SettingId = settingId _ 
Select s 

不返回多個對象。也許它從來沒有應該,但這可能是問題。

+0

設置ID是主鍵,因此它將只返回一個值。我也嘗試過使用.SingleOrDefault。該錯誤似乎再次發生。 – ravi 2012-05-14 13:45:50

1

而不是使用ToString()的,你必須使用Convert.ToString()

希望這將解決您的問題。

+0

試過但沒有幫助。 – ravi 2012-05-14 13:45:08

0

使用單一替代的SingleOrDefault?

這就是我們如何解決近期​​工作類似的情況。

+0

我也嘗試過,但它沒用 – ravi 2012-05-14 13:46:06

3

我都跟進採用Micorsoft支持,我們已經啓用DebugDiag資料跟蹤和分析轉儲文件,但無法取得任何進展。

經過分析很多我發現3/4服務器沒有最新的框架更新,所以服務器管理員已更新機器.Net Framework 4的可靠性更新1,似乎已經解決了這個問題。沒有代碼更改已完成。自更新以來已經過了兩週,並沒有在此代碼塊中看到一個例外。

浪費了我一個月只爲這一點。穿過它。有時候這只是代碼而已。

相關問題