2010-07-12 10 views
5

मैंने "myTable" नामक एक तालिका बनाई है जिसे CURRENT_DATE नामक कॉलम के साथ बनाया गया है और इसका डेटा प्रकार "DATE" है। जब मैं प्रोग्रामिंग रूप से अपनी तालिका अपडेट करता हूं, तो मैं CURRENT_DATE फ़ील्ड में टाइमस्टैम्प या सिस्टम दिनांक भी रखना चाहता हूं। मैं जो कर रहा हूं उसका एक हिस्सा नीचे दिखाया गया है, लेकिन यह काम नहीं कर रहा है। मुझे लगता है कि यह आसान होगा, लेकिन ... क्या आप मदद कर सकते हैं?तालिका में SQL INSERT सिस्टम दिनांक

//System date is captured for placement in the CURRENT_DATE field in myTable 
java.util.Date currentDate = new java.util.Date(); 
... 
stmt.executeQuery("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (' " + userName + " ', ' " + currentDate + " ') ");  

उत्तर

8

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

Connection con = ...; 
PreparedStatement statement = con.prepareStatement("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (?, ?)"); 
statement.setString(1, userName); 
statement.setDate(2, currentDate); 
statement.execute(); 

तैयार कथन का सही तरीके से उपयोग करने के तरीके के बारे में बहुत सारी जानकारी है। उदाहरण के लिए: http://www.jdbc-tutorial.com/jdbc-prepared-statements.htm

3

यदि आप अभी वर्तमान तारीख चाहते हैं, तो आप इसे SQL सर्वर से पुनर्प्राप्त कर सकते हैं, इसे एक चर के रूप में सबमिट किए बिना। यह आपके द्वारा उपयोग किए जा रहे सर्वर के आधार पर थोड़ा भिन्न होता है, लेकिन एमएस एसक्यूएल सर्वर में getdate() नामक एक फ़ंक्शन है।

stmt.executeQuery("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (' " + userName + " ', getdate()");  

तुम भी, उस क्षेत्र के लिए डिफ़ॉल्ट मान के रूप में getdate() सेट ताकि आप क्षेत्र पूरी तरह छोड़ सकते हैं कर सकते हैं:

stmt.executeQuery("INSERT INTO myTable (NAME) VALUES (' " + userName + " '" ') ");  
+0

मुझे मारो - अच्छा जवाब +1 –

0

इस प्रयास करें:

stmt.executeQuery("INSERT INTO myTable (NAME, CURRENT_DATE) VALUES (' " + userName + " ', GETDATE()) "); 
0

डेटा अखंडता के लिए, यह कुछ ऐसा है जो अद्यतन और डालने ट्रिगर के साथ डीबीएमएस अंत में किया जाना चाहिए।

किसी भी अन्य विधि को दुर्भावनापूर्ण (या छोटी गाड़ी) कोड से प्राप्त किया जा सकता है।

वास्तविक मूल्य (और उचित ट्रिगर कैसे बनाएं) कैसे प्राप्त करें डीबीएमएस पर निर्भर करता है। डीबी 2 current date, current time और current timestamp प्रदान करता है जिसे आप डेटाबेस में सर्वर समय सम्मिलित करने के लिए उपयोग कर सकते हैं, जो विभिन्न ग्राहक समय के सैकड़ों से अधिक संगत होने की संभावना है।

2

एसक्यूएल में तार न डालें। एक तैयार कथन का प्रयोग करें और पैरामीटर सेट करें।

+1

+1 केवल एक ही जवाब के लिए एसक्यूएल इंजेक्शन हमलों के लिए कमजोर नहीं है – krock

+0

यह एक टिप्पणी होनी चाहिए, क्योंकि यह पूछे जाने वाले प्रश्न के पूरी तरह से परिधीय है। लेकिन कहा जाता है कि, मैं सहमत हूं, निश्चित रूप से =) –

+0

@ डेविड हेडलंड: यह परिधीय नहीं है: एसक्यूएल में सीधे स्ट्रिंग करने के लिए प्रस्तुत दिनांक डालने से डीबीएमएस द्वारा गलत व्याख्या की जा सकती है, क्योंकि आप डीबीएमएस को नहीं जानते हैं कि कोड वास्तव में पूछताछ कर रहा है । – onof

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