2013-05-28 9 views
16

मुझे त्रुटि मिल रही है "अंतर्निहित रूप से प्रकार 'int' को परिवर्तित नहीं कर सकता? ' 'int' के लिए। एक स्पष्ट रूपांतरण मौजूद है (क्या आप एक कास्ट गायब हैं?) "रिटर्न लाइन पर मेरे ऑर्डर पेपर पर। मुझे यकीन नहीं है कि क्यों मेरे सी # कौशल उन्नत नहीं हैं। किसी भी सहायता की सराहना की जाएगी।अंतर्निहित रूप से प्रकार 'int?' को परिवर्तित नहीं कर सकता 'int' करने के लिए।

static int OrdersPerHour(string User) 
{ 
    int? OrdersPerHour; 
    OleDbConnection conn = new OleDbConnection(strAccessConn); 
    DateTime curTime = DateTime.Now;   

    try 
    { 
     string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > #" + curTime.AddHours(-1) + "# AND User = '" + User + "' AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');"; 
     OleDbCommand dbcommand = new OleDbCommand(query, conn); 
     dbcommand.Connection.Open(); 
     dbcommand.CommandType = CommandType.Text; 
     OrdersPerHour = (int?)dbcommand.ExecuteScalar(); 

     Console.WriteLine("Orders per hour for " + User + " is " + OrdersPerHour);    
    } 
    catch (OleDbException ex) 
    { 

    } 
    finally 
    { 
     conn.Close(); 
    } 
    return OrdersPerHour; 
} 

उत्तर

11

वैसे आप एक int?

OrdersPerHour = (int?)dbcommand.ExecuteScalar(); 

करने के लिए OrdersPerHour कास्टिंग कर रहे हैं फिर भी अपने विधि हस्ताक्षर int है:

static int OrdersPerHour(string User) 

इसके अलावा एक त्वरित सुझाव - में>उपयोग मानकों आपकी क्वेरी, somethi एनजी की तरह:

string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > ? AND User = ? AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered')"; 
OleDbCommand dbcommand = new OleDbCommand(query, conn); 
dbcommand.Parameters.Add(curTime.AddHours(-1)); 
dbcommand.Parameters.Add(User); 
+0

अब मैं इस हिस्से पर अपनी गलती को समझता हूं। लेकिन उन परिवर्तनों के बाद, मुझे वापसी लाइन पर "असाइन किए गए स्थानीय चर 'ऑर्डर पेपरहोर' का उपयोगकर्ता मिल रहा है। – MaylorTaylor

+1

@ मैयलर टेलर बदलें 'int? OrdersPerHour;' int' OrdersPerHour = 0; ', इसका ख्याल रखना चाहिए। –

+0

ठीक है जिसने मुझे सही तय किया; हालांकि, अब मुझे एक और समस्या मिल रही है। http://stackoverflow.com/questions/16744510/executescalar-always-returns-0 – MaylorTaylor

0

आपका विधि की वापसी प्रकार int है और आप एक int? वापस जाने के लिए कोशिश कर रहे हैं।

1

आप निम्न करने के लिए अंतिम पंक्ति को बदल सकते हैं (यह मानते हुए आप 0 वापस जाने के लिए जब DB में कुछ भी नहीं है वहाँ चाहते हैं):

return OrdersPerHour == null ? 0 : OrdersPerHour.Value; 
0

पहली समस्या अपने कोड के साथ सामना करना पड़ा संदेश

है स्थानीय परिवर्तनीय OrdersPerHour को एक्सेस करने से पहले प्रारंभ नहीं किया जा सकता है।

ऐसा इसलिए होता है क्योंकि उस स्थिति में जहां आपकी डेटाबेस क्वेरी अपवाद फेंक देगी, तो मूल्य कुछ पर सेट नहीं किया जा सकता है (आपके पास खाली पकड़ क्लॉज है)।

इसे ठीक करने के लिए, आपके पास करने के लिए करता है, तो क्वेरी विफल रहता है, जो शायद 0 है चाहते हैं क्या करने के लिए मान सेट:

int? OrdersPerHour = 0;

एक बार यह तय हो गई है, अब वहाँ त्रुटि आप हो के बारे में पोस्टिंग ऐसा इसलिए होता है क्योंकि आपकी विधि हस्ताक्षर घोषित करता है कि आप int लौट रहे हैं, लेकिन आप वास्तव में एक शून्य शून्य, int?, चर लौट रहे हैं।

तो अपने int? की int हिस्सा पाने के लिए, आप .Value संपत्ति का उपयोग कर सकते हैं: अगर आप अपने OrdersPerHour घोषित 0 के बजाय शुरू में null होने के लिए,

return OrdersPerHour.Value; 

हालांकि, मूल्य इतना अशक्त हो सकता है लौटने से पहले उचित सत्यापन की आवश्यकता है (उदाहरण के लिए, एक और विशिष्ट अपवाद फेंको)।

ऐसा करने के लिए, आप HasValue संपत्ति यह लौटने से पहले सुनिश्चित करें कि आप एक मूल्य में समस्या आ रही हो करने के लिए उपयोग कर सकते हैं: एक पक्ष नोट के रूप में, जब से तुम सी # में कोडिंग कर रहे हैं

if (OrdersPerHour.HasValue){ 
    return OrdersPerHour.Value; 
} 
else{ 
    // Handle the case here 
} 

यह यदि आप सी # के सम्मेलनों का पालन करते हैं तो बेहतर होगा।आपका पैरामीटर और चर camelCase में होना चाहिए, पास्कलकेस नहीं। तो User और OrdersPerHouruser और ordersPerHour होगा।

11

ऐसा इसलिए है क्योंकि आपकी विधि का रिटर्न प्रकार int है और OrdersPerHour int है? (नल), तो आप नीचे की तरह अपने मूल्य वापस लौट कर इस का समाधान कर सकते हैं:

return OrdersPerHour.Value 

भी जाँच लें कि इसके नीचे के रूप में की तरह अपवाद से बचने के लिए नहीं अशक्त:

if(OrdersPerHour != null) 
{ 

    return OrdersPerHour.Value; 

} 
else 
{ 

    return 0; // depends on your choice 

} 

लेकिन इस मामले में आप करना होगा किसी अन्य भाग में कुछ अन्य मूल्य लौटाएं या यदि भाग के बाद अन्यथा संकलक एक त्रुटि को ध्वजांकित करेगा जो कोड वापसी मूल्य के सभी पथ नहीं है।

1

OrdersPerHour = (int?)dbcommand.ExecuteScalar();

यह कथन बार-लिखे जाने चाहिए, OrdersPerHour = (int)dbcommand.ExecuteScalar();

5
Int32 OrdersPerHour = 0; 
OrdersPerHour = Convert.ToInt32(dbcommand.ExecuteScalar()); 
0

सरल

(i == null) ? i.Value : 0; 
+1

हालांकि यह सैद्धांतिक रूप से काम कर सकता है, यह यह नहीं बताता कि यह कैसे काम करता है किसी के लिए। "सरल" कहना वास्तव में पर्याप्त नहीं है। –

+2

.. यह ** निश्चित रूप से ** काम नहीं करेगा। आपके पास 'i == null' है और' 0' वापस आता है जब यह 'NullReferenceException' है । –

0

आप संभव null वापसी मान को लेकर चिंतित हैं, तो आप भी कुछ चला सकते हैं इस तरह:

इस तरह आप संभावित अप्रत्याशित परिणामों से निपटेंगे और अभिव्यक्ति के लिए डिफ़ॉल्ट मान भी प्रदान कर सकते हैं, .GetValueOrDefault(-1) या कुछ और अर्थपूर्ण में प्रवेश करके।

संबंधित मुद्दे