2009-01-05 6 views
6

गतिशील एसक्यूएल प्रश्न बनाने के लिए आप कौन सी विधि पसंद करते हैं? गठन या स्ट्रीमिंग? क्या यह सिर्फ वरीयता है या कोई कारण किसी अन्य से बेहतर है? या किसी विशेष पुस्तकालय का उपयोग आप करते हैं।सी ++/जावा में एसक्यूएल क्वेरी बनाएँ?

संपादित करें: कृपया C++ के मामले में उत्तर दें।

उत्तर

4

जावा में आपको PreparedStatement का उपयोग करना चाहिए।

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?"); 
statement.setInt(1, 17); 
ResultSet resultSet = statement.executeQuery(); 
+0

धन्यवाद के लिए SOCI - The C++ Database Access Library कहा जाता है, कैसे ग में रोकने के लिए ++? – yesraaj

+0

कोई विचार नहीं, सी ++ चाय का मेरा प्याला नहीं है। :) – Bombe

6

हमेशा का उपयोग करें "तैयार" वहाँ prepareStatement लेकिन सटीक समारोह नाम के एक बराबर अपने डेटाबेस और ड्राइवर संयोजन पर निर्भर करेगा हो जाएगा।

एक निष्पादित (स्ट्रिंग) पर एक तैयार बयान के कई फायदे हैं: -

बयान पार्स किया गया है और एक पहुँच योजना determind केवल एक बार जब "तैयार" बयान निष्पादित किया जाता है। इस पर निर्भर करते हुए कि आप कितनी बार कथन चलाते हैं, यह परिणामस्वरूप बेहतर प्रदर्शन कर सकता है।

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

इससे भी बदतर यह है कि "एसक्यूएल इंजेक्शन" हमले कैसे काम करते हैं। यदि cust_table ; से "x" जैसे स्ट्रिंग को _ तालिका ; से हटाएं "डेटा के रूप में दर्ज किया गया है, तो इसके परिणामस्वरूप हटाए गए कथन को पार्स और निष्पादित किया जा सकता है।

संख्याओं का संचालन करना अधिक कुशल है। एक setInt कॉल एक पूर्णांक मान लेता है जैसा कि समतुल्य SQL स्ट्रिंग के लिए आपको वर्णों में परिवर्तित करना होगा, फिर डीबीएमएस को इसे एक पूर्णांक में परिवर्तित करना होगा।

पठनीयता। आप कुछ प्रश्न चिह्नों के साथ एक एकल SQL कथन कोड करते हैं जहां वेरिएबल जाते हैं जो पढ़ने के लिए अपेक्षाकृत आसान होते हैं, क्योंकि स्ट्रिंग कॉन्सटेनेशन की श्रृंखला को मानसिक रूप से विश्लेषण और विश्लेषण करने के विपरीत, बच निकले उद्धरण आदि के लिए अतिरिक्त शोर होगा।

हालांकि कुछ मामलों जहां निष्पादन (स्ट्रिंग) वास्तव में बेहतर है।

जहां आपकी चाबियां बहुत असमान रूप से वितरित की जाती हैं। E.G. यदि आपके 95% ग्राहक संयुक्त राज्य अमेरिका में रहते हैं और आप कनाडा में रहने वाले 4% को सूचीबद्ध करना चाहते हैं तो "देश = =" आम तौर पर "जहां देश = 'सीए" के साथ एक टेबल स्पेस स्कैन होता है, तो आपके पास इंडेक्स का उपयोग करने का कुछ मौका होता है।

दूसरा मामला यह है कि उपयोगकर्ता कई खोज मानदंडों को दर्ज या छोड़ सकता है। इनपुट मानदंडों के सभी संभावित अनुमोदनों के साथ एक जटिल क्वेरी बनाने के मुकाबले दिए गए मानदंडों के लिए एक एसक्यूएल स्ट्रिंग बनाने के लिए यह बेहतर है।

1

तैयार बयान का उपयोग करते समय संभव नहीं हैं, मैं सी ++ धाराओं का सबसे अच्छा तरीका क्वेरी लिखने के लिए उपयोग कर रहा है लगता है:

std::ostringstream sql; 
sql << "exec loadStuff(" << param1 << ", " << param2 << ")"; 

मापदंडों के प्रकार और की लंबाई के बारे में चिंता करने के लिए नहीं स्ट्रिंग बहुत बढ़िया है!

+0

मैं डाउन-वोट करने में संकोच करता हूं, लेकिन मैं उस तकनीक में एसक्यूएल इंजेक्शन हमलों के खतरे के बारे में चिंतित हूं। :( –

+1

पर्याप्त मेला, लेकिन लाइब्रेरी का उपयोग करते समय जिसमें तैयार कथन नहीं होते हैं, आंतरिक अनुप्रयोग में अधिकतर संख्याओं के साथ काम करते हुए, मुझे इस पैटर्न को संग्रहित प्रक्रियाओं को कॉल करने के लिए उपयोगी और कुशल पाया गया है। एक विश्व-सामना वाला वेब-ऐप दूसरा होगा बात –

+0

क्षमा करें, small_duck। मैंने "तैयार वक्तव्यों का उपयोग करना संभव नहीं है" थोड़ा नहीं। मैं अपने डाउन-वोट को रद्द करने जा रहा था, लेकिन यह दावा करता है कि मेरा डाउन-वोट रिवर्स के लिए बहुत पुराना है। हालांकि, यदि आप अपना उत्तर संपादित करते हैं, तो मैं इसे रद्द कर सकता हूं। शायद आप उन लोगों की मदद करने के लिए "संभव नहीं हैं" बिट को बोल्ड कर सकते हैं, जो मेरे जैसा ही दोष था। :) –

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