MSSQL - SQL Statement "executeQuery()" funktioniert nicht

Havoc<>

Mitglied
MSSQL - Nach "executeQuery()" Error: "No current row in the ResultSet."

Hallo zusammen,

ich habe folgenden Codezeilen programmiert :
Java:
  rs = null;
  rs = stmt.executeQuery("select * from sys.all_objects " +
                                           "where type='U' "+
                                           "and name='"+nodeInfo.toString()+"';");
  String ObjectId = rs.getString("object_id");


Aus irgendeinem Grund bekomme ich allerdings bei "rs.getString" folgenden Error:
Code:
java.sql.SQLException: No current row in the ResultSet.
        at net.sourceforge.jtds.jdbc.MSCursorResultSet.getColumn(MSCursorResultSet.java:248)
        at net.sourceforge.jtds.jdbc.JtdsResultSet.getString(JtdsResultSet.java:930)
        at net.sourceforge.jtds.jdbc.JtdsResultSet.getString(JtdsResultSet.java:1217)
        at MM.machsmirgui.jtTablesValueChanged(machsmirgui.java:251)
        at MM.machsmirgui.access$400(machsmirgui.java:19)
        at MM.machsmirgui$5.valueChanged(machsmirgui.java:118)
        at javax.swing.JTree.fireValueChanged(JTree.java:2823)
        at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3194)
        at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629)
        at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078)
        at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:287)
        at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:170)
        at javax.swing.JTree.setSelectionPath(JTree.java:1598)
        at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2316)
        at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3517)
        at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3456)
        at java.awt.Component.processMouseEvent(Component.java:6035)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3983)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

"nodeInfo.toString()" ist mit dem richtigen String gefüllt. In einem Test habe ich den SQL Befehl erst in einer String Variabel zusammen gebaut. Danach habe ich den String mit dem Enterprisemanager überprüft. Dort bekomme ich korrekt einen Datensatz zurück. Es dürfte also eigentlich nicht sein, dass ich "No current row in the ResultSet." zurückbekomme.

Kann mir vielleicht jemand erklären wie es zu diesem Fehler kommt und wie ich sowas unter Netbeans am besten debuggen kann? Theoretisch müsst es doch möglich sein, nachzuschauen welches Statement "executeQuery" nun letztendlich ausgeführt hat (ohne den Umweg über eine String Variabel), oder?

Vielen Dank im Voraus.
Gruß Jens
 
Zuletzt bearbeitet:
Dein Fehler liegt darin, dass der Zeiger in dem ResultSet noch auf keine Row zeigt. Das funktioniert mit rs.next().

Also normalerweise baut man darum eine Schleife die solange durchgeführt wird solange rs.next() true zurückbringt.

also z.B.

Code:
...
while (rs.next()) {
   System.out.println("Object Id: "+rs.getString("object_id"));
}

Hier noch der Text aus der Javadoc:

next()

Moves the cursor down one row from its current position. A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on.

mfg,
gring0
 
*aaah* :rolleyes: ...

Super. Klar. Jetzt wo du das sagst fällt es mir wie Schuppen von den Augen. Ich identifiziere bereits einen eindeutigen Datensatz, weshalb ich überhaupt nicht an eine Schleife gedacht habe (und deshalb auch nicht an das rs.next()). In meinen anderen Code-Teilen funktioniert das natürlich wunderbar, weil ich da Schleife drum rum hab.

Vielen Danke für deine Hilfe!

btw. die Hilfe habe ich dafür schon 500x umgekrempelt, aber das der Zeige "beforeFirst" steht, habe ich nicht gelesen.


Gruß Jens
 
Zurück