2012-03-20 9 views
8

मैं हो रही है टाइप करने में असमर्थ एक छिटपुट System.Int32 .SingleorDefault पर System.String 'अपवाद' टाइप करने के लिए '' प्रकार की वस्तु कास्ट करने में असमर्थ '() नीचे दिए गए कोड में। यह 9/10 बार काम करता है लेकिन यादृच्छिक रूप से यह एक अपवाद फेंकता है। मैंने यह सुनिश्चित किया है कि सेटिंग आईडी जिसे मैं पास कर रहा हूं उसके पास कोई शून्य मान नहीं है और तालिका में डेटा हमेशा सेटिंग आईडी के लिए मौजूद है, और मैं हमेशा सेटिंगिंग को पूर्णांक के रूप में पास कर रहा हूं।प्रकार '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)

कोड:

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 

याद रखें: डीबी सभी settingIDs नीचे दिए गए संदेशों में उल्लेख किया है के लिए सभी पंक्तियों है।

परिणाम:

परिदृश्य 1:

असामान्य वस्तु - कोई डेटा के लिए SettingID = 142,176 ENTER को लिया गया - अंदर प्रसंग - SingleOrDefault से पहले - SettingID = 142,176 के द्वारा क्वेरी - - सिंगलऑर्डफॉल्ट के बाद - - डीबीएससेटिंग कुछ भी नहीं है

असामान्य ऑब्जेक्ट - एमआरडीडी समाधान - सेटिंग आईडी के लिए कोई डेटा पुनर्प्राप्त नहीं किया गया = 142176 एंटर - संदर्भ के अंदर - SettingID के साथ पूछताछ = 142176 - सिंगलऑर्ड से पहले efault - - SingleOrDefault के बाद - - DBSetting कुछ भी नहीं

है

परिदृश्य 2

के लिए SettingID = 138145-- ENTER असामान्य अपवाद - अंदर प्रसंग - SingleOrDefault से पहले - SettingID = 138,145 के द्वारा क्वेरी - - - सिंगलऑर्डफॉल्ट के बाद - - निर्दिष्ट कास्ट मान्य नहीं है।

असामान्य वस्तु - MRDD समाधान - कोई डेटा = 138,145 ENTER SettingID के लिए पुन: प्राप्त - अंदर प्रसंग - SingleOrDefault से पहले - - SettingID = 138,145 के द्वारा क्वेरी - SingleOrDefault के बाद -

परिदृश्य 3

SettingID के लिए असामान्य अपवाद = 164638-- ENTER - संदर्भ के अंदर - SettingID के साथ पूछताछ = 164638 - सिंगलऑर्डफॉल्ट से पहले - --इंडेक्स सरणी की सीमाओं के बाहर था।

असामान्य वस्तु - MRDD समाधान - कोई डेटा = 164,638 ENTER SettingID के लिए पुन: प्राप्त - अंदर प्रसंग - SettingID = 164,638 के द्वारा क्वेरी - SingleOrDefault से पहले -

+0

आपके डेटाबेस में SettingID कॉलम किस प्रकार का है? –

+1

क्या आपके किसी भी 'CPT_Setting' वर्ग की गुणों और डीबी तालिका के कॉलम के बीच प्रकारों में कोई मेल नहीं है? पसंद: एक कॉलम टेक्स्ट है और संबंधित संपत्ति int है। –

+0

नहीं। डीबी कॉलम और डीबीएमएल/कक्षा गुणों के बीच कोई मेल नहीं है। मैंने सुनिश्चित किया कि यह आंखों के दूसरे सेट के साथ सही है। – ravi

उत्तर

0

आपको जांचना चाहिए कि

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

नहीं है एक से अधिक वस्तु वापस करें। शायद यह कभी होना चाहिए, लेकिन यह समस्या हो सकती है।

+0

SettingID प्राथमिक कुंजी है इसलिए यह केवल एक मान लौटाएगा। मैंने भी साथ किया। .SingleOrDefault भी। त्रुटि आवर्ती प्रतीत होता है। – ravi

1
इसके बजाय ToString() का उपयोग करने का

आप उपयोग करना Convert.ToString()

आशा है कि यह आपकी समस्या का समाधान होगा।

+0

कोशिश की लेकिन मदद नहीं की। – ravi

0

सिंगलॉर्डफॉल्ट के बजाय एकल का उपयोग करें?

इसी तरह हमने हाल ही में काम में इसी तरह की स्थिति का समाधान किया।

+0

मैंने भी कोशिश की लेकिन इसका कोई उपयोग नहीं है – ravi

3

मैंने माइक्रोसॉफ़्ट समर्थन के साथ पालन किया है और हमने डीबगडीग ट्रेस सक्षम किया है और डंप फ़ाइलों का विश्लेषण किया है लेकिन कहीं भी नहीं जा सका।

एक बहुत मैं पता चला कि 3/4 सर्वर कोई नवीनतम ढांचे के अपडेट तो सर्वर व्यवस्थापक नेट फ्रेमवर्क 4 के लिए विश्वसनीयता अद्यतन 1 के साथ मशीनों को अद्यतन किया है और यह समस्या हल हो गई है लगता है विश्लेषण करने के बाद। कोई कोड परिवर्तन नहीं किया गया है। अपडेट के बाद से यह दो सप्ताह हो गया है और इस कोड ब्लॉक में एक अपवाद नहीं देखा गया है।

मैंने इसके लिए सिर्फ एक महीना बर्बाद कर दिया। इसे रफू करें। कभी-कभी यह कोड नहीं है।