2009-12-01 7 views
7

निष्पादित करते समय कथन ने परिणाम सेट वापस नहीं किया है, मैं sqljdbc4.jar (sqljdbc_2.0) संस्करण का उपयोग कर उपयोग कर रहा हूं।SQLServerException: SQL

मैं इस तरह पहचान पाने के लिए एक डालने +-चुने वापस क्रियान्वित कर रहा हूँ:

BEGIN 
INSERT INTO DateRangeOptions (Description,Code) 
VALUES ('dateRange.quickPick.option.all','ALL'); 
SELECT SCOPE_IDENTITY() 
END 

और मैं:

 
com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set. 

लाइन है:

st.executeQuery(updateQuery) 

कोई विचार?

+0

सभी ड्राइवरों को कथन ब्लॉक को एक प्रश्न के रूप में निष्पादित करने की अनुमति नहीं है। यदि यह एक में काम करता है और दूसरा ऐसा नहीं है जो संभावित अपराधी है। – Donnie

+0

जो माइक्रोसॉफ्ट डोनी का बहुत समझदार नहीं होगा, एक चुनिंदा स्कोप_डिडिटी() किसी अन्य आवेषण से पहले और उसी नौकरी आईडी के साथ कनेक्शन पर होना चाहिए। आप निश्चित रूप से वापस प्रश्नों को निष्पादित कर सकते हैं लेकिन यह प्रतिबंधित करता है कि एप्लिकेशन द्वारा एक खुले कनेक्शन का उपयोग कैसे किया जा सकता है। इसके अलावा SQL सर्वर को एकाधिक क्वेरी निष्पादित करने में कोई समस्या नहीं है, और ड्राइवर टी-एसक्यूएल को अवगत नहीं है, इसलिए इसमें कोई संकेत नहीं है कि यह निष्पादित हो रहा है। - Vainstah 0 सेकंड पहले –

उत्तर

8

SQL 2000 से SQL 2005 तक अपग्रेड किया गया और माइक्रोसॉफ्ट एसक्यूएल सर्वर 2005 जेडीबीसी चालक संस्करण 1.2 में स्विच किया गया। मुझे त्रुटि मिली "एसईओपीE_IDENTITY()" के बाद एक सम्मिलन निष्पादित करते समय "कथन ने परिणाम नहीं दिया"। मैंने executeUpdate() का उपयोग करके समस्या हल की और executeQuery के बजाय generatedKeys प्राप्त किया। यहां पहले और बाद कोड है।

नोट: इस उदाहरण में प्रयुक्त कनेक्शन है java.sql.connection नहीं com.microsoft.sqlserver.jdbc.SqlServerConnection

एसक्यूएल 2000 कोड

String dbURL = "jdbc:sqlserver" + "://" + dbServer + ":" + 
       dbServerPort + ";SelectedMethod=cursor;databaseName=" 
          + dbName + ";user=xxx;password=xxx"; 
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
java.sql.Connection connection = DriverManager.getConnection(dbURL); 
sql = "insert into Contact (name) values ('ABC'); SELECT SCOPE_IDENTITY()"; 
PreparedStatement ps = connection.prepareStatement(sql); 
ResultSet rs = ps.executeQuery(); 
if (rs.next()) { 
    long id = rs.getLong(1); 
    System.out.println("Id=" + id); 
} 

एसक्यूएल 2005। कोड

String dbURL = "jdbc:sqlserver" + "://" + dbServer + ":" + 
       dbServerPort + ";SelectedMethod=cursor;databaseName=" 
          + dbName + ";user=xxx;password=xxx"; 

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
java.sql.Connection connection = DriverManager.getConnection(dbURL); 
sql = "insert into Contact (name) values ('ABC'); SELECT SCOPE_IDENTITY()"; 
PreparedStatement ps = connection.prepareStatement(sql); 
ps.executeUpdate(); // do not use execute() here otherwise you may get the error 
        // The statement must be executed before 
        // any results can be obtained on the next 
        // getGeneratedKeys statement. 

ResultSet rs = ps.getGeneratedKeys(); 
if (rs.next()) { 
    long id = rs.getLong(1); 
    System.out.println("Id=" + id); 
} 
+0

इसके लिए धन्यवाद, यह वास्तव में विचित्र है, और थोड़ा समझ में आता है। मुझे शोध करने की ज़रूरत है कि यह क्यों काम करता है। –

1

आपके द्वारा डाली गई पंक्ति विफल रही इसलिए कोई पहचान नहीं है? जावा में एक ब्रेकपॉइंट क्वेरी जेनरेट की गई है, क्वेरी स्ट्रिंग को कॉपी करें और परिणाम स्टूडियो में चलाएं ताकि यह देखने के लिए कि परिणाम क्या है। यह आपको दिखा सकता है कि आप क्या गलत कर रहे हैं।

+0

कोई भी क्वेरी क्वेरी विश्लेषक में ठीक काम करता है। – sproketboy

+0

ery विषम, अगर क्वेरी वाक्य रचनात्मक रूप से सही है तो इसे किसी समस्या का सामना नहीं करना चाहिए। क्या ड्राइवर प्लग-स्वीकार्य हैं? माइक्रोसॉफ्ट ड्राइवर - शायद विभिन्न प्रारंभिक फ़ंक्शन कॉल की आवश्यकता हो सकती है। यह निश्चित रूप से विभिन्न ओडीबीसी ड्राइवरों के साथ मामला है। क्या आपने सही कैटलॉग में बदल दिया है? –

1

ड्राइवर को अपग्रेड करने का कोई विकल्प? फिर आप Statement#getGeneratedKeys() का उपयोग कर सकते हैं। यह आलेख भी देखें: http://msdn.microsoft.com/en-us/library/ms378445%28SQL.90%29.aspx

यदि यह कोई विकल्प नहीं है, तो आपको एक ही कनेक्शन पर एक-दूसरे के बाद अलग-अलग INSERT और SELECT को आग लगाना होगा।