Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to cast object of type 'System.Int32' to type 'System.String'

I'm getting a sporadic 'Unable to cast object of type 'System.Int32' to type 'System.String' Exceptions at .SingleorDefault() in the below code. It works 9/10 times but randomly it throws an exception. I made sure that SettingID that i'm passing has no Null Values and the data in the table always exists for the settingID, and i'm always passing SettingID as Integer.

Any ideas what is wrong with this code.

Here is the Exception Info:

System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'.
at System.Data.SqlClient.SqlBuffer.get_String()
at Read_CPT_Setting(ObjectMaterializer`1 )
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)
at 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

I've updated the above code with some logging in place after each line.

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

Remember: DB has all the rows for all the settingIDs mentioned in below messages.

Results:

Scenario 1:

Unusual Object - No Data Retrieved for SettingID=142176 ENTER - Inside Context - Querying With SettingID = 142176 -- Before SingleOrDefault -- -- After SingleOrDefault -- - DBSetting Is Nothing

Unusual Object - MRDD Solutions - No Data Retrieved for SettingID=142176 ENTER - Inside Context - Querying With SettingID = 142176 -- Before SingleOrDefault -- -- After SingleOrDefault -- - DBSetting Is Nothing

Scenario 2

Unusual Exception for SettingID=138145-- ENTER - Inside Context - Querying With SettingID = 138145 -- Before SingleOrDefault -- -- After SingleOrDefault -- --Specified cast is not valid.

Unusual Object - MRDD Solutions - No Data Retrieved for SettingID=138145 ENTER - Inside Context - Querying With SettingID = 138145 -- Before SingleOrDefault -- -- After SingleOrDefault --

Scenario 3

Unusual Exception for SettingID=164638-- ENTER - Inside Context - Querying With SettingID = 164638 -- Before SingleOrDefault -- --Index was outside the bounds of the array.

Unusual Object - MRDD Solutions - No Data Retrieved for SettingID=164638 ENTER - Inside Context - Querying With SettingID = 164638 -- Before SingleOrDefault --

like image 753
ravi Avatar asked Mar 20 '12 20:03

ravi


2 Answers

I have followed up with Micorsoft Support and we have enabled debugdiag trace and analyze dump files but could not get anywhere.

After analyzing a lot i found out that 3/4 servers has no latest framework updates so the Server Admins have updated the machines with Reliability Update 1 for .Net Framework 4 and it seems to have resolved the issue. No code changes has been done. It has been two weeks since the update and did not see a single exception in this code block.

I wasted a month just for this. Darn it. Sometimes it is just not the code.

like image 61
ravi Avatar answered Oct 16 '22 00:10

ravi


Instead of using ToString() you have to use Convert.ToString()

Hope it will solve your problem.

like image 38
Arul Kumar Avatar answered Oct 16 '22 00:10

Arul Kumar