2008-12-17 15 views
7

में स्ट्रिंग या NULL डालने में समस्या मुझे स्ट्रिंग या NULL को डेटाबेस में पास करने की इजाजत देने के लिए उचित वाक्यविन्यास के साथ आने में परेशानी हो रही है।SQL सर्वर डेटाबेस

string insertString = String.Format(
    @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES ('{0}', '{1}', '{2}')", 
    varField1, varField2, varField3); 

मैं चर प्लेसहोल्डर के आसपास एकल उद्धरण का इस्तेमाल किया ताकि डेटाबेस ठीक से एक स्ट्रिंग मान स्वीकार करेंगे: यहाँ मेरी कोड है। हालांकि, अगर एनयूएलएल पास हो जाता है, तो यह स्ट्रिंग "न्यूल" के रूप में डेटाबेस में जा रहा है।

क्या कोई तरीका है कि मैं InsertCommand स्ट्रिंग से एकल उद्धरण छोड़ सकता हूं और सशर्त रूप से मेरे चरों में सिंगल कोट्स जोड़ सकता हूं?

उत्तर

22

स्ट्रिंग (string.Format) श्रेणीबद्ध नहीं - उपयोग मानकों (@p1 आदि) - तो आप DBNull.Value पारित कर सकते हैं एसक्यूएल सर्वर के लिए अशक्त मतलब

SqlCommand cmd = new SqlCommand(); 
cmd.CommandText = @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES (@p1, @p2, @p3)"; 
cmd.Parameters.AddWithValue("@p1", (object)someVar ?? DBNull.Value); 
//... 

यह भी एसक्यूएल इंजेक्शन से बचाता है

+0

मैं ऊपर की तरह है जब "someVar ?? DBNull.Value" का उपयोग निम्न त्रुटि मिलती है: "ऑपरेटर ' ?? ' टाइप स्ट्रिंग और सिस्टम के लिए ऑपरेटरों पर लागू नहीं किया जा सकता है। डीबीएनयूएल "यह कोई विचार है कि यह स्ट्रिंग के साथ कैसे काम करेगा? – buzzzzjay

+2

@buzzzzjay उनमें से किसी के सामने '(ऑब्जेक्ट)' जोड़ें। –

+0

मीठा! वह वास्तव में मदद करता है! धन्यवाद! – buzzzzjay

5

String.Format के साथ स्ट्रिंग को ध्यान में रखना एक बड़ा सुरक्षा जोखिम (SQL इंजेक्शन) हो सकता है, और यदि आप 'अक्षर' डालना चाहते हैं तो समस्याग्रस्त भी हो सकता है।

समाधान:

cmd.CommandText = "INSERT INTO upload_history (field1, field2, field3) " + 
    "VALUES (@p1, @p2, @p3)"; 
cmd.Parameters.AddWithValue("@p1", varField1); 
cmd.Parameters.AddWithValue("@p2", varField2); 
cmd.Parameters.AddWithValue("@p3", varField3); 
cmd.ExecuteNonQuery(); 
+0

इसके अलावा एक अच्छा जवाब है लेकिन मार्क ने आपको हरा दिया। सलाह के लिये धन्यवाद। – beardog

2

सवाल का जवाब देने के रूप में यह कहा गया था, और पूरी तरह से पता है कि प्रश्नों paramaterizing करने के लिए कोड पुनर्रचना सही समाधान है किया जा रहा है की भावना में, आप एक समारोह है कि या तो रिटर्न लिख सकता है एक एकल उद्धृत स्ट्रिंग या एक गैर-उद्धृत नल स्ट्रिंग मान, फिर क्वेरी स्ट्रिंग से सिंगल-कोट्स को हटा दें।

string insertString = String.Format( @"INSERT INTO upload_history (field1, field2, field3)  VALUES ({0}, {1}, {2})", ToStringorNull(varField1), ToStringorNull(varField2), ToStringorNull(varField3)); 

यदि आप वीएस 2008 का उपयोग कर रहे हैं तो आप इसे एक विस्तार विधि के रूप में भी कार्यान्वित कर सकते हैं।

string insertString = String.Format( @"INSERT INTO upload_history (field1, field2, field3)  VALUES ({0}, {1}, {2})", varField1.ToStringorNull, varField2.ToStringorNull, varField3.ToStringorNull); 

मैं तुम्हारे पास ToStringorNull समारोह बनाने छोड़ देंगे - यह कठिन नहीं है :-)

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