2012-03-20 15 views
8

Ricevo un errore 'Impossibile eseguire il cast di tipo' System.Int32 'per digitare' System.String 'Eccezioni su .SingleorDefault() nel codice seguente. Funziona 9/10 volte ma casualmente genera un'eccezione. Mi sono assicurato che SettingID che sto passando non ha valori Null e i dati nella tabella esistono sempre per l'ID di impostazione, e sto sempre passando SettingID come Integer.Impossibile eseguire il cast dell'oggetto di tipo 'System.Int32' per digitare 'System.String'

Qualche idea su cosa non va con questo codice.

Qui è l'eccezione Info:

System.InvalidCastException: Impossibile eseguire il cast oggetto di tipo 'System.Int32' digitare 'System.String'.
a System.Data.SqlClient.SqlBuffer.get_String()
a Read_CPT_Setting (ObjectMaterializer`1)
a System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
a System.Linq. Enumerable.SingleOrDefault [TSource] (fonte IEnumerable`1)
a System.Linq.Queryable.SingleOrDefault [TSource] (fonte IQueryable`1)
a CPT.Service.SettingLinqProvider.GetSettingFromDBById (Int32 SettingID)

CODICE:

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 

Ho aggiornato il codice di cui sopra con un po 'di registrazione al posto dopo ogni riga.

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 

Ricorda: DB ha tutte le righe per tutti i settingIDs citati nei messaggi di seguito.

Risultati:

Scenario 1:

insolito oggetto - Non sono dati recuperati per SettingID = 142176 ENTER - All'interno del contesto - Interrogazione Con SettingID = 142176 - Prima SingleOrDefault - - Dopo SingleOrDefault - - DBSetting Is Nothing

Oggetto insolito - Soluzioni MRDD - Nessun dato recuperato per SettingID = 142176 INVIO - Contesto interno - Interrogazione con SettingID = 142176 - Prima di SingleOrD EFAULT - - Dopo SingleOrDefault - - DBSetting è niente

Scenario 2

Eccezione insolito per SettingID = 138145-- ENTER - All'interno del contesto - Interrogazione Con SettingID = 138.145 - Prima SingleOrDefault - - - Dopo SingleOrDefault - - Il cast specificato non è valido.

insoliti Object - MRDD Solutions - Nessun dati recuperati per SettingID = 138.145 ENTER - Contesto All'interno - Interrogazione Con SettingID = 138.145 - Prima SingleOrDefault - - Dopo SingleOrDefault -

Scenario 3

Eccezione insolita per SettingID = 164638-- INVIO - Contesto interno - Interrogazione con SettingID = 164638 - Prima di SingleOrDefault - --Index era fuori dai limiti dell'array.

insoliti Object - MRDD Solutions - Nessun dati recuperati per SettingID = 164.638 ENTER - Contesto All'interno - Interrogazione Con SettingID = 164.638 - Prima SingleOrDefault -

+0

Che tipo è la colonna SettingID nel database? –

+1

C'è una discrepanza tra i tipi tra le proprietà della tua classe 'CPT_Setting' e le colonne della tabella db? Come: una colonna è testo e la proprietà corrispondente è int. –

+0

No. Non c'è corrispondenza tra le colonne DB e le proprietà DBML/Classe. Mi sono assicurato che fosse corretto con il secondo set di occhi. – ravi

risposta

0

Si dovrebbe controllare che

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

non lo fa restituire più di un oggetto. Forse è mai dovrebbe, ma questo potrebbe essere il problema.

+0

SettingID è la chiave primaria in modo che restituisca solo un valore. Ho anche provato con .SingleOrDefault. L'errore sembra ripetersi. – ravi

1

Invece di utilizzare ToString() è necessario utilizzare Convert.ToString()

auguriamo che possa risolvere il problema.

+0

Provato ma non ha aiutato. – ravi

0

Utilizzare single invece di singleordefault?

Ecco come abbiamo risolto una situazione simile nel lavoro di recente.

+0

L'ho provato anche io ma non serve a niente – ravi

3

Ho seguito il supporto Micorsoft e abbiamo abilitato la traccia di debugdiag e analizziamo i file di dump ma non siamo riusciti ad arrivare da nessuna parte.

Dopo aver analizzato un sacco ho scoperto che 3/4 server non ha ultimi aggiornamenti quadro in modo che i server amministratori hanno aggiornato le macchine con affidabilità aggiornamento 1 per .Net Framework 4 e sembra aver risolto il problema. Non sono state apportate modifiche al codice. Sono trascorse due settimane dall'aggiornamento e non è stata visualizzata una sola eccezione in questo blocco di codice.

Ho sprecato un mese solo per questo. Dannazione A volte non è solo il codice.

Problemi correlati