2012-06-21 40 views
6

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

dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP") 
    dbConn.Open() 

    MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = '" & TicBoxText.Text & _ 
              "'WHERE Number = 1", dbConn) 

    MyDataReader = MyCommand.ExecuteReader() 
    MyDataReader.Close() 
    dbConn.Close() 

और ये मेरे लंगड़ा से एक पैरामीटर सेट करने के लिए प्रयास है कि मैं क्या वेब, जो मैं यह सब अच्छी तरह से समझ में नहीं आता पर देखा है।

dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP") 
    dbConn.Open() 

    MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @'" & TicBoxText.Text & _ 
              "'WHERE Number = 1", dbConn) 

    MyDataReader = MyCommand.ExecuteReader() 
    MyDataReader.Close() 
    dbConn.Close() 

कैसे कर आप इस? अगर वहाँ पाठ बॉक्स में एक 'चिह्न है जब मैं कोड चलाने के लिए, यह दुर्घटनाओं का कारण।

करना
+0

संभव डुप्लिकेट (http://stackoverflow.com/questions/664314/c-sharp-constructing -परमीटर-क्वेरी-एसक्यूएल-जैसे) – Ben

+0

[यह भी देखें] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx#Y300) –

उत्तर

17

आप Bobby Tables से परहेज करने के लिए सही रास्ते पर हैं, लेकिन @ की अपनी समझ paramet ers अधूरा है।

नाम मापदंडों चर एक प्रोग्रामिंग भाषा में की तरह व्यवहार करते हैं: पहला, आप उन्हें अपने एसक्यूएल आदेश में उपयोग करते हैं, और फिर आप अपने VB.NET या सी # कार्यक्रम में उनके मूल्य की आपूर्ति, इस तरह:

MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @TicBoxText WHERE Number = 1", dbConn) 
MyCommand.Parameters.AddWithValue("@TicBoxText", TicBoxText.Text) 

ध्यान दें कि आपके आदेश का पाठ स्वयं निहित कैसे हुआ: यह टेक्स्ट बॉक्स से टेक्स्ट के मान पर निर्भर नहीं करता है, इसलिए उपयोगकर्ता अपना स्वयं का आदेश डालने से अपना एसक्यूएल नहीं तोड़ सकते हैं। @TicBoxText वेरिएबल का नाम बन गया जो कमांड के पाठ में मान के लिए खड़ा है; AddWithValue पर कॉल मूल्य प्रदान करता है। उसके बाद, आपके ExecuteReader जाने के लिए तैयार है।

+1

कोई प्रशंसक नहीं AddWithValue() विधि। कभी-कभी यह पैरामीटर प्रकार गलत (यानी: तिथियां, वर्चर बनाम nvarchar) का अनुमान लगाता है, और कभी-कभी जब ऐसा होता है तो क्वेरी अब किसी इंडेक्स के साथ लाइन नहीं होती है, जिसके परिणामस्वरूप कभी-कभी कठोर प्रदर्शन समस्याएं होती हैं। –

+0

@ जोएल कोहोर्न मुझे न तो, लेकिन यह चीजों को पाने का सबसे तेज़ तरीका है। – dasblinkenlight

+0

+1 अच्छा स्पष्टीकरण। – CaRDiaK

8

यहाँ में सुधार की एक संख्या हैं:

Using dbConn As New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP"), _ 
     MyCommand As SqlCommand("UPDATE SeansMessage SET Message = @Message WHERE Number = 1", dbConn) 

    'Make sure to use your exact DbType (ie: VarChar vs NVarChar) and size 
    MyCommand.Parameters.Add("@Message", SqlDbType.VarChar).Value = TicBoxText.Text 

    dbConn.Open() 
    MyCommand.ExecuteNonQuery() ' don't open a data reader: just use ExecuteNonQuery 
End Using 'Using block will close the connection for you 
[सी # के निर्माण पैरामीटर क्वेरी एसक्यूएल -% की तरह] की
+0

इनमें से कौन से सुधार हैं जिनमें से एक संख्या है? – PsychoData

+1

@PsychoData किसी अपवाद को फेंकने के मामले में कनेक्शन को सही ढंग से बंद करें, निष्पादित करने के बजाय क्वेरी पैरामीटर, execenonquery() का उपयोग करें, अनुमानित के बजाय स्पष्ट पैरामीटर प्रकार –