2012-03-20 20 views
8

Dostaję sporadyczne "Nie można rzucić obiektu typu" System.Int32 ", aby wpisać" System.String "Wyjątki w .SingleorDefault() w poniższym kodzie. Działa 9/10 razy, ale losowo rzuca wyjątek. Upewniłem się, że ustawienie ID, które przekazuję, nie ma wartości zerowych, a dane w tabeli zawsze istnieją dla identyfikatora settingID i zawsze przekazuję wartość SettingID jako liczbę całkowitą.Nie można rzutować obiektu typu "System.Int32" na typ "System.String"

Wszelkie pomysły na temat tego kodu.

Oto Info Wyjątek:

System.InvalidCastException: Nie można rzutować obiektu typu 'System.Int32' wpisz 'System.String'.
w System.Data.SqlClient.SqlBuffer.get_String()
w Read_CPT_Setting (ObjectMaterializer`1)
w System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
w System.Linq. Enumerable.SingleOrDefault [TSource] (źródło IEnumerable`1)
w System.Linq.Queryable.SingleOrDefault [TSource] (źródło IQueryable`1)
w CPT.Service.SettingLinqProvider.GetSettingFromDBById (Int32 SettingId)

KOD:

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 

zaktualizowałem powyższy kod z niektórych rejestrowania na miejscu po każdej linii.

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 

Pamiętaj: DB ma wszystkie wiersze dla wszystkich settingIDs wymienionych w poniższych komunikatów.

Wyniki:

Scenariusz 1:

Niezwykłe Object - brak danych Źródło dla SettingID = 142176 ENTER - Wewnątrz Kontekst - Zapytania Z SettingID = 142176 - - - Przed SingleOrDefault Po SingleOrDefault - - DBSetting Is Nothing

Niezwykły obiekt - Rozwiązania MRDD - Brak danych dla SettingID = 142176 ENTER - Wewnątrz kontekstu - Zapytanie z ustawianiemID = 142176 - Przed SingleOrD EFAULT - - Po SingleOrDefault - - DBSetting Is Nothing

Scenariusz 2

Niezwykłe Wyjątek dla SettingID = 138145-- ENTER - Wewnątrz Kontekst - Zapytania Z SettingID = 138145 - zanim SingleOrDefault - - - Po SingleOrDefault - - Specyfikacja rzutowania jest nieprawidłowa.

Niezwykłe Object - MRDD Solutions - Nie Źródło dla SettingID = 138145 wprowadzania danych - Wewnątrz kontekście - odpytywanie Z SettingID = 138145 - zanim SingleOrDefault - - Po SingleOrDefault -

Scenariusz 3

Niezwykły wyjątek dla SettingID = 164638 - ENTER - Inside Context - Zapytanie z SettingID = 164638 - Before SingleOrDefault - --Index był poza granicami tablicy.

Niezwykłe Object - MRDD Solutions - Nie Źródło dla SettingID = 164638 wprowadzania danych - Wewnątrz kontekście - odpytywanie Z SettingID = 164638 - Przed SingleOrDefault -

+0

Jakiego typu jest kolumna SettingID w bazie danych? –

+1

Czy istnieje niezgodność typów między dowolnymi właściwościami klasy 'CPT_Setting' i kolumnami tabeli bazy danych? Podobnie jak: kolumna jest tekstem, a odpowiednią właściwością jest int. –

+0

Nie. Nie ma niezgodności między kolumnami DB a właściwościami DBML/Class. Upewniłem się, że to jest poprawne z drugim zestawem oczu. – ravi

Odpowiedz

0

Należy sprawdzić,

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

nie zwróć więcej niż jeden obiekt. Być może to powinno być nigdy, ale to może być problem.

+0

SettingID jest kluczem podstawowym, więc zwróci tylko jedną wartość. Próbowałem również z .SingleOrDefault również. Wydaje się, że błąd się powtarza. – ravi

1

Zamiast ToString() trzeba użyć Convert.ToString()

nadzieję, że to rozwiąże problem.

+0

Próbowałem, ale nie pomogłem. – ravi

0

Użyj pojedynczego zamiast pojedynczego obiektu?

W ten sposób ostatnio rozwiązaliśmy podobną sytuację w pracy.

+0

Też spróbowałem, ale to nie ma sensu – ravi

3

Skorzystałem z pomocy Micorsoft, a my włączono śledzenie debugdiag i analizowaliśmy pliki zrzutu, ale nie mogliśmy nigdzie wejść.

Po przeanalizowaniu wielu okazało się, że 3/4 serwery nie ma najnowsze aktualizacje ramowych tak adminów serwera zostały zaktualizowane maszyn z niezawodność aktualizacji 1 dla systemu .NET Framework 4 i wydaje się, że problem został rozwiązany. Nie dokonano żadnych zmian kodu. Minęły dwa tygodnie od aktualizacji i nie widziałem żadnego wyjątku w tym bloku kodu.

Zmarnowałem miesiąc tylko na to. Daruj to. Czasami po prostu nie jest to kod.

Powiązane problemy