2009-08-11 13 views
10

बहुत ही सरल सवाल (आश्चर्य की बात है कि मुझे कहीं भी एक समान प्रश्न नहीं मिल रहा है): मैं VB.net में फॉर्म डेटा से कैसे बचूं? अगर मैं तो निश्चित रूप से इस शिकंजा अप क्वेरी संदेश में एपोस्ट्रोफ़ी का उपयोगVB.net में एक स्ट्रिंग (स्लैश जोड़ें) से बचें?

Dim query As String = "exec sp_Message_insert @clientid='" + pClientId + "', @message='" + pMessage + "', @takenby='" + pUserId + "', @recipients='" + pRecipients + "'" 

: मैं इस तरह विभिन्न लाइनों की है। मैंने स्ट्रिंग पर इंटेलिजेंस फ़ंक्शंस को देखा है लेकिन कुछ भी उचित नहीं दिख रहा है ...

उत्तर

16

भागने से आपका क्या मतलब है? वीबी.नेट में सी-स्टाइल भाषाएं उसी तरह से 'भागने' नहीं होती हैं।

विकल्प 1 (इस स्थिति के लिए अनुशंसित नहीं): एक सरल की जगह कर

अब, अगर आप यह सुनिश्चित करने के pClientId चर में कोई एकल qoutes देखते हैं कि चाहते हैं, तो आपके पास दो विकल्प हैं। अर्थात।

pClientId = String.Replace(pClientId, "'","''") 

लेकिन, जैसा कि ध्यान दिया गया है, मैं एसक्यूएल कमांड के लिए ऐसा नहीं करता हूं। मुझे क्या होता विकल्प 2: का उपयोग डेटा मापदंडों एसक्यूएल के दौरान अपने डीबी के लिए मानकों को पारित करने के लिए आदेश

उदाहरण के लिए:

Dim cn As New SqlConnection(connectionString) 
Dim cmd As New SqlCommand 
cn.Open 
cmd.Connection=cn 
cmd.CommandType=CommandType.StoredProcedure 
cmd.CommandText= "sp_Message_insert" 
cmd.Parameters.add(New SqlParameter("@clientid", pClientId) 
cmd.Parameters.add(New SqlParameter("@message", pMessage) 
cmd.Parameters.add(New SqlParameter("@takenby", pUserId) 
cmd.Parameters.add(New SqlParameter("@recipients", pRecipients) 
cmd.ExecuteNonQuery 
+1

'cmd.Parameters.AddWithValue (" @ clientid ", clientid)' भी उपलब्ध है। –

+0

आपको वास्तव में 'एसक्यूएलकनेक्शन' और 'एसक्यूएल कॉमांड' को 'प्रयोग' ब्लॉक में लपेटना चाहिए: http://msdn.microsoft.com/en-us/library/htd05whh.aspx – LukeH

+0

हे, जैसे ही मैंने प्रश्न पोस्ट किया था I सोचा कि मुझे डेटा को एक स्ट्रिंग के बजाय पैरामीटर के रूप में पास करना चाहिए। मेरे पूर्व मालिक को दोष दें, वह वही है जिसने मुझे ऐसा करने के लिए सिखाया;) मैं अब पहली विधि * का उपयोग कर रहा हूं * क्योंकि क्लाइंट यह तय करना चाहता है, लेकिन सीधे रिफैक्टरिंग शुरू कर देगा। – DisgruntledGoat

2

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

2

इस तरह निष्पादित करने के लिए एक स्ट्रिंग का निर्माण न करें।
यही कारण है कि एसक्यूएल इंजेक्शन हमले संभव हैं।

इसके बजाय डेटा एक्सेस लेयर का उपयोग करें, जो आपको पैरामीटर ऑब्जेक्ट्स बनाने और संग्रहीत प्रक्रिया के साथ उन्हें निष्पादित करने के लिए संबद्ध करने देता है।

5

आप तो तार से बचने के लिए चाहते हैं, तो आपको सबसे पहले क्या डेटाबेस बताने के लिए है आप उपयोग कर रहे हैं। आपको विशिष्ट डेटाबेस के लिए सही भागने का उपयोग करना होगा ताकि आप उन सभी पात्रों से बच सकें जिन्हें आप चाहते हैं, लेकिन केवल वे ही।

मुझे किसी भी डेटाबेस के बारे में पता नहीं है जो बचने वाले चरित्र के रूप में स्लैश का उपयोग करता है। MySQL बैकस्लाश का उपयोग करता है, शायद यही तुम्हारा मतलब है?

सबसे अच्छा स्ट्रिंग से बचने के लिए नहीं है, लेकिन पैरामीटरयुक्त क्वेरी का उपयोग करने के लिए सबसे अच्छा है। उदाहरण:

Dim cmd As New SqlCommand("sp_Message_insert") 
cmd.Parameters.Add("@clientid").Value = pClientId 
cmd.Parameters.Add("@message").Value = pMessage 
cmd.Parameters.Add("@takenby").Value = pUserId 
cmd.Parameters.Add("@recipients").Value = pRecipients 
1

अगर आप एक प्रश्न आप निम्नलिखित कोड का उपयोग करना चाहिए के रूप में एक स्ट्रिंग पर अमल करना चाहते हैं:

Dim query as String 
query.Replace("/", "//") 
1

तो System.Data.Odbc.OdbcCommand के साथ एक साथ का उपयोग कर पैरामीटर नाम के बारे में एक छोटे से नोटिस जोड़ना चाहते हैं, http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.commandtype के अनुसार

ODBC के लिए .NET फ्रेमवर्क डेटा प्रदाता गुजर नामित paramet का समर्थन नहीं करता एक ओडीबीसी कॉमांड द्वारा एसक्यूएल कथन या नामक संग्रहित प्रक्रिया में ers। इनमें से किसी भी मामले में, प्रश्न चिह्न (?) प्लेसहोल्डर का उपयोग करें।

एक उदाहरण यहां http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcparametercollection(v=vs.80).aspx#Y800 से:

Dim command As OdbcCommand = connection.CreateCommand() 
command.CommandText = “{ call MoneyProcedure(?,?,?) ” 

command.Parameters.Add("", OdbcType.Int).Value = 1 
command.Parameters.Add("", OdbcType.Decimal).Value = 2 
command.Parameters.Add("", OdbcType.Decimal).Value = 3 
संबंधित मुद्दे