2012-07-03 9 views
27

मैं बैच किए गए INSERT क्वेरीज़ की श्रृंखला बनाने के लिए जावा तैयार किए गए स्टेटमेंट ऑब्जेक्ट का उपयोग कर रहा हूं। क्वेरी बयानजावा तैयार कथन सम्मिलित करने के लिए tablename चर का उपयोग कैसे करें

String strQuery = "INSERT INTO ? (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);"; 

प्रारूप की है ... ... इसलिए दोनों फ़ील्ड मान और tablename चर (हैं अर्थात्। मैं उसी स्तंभ प्रारूप जिनमें से प्रत्येक डालने एक करने के लिए निर्देशित किया जाएगा के साथ कई तालिकाओं है दूसरा वाला)। अगर मैं "?" को हटा देता हूं तो मैं निष्पादन निष्पादित कर सकता हूं tablename चर और हार्ड कोड लेकिन प्रत्येक तैयार बयान एक अलग तालिका में सम्मिलित किया जाएगा, ताकि एक चर मैं तुरंत का उपयोग कर बैच क्वेरी को क्रियान्वित करने से पहले पॉप्युलेट रहने के लिए की जरूरत है ...

stmt.setString(1, "tableName1"); 

मैं यह कैसे एक गतिशील हो सकते हैं कृपया परिवर्तनीय?

उत्तर

37

आप नहीं कर सकते। आपको स्ट्रिंग कॉन्सटेनेशन/प्लेसहोल्डर के साथ स्ट्रिंग.फॉर्मैट के साथ एसक्यूएल का निर्माण करने की आवश्यकता है। तैयार कथन कॉलम मानों के लिए तालिका नाम के लिए नहीं है।

+2

धन्यवाद दोस्तों ... ऐसा लगता है क्योंकि मुझे पता नहीं है कि मैं प्रत्येक पंक्ति के लिए चर में स्वैपिंग के बिंदु तक उस टैबलेटनाम को क्यों सम्मिलित करना चाहता हूं, सबसे अच्छी बात यह है कि डीबी संग्रहीत प्रक्रिया के भीतर डालने का सबसे अच्छा काम है। फिर प्रत्येक पंक्ति के लिए सभी पैरामीटर को संग्रहित प्रो में पास करें, फिर डीबी को टैबलेटनाम मैनिपुलेशन को संभालने दें। वैसे भी प्रतिक्रियाओं के लिए लोगों को धन्यवाद। :-) – ForestSDMC

+13

क्या इसका मतलब है कि गतिशील तालिका नामों के साथ एसक्यूएल इंजेक्शन सुरक्षा असंभव है? –

+0

@ रिचर्ड मैं एक ही निष्कर्ष पर आया और यह मूर्खतापूर्ण लगता है, लेकिन कम से कम डेटाबेस में उपलब्ध तालिकाओं की सूची के खिलाफ तालिका नाम की जांच करना आसान है। – JulienD

-3

आप मूल स्ट्रिंग में जोड़ने के लिए की आवश्यकता होगी:

String tableName = "some_table_name"; 
// some other code 
String strQuery = "INSERT INTO " + tableName + " (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);"; 

आप strQuery में सेमी-कोलन की ज़रूरत है? (आप कर सकते हैं, यह मेरे लिए थोड़ा अजीब लग रहा है :-))

+6

एसक्यूएल इंजेक्शन के लिए असुरक्षित पता करने के लिए आते हैं। इस जवाब का उपयोग न करें, बच्चे! – SigmaX

+6

... अच्छी तरह से यह निर्भर करता है कि आपकी तालिका नाम कहां से आ रहा है। यदि यह किसी उपयोगकर्ता से या अविश्वसनीय क्लाइंट से आ रहा है, तो मैं आपके साथ सहमत हूं। लेकिन अगर यह आपकी विधि के भीतर निहित है, तो स्ट्रिंग की अपरिवर्तनीयता का मतलब है कि यह निश्चित रूप से सुरक्षित है। –

+0

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

-2

तालिका का नाम पैरामीटर के रूप में उपयोग नहीं किया जा सकता है। यह कठिन कोडित होना चाहिए। कुछ ऐसा प्रयास करें:

String tableName = "tableName1"; 
String strQuery = "INSERT INTO " + tableName + " (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);"; 
+7

एसक्यूएल इंजेक्शन के लिए कमजोर। इस जवाब का उपयोग न करें, बच्चे! – SigmaX

-1

एक वैकल्पिक String.format हो सकता है:

उदा

String sql = String.format("INSERT INTO $1%s (col1, col2, col3, (etc)", myTablename); 
+15

SQL इंजेक्शन के लिए कमजोर।इस जवाब का उपयोग न करें, बच्चे! – SigmaX

+12

यह सामान्य है "ओह मुझे पता है कि एसक्यूएल इंजेक्शन क्या है" परावर्तक - यह पूरी तरह से निर्भर करता है कि मेरा टैबलेटनाम कहां से आता है। – davidfrancis

+3

सहमत हुए। लेकिन, अधिकांश सुरक्षा मुद्दों की तरह, क्यू एंड ए साइटों के आगंतुकों का एक बड़ा हिस्सा यह नहीं समझ पाएगा कि उन्हें मेरा टैबलेटनाम कहां से आश्वस्त होना चाहिए। तो जवाब योग्य होने की जरूरत है। – SigmaX

11

आप तालिका नाम के स्थान पर प्लेसहोल्डर का उपयोग कर सकते हैं और फिर इसे अपने टैबलेटनाम से बदल सकते हैं।

String strQuery = "INSERT INTO $tableName (col1, col2, col3, col4, col5) 
        VALUES (?,?,?,?,?,?);"; 

और की जगह जब यू tablename

String query =strQuery.replace("$tableName",tableName); 
stmt =conn.prepareStatement(query); 
+27

एसक्यूएल इंजेक्शन के लिए कमजोर। इस जवाब का उपयोग न करें, बच्चे! – SigmaX

+7

केवल तभी जब उपयोगकर्ता इनपुट से $ tablename लिया जाता है, है ना? लेकिन यह ठीक होगा अगर रेडियो बटन चयन की तरह कुछ गणनाकर्ता मूल्य को वापस कर रहा था, या किसी अन्य विधि जो $ tablename के संभावित मान को परिभाषित सेट पर प्रतिबंधित करता है? – Toadfish

+9

@ सिग्माएक्स तो आपका समाधान क्या है जो एसक्यूएल इंजेक्शन के लिए कमजोर नहीं है? – Mahdi

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