2013-03-22 7 views
5

मैं उत्पाद नाम का उपयोग कर उत्पाद मूल्य प्राप्त करने का प्रयास कर रहा हूं। नीचे वह फ़ंक्शन है जिसका मैं उपयोग कर रहा हूं।ExecuteScalar का उपयोग करने का प्रयास कर रहे हैं, और "निर्दिष्ट कास्ट मान्य नहीं है" त्रुटि

public int GetProductPrice(string ProductName) 
{ 
    cnn.Open(); 
    SqlCommand cmd = new SqlCommand("SELECT ProductPrice FROM Products WHERE ProductName ='" + ProductName + "'", cnn); 
    int price = (int)cmd.ExecuteScalar(); 
    return price; 
} 

अब मैं इस त्रुटि Specified cast is not valid मिलती रहती है, और मैं पता नहीं क्यों। क्या कोई मेरी मदत कर सकता है ?

+1

http://en.wikipedia.org/wiki/SQL_injection। पढ़ें। जानें। – SecurityMatt

+0

इस स्थिति में ExecuteScalar() का उपयोग न करें - क्या होता है यदि आपके पास एक ही नाम के साथ कई उत्पाद हैं ... – MUG4N

+0

हाँ मैं इसे जानता हूं लेकिन प्रत्येक उत्पाद का एक और नाम (अनुपालन रूप से भिन्न) – ShmuelCohen

उत्तर

10

सबसे पहले, आपको सीधे पैरामीटर को एसक्यूएल में डालने के बजाय पैरामीटरयुक्त एसक्यूएल का उपयोग करना चाहिए। इसके अलावा, आपको कमांड - और कनेक्शन को बंद करने के लिए using कथन का उपयोग करना चाहिए - जब आप पूरा कर लेंगे। ओह, और प्रत्येक ऑपरेशन के लिए एक नया SqlConnection बनाएं। तो कुछ की तरह:

public int GetProductPrice(string productName) 
{ 
    // Quite possibly extract the connection creation into a separate method 
    // to call here. 
    using (var conn = new SqlConnection(...)) 
    { 
     conn.Open(); 
     using (var command = new SqlCommand(
      "SELECT ProductPrice FROM Products WHERE ProductName = @ProductName", 
      conn)) 
     { 
      command.AddParameter("@ProductName", SqlDbType.VarChar) 
        .Value = productName; 
      object price = command.ExecuteScalar(); 
      // And you'd do the casting here 
     } 
    } 
} 

इसके बाद, हम ProductPrice क्षेत्र के प्रकार पता नहीं है। यह हो सकता है कि आप long लौट रहे हैं, या शायद यह decimal है। पता लगाने का सबसे आसान तरीका केवल उपयोग करने के लिए है:

object tmp = cmd.ExecuteScalar(); 

... और फिर डीबगर में देखें। डेटाबेस में फ़ील्ड के प्रकार को भी देखें - जो वास्तव में आपको बताएगा कि क्या उम्मीद करनी है। दोनों के बीच मैपिंग के लिए SqlDbType गणना पर एक नज़र डालें।

+0

अच्छी तरह से मैं इसे विश्वास नहीं कर सकता, फ़ील्ड प्रोडक्टप्रिस था Nvarchar, इसे int में बदलें और सबकुछ बढ़िया काम करता है, धन्यवाद – ShmuelCohen

+1

@ user2120874: लेकिन कृपया शेष उत्तर को भी ध्यान में रखें - अन्यथा आप एसक्यूएल इंजेक्शन हमलों और सभी प्रकार की समस्याओं के लिए खुले हैं। –

+0

अच्छी तरह से मैं इसे अपनी अन्य परियोजनाओं के लिए ले जाऊंगा, लेकिन यह एक स्कूल परियोजना है इसलिए वे मुझे एसक्यूएलआईआई की कोशिश नहीं करते हैं। मदद के लिए धन्यवाद – ShmuelCohen

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