2009-07-14 7 views
8

मैं डेटाबेस में कुछ फ़ील्ड संग्रहीत और संपादित कर रहा हूं जिसमें एक या अधिक वाक्यों की लंबी स्ट्रिंग शामिल है। जब भी मैं पाठ बॉक्स में एक भी बोली दर्ज करें और यह सहेजना चाहते यह की तरह एक अपवाद फेंकता है " 'l' के पास गलत वाक्य रचना। चरित्र स्ट्रिंग '' के बाद बंद न किया गया उद्धरण चिह्न।" क्या इससे बचने के लिए कोई विचार है?एक गतिशील एसक्यूएल कमांड में उद्धरण कैसे जोड़ें?

संपादित करें: क्वेरी है:

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + 
    tbQuestion.Text + "]', Answer = '[" + 
    tbAnswer.Text + "]', LastEdit = '" + 
    CurrentUser.Login + 
    "'WHERE ID = '" + CurrentQuestion.ID + "'"); 
+0

कृपया जो SQL कथन आप उपयोग कर रहे हैं उसे दिखाएं। –

+0

बस 'किसी अन्य के साथ' से बचें * हेल एंजल्स * से ** नरक एंजल्स ** – TheVillageIdiot

+0

एसक्यूएल कॉमांड कॉम = नया एसक्यूएल कॉमांड ("अद्यतन प्रश्न सेट प्रश्न = '[" + tbQuestion.Text + "]', उत्तर = ' ["+ tbAnswer.Text +"] ', LastEdit =' "+ CurrentUser.Login +" 'WHERE ID =' "+ CurrentQuestion.ID +" '"); –

उत्तर

11

केएम ने कहा, ऐसा मत करो!

Do बजाय इस:

private static void UpdateQuestionByID(
    int questionID, string question, string answer, string lastEdited) 
{ 
    using (var conn = new SqlConnection(connectionString)) 
    { 
     conn.Open(); 
     const string QUERY = 
      @"UPDATE Questions " + 
      @"SET Question = @Question, Answer = @Answer, LastEdit = @LastEdited " + 
      @"WHERE ID = @QuestionID"; 
     using (var cmd = new SqlCommand(QUERY, conn)) 
     { 
      cmd.Parameters.AddWithValue("@Question", question); 
      cmd.Parameters.AddWithValue("@Answer", answer); 
      cmd.Parameters.AddWithValue("@LastEdited", lastEdited); 
      cmd.Parameters.AddWithValue("@QuestionID", questionID); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
} 
+0

thx बहुत आदमी, आपने इसे भी लागू किया। यू रॉक;) –

+1

+1 पैरामीटरिंग – booyaa

3

अपने क्षेत्र संपादन करते हैं और मूल्य को बचाने के लिए एसक्यूएल पैरामीटर का उपयोग करने के लिए एक संग्रहीत produre लिखें। उद्धरण कोई फर्क नहीं पड़ता। यदि आप संग्रहित प्रो को कम से कम अपने SQL टेक्स्ट को पैरामीटर मार्कर के साथ नहीं बनाना चाहते हैं और इसके साथ SQL पैरामीटर का उपयोग करें।

6

आप एक एसक्यूएल क्षेत्र में एक भी बोली में शामिल एकल उद्धरण

'''Test''' = 'Text' 

यह एसक्यूएल सर्वर के लिए है का उपयोग करके उसे चाहते हैं। ,

my dodg'y test   -> 'my dodg''y test' 
my 'quoted' string  -> 'my ''quoted string''' 
'first and last quotes' -> '''first and last quotes''' 
+3

इसके बजाय पैरामीटरयुक्त एसक्यूएल का उपयोग करना अधिक सुरक्षित होगा। – LukeH

+0

ल्यूक: निश्चित रूप से यह होगा, लेकिन मैं यहां बैठने और अनुमान लगाने का प्रयास नहीं कर रहा हूं कि वह वर्तमान में अपना एसक्यूएल कैसे कर रहा है, इसलिए मैं सबसे सरल जवाब देने जा रहा हूं। – TheTXI

+0

@TheTXI: पर्याप्त मेला, लेकिन हालांकि वह अपना एसक्यूएल कर रहा है, एक बात यह निश्चित है कि वह पैरामीटर का उपयोग नहीं कर रहा है। पैरामीटर का उपयोग इस समस्या से पूरी तरह से बच जाएगा। – LukeH

1

MSSQL में आप अपने उद्धरण अप दोगुना कर सकते हैं।

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

आप आवेदन है कि आप से डेटाबेस बुला रहे हैं उल्लेख नहीं है, लेकिन जब आप निर्माण आप आदेश आप एक FIX_QUOTES() आदेश है कि आप लिख सकते हैं या अगर अपनी भाषा द्वारा प्रदान की उपयोग करने की आवश्यकता:

SqlCommand com = new SqlCommand("UPDATE Questions SET Question = '[" + FIX_QUOTES(tbQuestion.Text) + "]', Answer = '[" + FIX_QUOTES(tbAnswer.Text) + "]', LastEdit = '" + FIX_QUOTES(CurrentUser.Login) + "'WHERE ID = '" + FIX_QUOTES(CurrentQuestion.ID) + "'"); – A 

इस प्रकार की गतिशील क्वेरी sql injection attack के लिए बहुत आसान है। मैं डेटाबेस को संग्रहीत प्रक्रिया या पैरामीटर सूची के साथ कॉल करने की अनुशंसा करता हूं।

+0

लेकिन समस्या यह है कि मुझे उपयोगकर्ता से इनपुट मिलता है, इसलिए उपयोगकर्ता को एक और उद्धरण जोड़ने के लिए अच्छा नहीं होगा –

1

यह आप एक विशिष्ट जवाब देने के लिए मुश्किल है क्योंकि आप डेटाबेस या अनुप्रयोग भाषा का प्रयोग कर रहे सूचीबद्ध न करें:

0

कुछ जैसा कि पहले ही कहा है, एक अतिरिक्त बोली चाल करना पड़ेगा। मैं पुष्टि कर सकता हूं कि ओरेकल के लिए यह भी मामला है (अन्य ने यह जवाब एमएसएसक्यूएल और एसक्यूएल सर्वर के लिए मान्य होने दिया है)। मुझे लगता है कि संग्रहीत प्रक्रियाओं का उपयोग इस के लिए अधिक है।

+0

पैरामीटरयुक्त क्वेरी का उपयोग करने के बारे में कैसे? –

+0

हां, आप यह कर सकते हैं। यदि आप सीधे एसक्यूएल चलाते हैं, तो .NET API के माध्यम से नहीं, डबल कोट समाधान का उपयोग करना होगा। – awe

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