2013-10-30 7 views
7

मुझे जेडीबीसी का उपयोग कर डेटाबेस के विरुद्ध चलाने वाले फ़ंक्शन पर एक अजीब SQLException मिल रहा है। SQLException: कॉलम 'संदेश' नहीं मिला।अजीब SQLException: कॉलम नहीं मिला

मैं अपने समारोह में इस राशि:

st = con.prepareStatement("SELECT NotificationID,UserIDFrom,UserIDTo,Message,Timestamp,isNotified FROM notification WHERE UserIDTo=? AND isNotified=?"); 
    st.setInt(1, _UserID); 
    st.setBoolean(2, false); 
    System.out.println("st is: " + st); 
    rs = st.executeQuery(); 

और मुझे लगता है कि त्रुटि मिली, तो मैं st.executeQuery() के बाद यह कहा:

ResultSetMetaData meta = rs.getMetaData(); 
    for (int index = 1; index <= meta.getColumnCount(); index++) { 
     System.out.println("Column " + index + " is named " + meta.getColumnName(index)); 
     } 

और जब मैं अपने कोड को चलाने के फिर से इस मैं क्या है परिणामस्वरूप प्राप्त करें:

Column 1 is named NotificationID 
Column 2 is named UserIDFrom 
Column 3 is named UserIDTo 
Column 4 is named Message 
Column 5 is named TimeStamp 
Exception in thread "main" java.sql.SQLException: Column 'Message' not found. 
Column 6 is named isNotified 

और यहां मेरी तालिका के डिज़ाइन का एक स्क्रीनशॉट है, मेरा एसक्यूएल Workbench enter image description here

और तालिका में डेटा enter image description here

मैं सच में समझ नहीं क्या यहाँ हो रहा है .... किसी को भी मदद कर सकते हैं?

संपादित
मैं सिर्फ सवाल है कि मैं सिर्फ देखा करने के लिए कुछ जोड़ने के लिए SELECT बयान में * से बदल दिया है।
यदि मैं चयन से Message कॉलम हटा देता हूं तो मुझे TimeStamp कॉलम के लिए एक ही त्रुटि मिलती है। और यदि मैं दोनों कॉलम हटा देता हूं तो मुझे कोई त्रुटि नहीं मिलती है। मैं प्रत्येक स्तंभ के लिए
StackTrace के लिए getString() तरीकों पर त्रुटि मिलती है

while (rs.next()) { 
     NotificationID = rs.getInt("NotificationID"); 
     System.out.println("NotificationID: " + NotificationID); 

     SenderID = rs.getInt("UserIDFrom"); 
     System.out.println("SenderID: " + SenderID); 
     From = findUserName(SenderID); 

     try { 
      body = rs.getString("Message"); 
      System.out.println("body: " + body); 
     } catch (Exception e) { 
      System.out.println("Message error: " + e); 
      e.printStackTrace(); 
     } 

     try { 
      time = rs.getString("Timestamp"); 
      System.out.println("time: " + time); 
     } catch (Exception e) { 
      System.out.println("Timestamp error: " + e); 
      e.printStackTrace(); 
     } 
    } 

:

EDIT2
ठीक है, यह हिस्सा मैं त्रुटियों मिलता है, मैं संदेश और समय-चिह्न पर दोनों मिल अपने isNotified की डेटाप्रकार

java.sql.SQLException: Column 'TimeStamp' not found. 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) 
    at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1167) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5733) 
    at NotifyMe_Server.Database.getUnNotified(Database.java:444) 
    at tests.Tests.main(Tests.java:39) 
+0

आप मेज पर किसी भी चलाता है? – BevynQ

+0

यदि आप SQL कथन में मैन्युअल रूप से Int/Boolean सेट करते हैं तो आपको त्रुटि मिलती है? यानी, "चयन * से अधिसूचना से चुनें जहां UserIDTo = 1 और isNotified = 0" है और PreparedStatement चर सेट किए बिना इसे निष्पादित करें। – hotforfeature

+0

क्या आपके पास स्तंभ नाम में कुछ सफेद जगह या अजीब चरित्र हो सकता है? – Taylor

उत्तर

0

बदलें: TimeStamp (Message के लिए एक ही) डेटाबेस में TINYINT के रूप में स्तंभ और

isNotified TINYINT(1) 

बूल, बूलियन सम्मिलित करने के लिए पुन: प्रयास: इन प्रकार के TINYINT के लिए समानार्थक शब्द हैं (1)। शून्य का मान झूठा माना जाता है। गैर-शून्य मानों को सत्य माना जाता है।

+0

मुझे डेटाटाइप में एक बूलियन विकल्प नहीं दिख रहा है, MySQL ** EDIT ** btw में, मेरे पास एक ही तालिका में एक ही प्रकार का फ़ील्ड है, और मैं अपने जावा कोड में 'setBoolean()' का उपयोग करता हूं और यह काम करता है ठीक – akafortes

+0

TINYINT का उपयोग करें और – Shamse

+0

को अभी भी त्रुटि प्राप्त करने का प्रयास करें :( – akafortes

1

यदि आप अपने कोड

try { 
     time = rs.getString("Timestamp"); 
     System.out.println("time: " + time); 
    } catch (Exception e) { 
     System.out.println("Timestamp error: " + e); 
     e.printStackTrace(); 
    } 
} 

आप "समय-चिह्न" इस प्रारूप में इस्तेमाल किया है, लेकिन यदि आप अपने डेटाबेस में निर्दिष्ट के रूप में यह करने के लिए "टाइमस्टैम्प" बदल गया है, उम्मीद है कि यह काम करेगा निरीक्षण।

0

आप

System.out.println("Column " + index + " is named '" + meta.getColumnName(index) + "'"); 
तो

को

System.out.println("Column " + index + " is named " + meta.getColumnName(index)); 

बदल सकते हैं, अगर वहाँ "संदेश" स्तंभ नाम में खाली स्थान के यह है कि हम देख सकते हैं?

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

(इसके अलावा टाइमस्टैम्प बनाम टाइमस्टैम्प के बारे में पिछले जवाब देखें।)

0

ऐसा लगता तालिका मेटाडेटा जैसी दूषित है। आपको तालिका को छोड़कर और पुनर्निर्मित करके इसे सही करने में सक्षम होना चाहिए, हालांकि अगर मेटाडाटा वास्तव में बोर्क किया गया है तो आप तालिका को छोड़ने में सक्षम नहीं हो सकते हैं। यदि ऐसा है या आपको डेटा रखने की आवश्यकता है, तो पूरे डेटाबेस का बैक अप लेने और पुनर्स्थापित करने का तरीका है, लेकिन टूटा डेटाबेस छोड़ने से पहले पुनर्स्थापित करने और/या किसी अन्य डेटाबेस नाम को पुनर्स्थापित करने से पहले SQL डंप फ़ाइल की जांच करें। वास्तव में क्या गलत है, इस पर निर्भर करते हुए, आपकी समस्या कॉलम डंप से गुम हो सकती है।

तो डेटाबेस ताज़ा एक विकल्प नहीं है वहाँ लक्षित मरम्मत करने के लिए तरीके हैं, लेकिन मैं कोई विशेषज्ञ हूँ इसलिए मैं उस पर सलाह नहीं दे सकते। फिर, आगे बढ़ने से पहले अपने डेटाबेस का बैकअप लें और सत्यापित करें कि बैकअप पूरा हो गया है (यानी इसमें आपके सभी कॉलम हैं)। यदि यह एक उत्पादन डेटाबेस है, तो मैं मेटाडेटा में हेरफेर करने पर इंटरनेट से सलाह लेने के बारे में बहुत सावधान रहूंगा। संस्करण, स्टोरेज इंजन और पर्यावरण में मामूली मतभेद आपको इस सामान के साथ बना या तोड़ सकते हैं, और समस्या की प्रकृति को देखते हुए आप शुष्क रन नहीं कर सकते हैं।

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