Merlin_Level_E Geschrieben 18. August 2005 Geschrieben 18. August 2005 iLoha Javaisten, ich knabber schon seit ein paar Tagen an einem seltsamen Problem wo selbst Kollegen von mir keine Idee mehr haben. Folgendes, ich bekomme ein ResultSet (rsQuelle) von einer anderen Methode übergeben und möchte nun per rsQuelle.getString("Name1") die Daten der aktuellen Zeile auslesen. Soweit so gut. Der erste Zugriff ist problemlos (Erhalte den Wert), der direkt folgende (auch wenn er identisch ist) verursacht eine SQL Exception "No data found". Es gibt keine next() Anweisung dazwischen, sondern er soll einfach auf das gleiche Feld des ResultSets zugreifen ... Folgender Codeschnipsel befindet sich in einem Try/Catch Block vereint. Es ist immer der 2. Zugriff, sei er auch System.out. oder pstmt., der die Exception verursacht..... pstmt = sqlCon.prepareStatement("Select Abfrage und Platzhalter fürs PreparedStatement"); System.out.println(rsQuelle.getRow()); // Ausgabe ist ok System.out.println(rsQuelle.getString("NAME1")); // Ausgabe ist ok pstmt.setString(1, ""+rsQuelle.getString("NAME1")+""); // Exception Notiz: Die Daten kommen aus einer AccessDB die per JDBC/ODBC in einer Untermethode zur Verarbeitung in ein ResultSet gepackt werden. Das daraus erhaltene Set ist auch in Ordnung... Ideen und Hinweise sind herzlich willkommen. now this rfc ist declared as open. M. Zitieren
perdian Geschrieben 18. August 2005 Geschrieben 18. August 2005 <Nummer5>Brauche Input</Nummer5> Das ist ein bisschen wenig, was du uns verrätst, die interessanten Stellen hast du weggelassen. - wie ist der genaue SQL-String des PreparedStatements? - wie ist der genaue SQL-String der Query, aus der du die Daten ziehst? - wie ist der Stacktrace der SQLException? Zitieren
Merlin_Level_E Geschrieben 18. August 2005 Autor Geschrieben 18. August 2005 iLoha Perdi, <Nummer5>mehr input</Nummer5> na dem Wunsch komme ich doch gerne nach try{ pstmt = sqlCon.prepareStatement("SELECT ADRESSE FROM KHKAdressen WHERE NAME1 = ? AND LIEFERSTRASSE = ? AND LIEFERORT = ? "); // Zum Test der Fehler System.out.println(rsQuelle.getRow()); // geht System.out.println(rsQuelle.getString("NAME1")); // geht auch // Eigentliche Stelle des Nutzens pstmt.setString(1, ""+rsQuelle.getString("NAME1")+""); // *bumm* würde hier aber auch bei einem System.out. passieren pstmt.setString(2, ""+rsQuelle.getString("STRASSE")+""); pstmt.setString(3, ""+rsQuelle.getString("ORT")+""); rsSQL_ADR = pstmt.executeQuery(); }catch(SQLException emeOn) { System.out.println("Fehler beim Feststellen der Adressen in KHKAdressen."); return false; } [/code] folgende Exception gibts dann dazu [code] RETCODE = 100 ERROR - No data found java.sql.SQLException: No data found Notiz: Beim Aufbau der ersten SQL Verbindung erhalte ich Warnings die mich auf Sprachänderung hinweisen. "WARNING - Generating SQLWarning... SQLWarning: reason([Microsoft][ODBC SQL Server Driver][sql Server]Datenbankkontext auf 'XXX_Testdatenbank' geändert.) SQLstate(01000) vendor code(5701) SQLWarning: reason([Microsoft][ODBC SQL Server Driver][sql Server]Spracheneinstellung auf Deutsch geändert.) SQLstate(01000) vendor code(5703)" Die Transaktion wird nur zu Beginn dahingehend manipuliert, dass AutoCommit false ist. Thanks a lot, m. Zitieren
Merlin_Level_E Geschrieben 18. August 2005 Autor Geschrieben 18. August 2005 um das ganze noch ein wenig zu ergänzen: Verbindung zur Access DB per ODBC public static Connection getConnection (String sQuelle) throws SQLException, ClassNotFoundException { System.out.println("\n------ Verbindung Access | Log-Anfang ------"); DriverManager.setLogWriter( new PrintWriter(System.out) ); Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); Connection conAccess = DriverManager.getConnection( "jdbc:odbc:"+sQuelle+"","","" ); System.out.println("------ Verbindung Access | Log-Ende ------"); return (conAccess); } Erzeugung des rsQuelle ResultSets try { Connection conA = db_access.getConnection(sQuelle); Statement stmt = conA.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); String query = "SELECT * FROM "+sTab+""; ResultSet rs = stmt.executeQuery( query ); return(rs); } catch (SQLException e) db_access ist ein Modul um die ODBC/JDBC Optionen auszuhandeln und eine Verbindung zum Access zu initiieren. sTab ist ein String der den Namen der Tabelle beinhaltet (kommt per Parameter). log der SQL Verbindung Connection.setAutoCommit (false) Setting connection option (SQLSetConnectOption), hDbc=260450048, fOption=102, vParam=0 Fetching (SQLFetchScroll), hStmt=260448032 *Connection.prepareStatement (SELECT ADRESSE FROM KHKAdressen WHERE NAME1 = ? AND LIEFERSTRASSE = ? AND LIEFERORT = ? ) Allocating Statement Handle (SQLAllocStmt), hDbc=260450048 hStmt=260448888 Setting statement option (SQLSetStmtOption), hStmt=260448888, fOption=6, vParam=0 Setting statement option (SQLSetStmtOption), hStmt=260448888, fOption=7, vParam=1 Preparing (SQLPrepare), hStmt=260448888, szSqlStr=SELECT ADRESSE FROM KHKAdressen WHERE NAME1 = ? AND LIEFERSTRASSE = ? AND LIEFERORT = ? Number of parameter markers (SQLNumParams), hStmt=260448888 value=3 Registering Statement sun.jdbc.odbc.JdbcOdbcPreparedStatement@8bdcd2 1 *ResultSet.getMetaData Number of result columns (SQLNumResultCols), hStmt=260448032 value=32 *ResultSetMetaData.getColumnName (1) Column attributes (SQLColAttributes), hStmt=260448032, icol=1, type=1 value (String)=ID Number of result columns (SQLNumResultCols), hStmt=260448032 value=32 *ResultSetMetaData.getColumnName (2) Column attributes (SQLColAttributes), hStmt=260448032, icol=2, type=1 value (String)=SCHNELLSUCHE Number of result columns (SQLNumResultCols), hStmt=260448032 value=32 *ResultSetMetaData.getColumnName (3) Column attributes (SQLColAttributes), hStmt=260448032, icol=3, type=1 value (String)=NAME1 Column attributes (SQLColAttributes), hStmt=260448032, icol=3, type=2 value (int)=12 Column attributes (SQLColAttributes), hStmt=260448032, icol=3, type=3 value (int)=255 Get string data (SQLGetData), hStmt=260448032, column=3, maxLen=256 BEISPIEL FIRMA Dresden GmbH BEISPIEL FIRMA Dresden GmbH Fetching (SQLFetchScroll), hStmt=260448032 Get string data (SQLGetData), hStmt=260448032, column=3, maxLen=256 BEISPIEL FIRMA Dresden GmbH Binding IN string parameter (SQLBindParameter), hStmt=260448888, ipar=1, SQLtype=1, precision=8000, scale=0, rgbValue=[B@1f78ef1 Get string data (SQLGetData), hStmt=260448032, column=3, maxLen=256 RETCODE = 100 ERROR - No data found Zitieren
perdian Geschrieben 19. August 2005 Geschrieben 19. August 2005 Alles ein bisschen sehr unübersichtlich aber ein Gedanke kommt mir: Haste du nach dem ResultSet rs = stmt.executeQuery( query ); irgendwo ein rs.next() aufgerufen? Das muss auch vor dem ersten Datensatz gemacht werden. Zitieren
Merlin_Level_E Geschrieben 19. August 2005 Autor Geschrieben 19. August 2005 Moin Perdi, Japp, das ganze Prozedre läuft in einer "while (rsQuelle.next())" Schleife ab. Was einfach so verwirrend ist, ist dass er schon korrekt auf das ResultSet zugegriffen hat nun aber beim 2. Versuch mit identischen Angaben kollabiert. a little bit ratlos ... Zitieren
perdian Geschrieben 19. August 2005 Geschrieben 19. August 2005 Du hast noch immer keinen Stacktrace gepostet - her damit! Zitieren
Jaraz Geschrieben 19. August 2005 Geschrieben 19. August 2005 Hi, manchmal muss man sich halt mit einem vorgegebenen Verhalten zufriedenstellen. Ich weiß nicht wo dein Problem liegt. Entweder du nutzt einen "richtigen" JDBC Treiber oder lebst mit der SUN Implementierung die anscheinend einen zweifachen Zugriff nicht vorsieht. Warum sollte man auch zweimal auslesen? Speichere das doch einfach in eine Variable und gut ist. Selbst Sun sagt, dass man die eingebaute JDBC ODBC Bridge nur im Notfall nutzen soll. http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/getstart/bridge.doc.html Gruß Jaraz Zitieren
Merlin_Level_E Geschrieben 19. August 2005 Autor Geschrieben 19. August 2005 iLoha Javaisten, Jaraz, danke für die Infos. Hätte nicht gedacht dass Sun der Bride nur Notfall-Qualitäten zuschreibt. Schade, wäre meiner Faulheit sonst recht zuträglich gewesen perdi, Dank für schnelle Erläuterung und hier erbetenes, Stacktrace: java.sql.SQLException: No data found at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7060) at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3862) at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5561) at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:338) at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:395) at app_comparison.sortNpaste(app_comparison.java:101) at app_comparison.main(app_comparison.java:49) Zitieren
Jaraz Geschrieben 19. August 2005 Geschrieben 19. August 2005 Jaraz, danke für die Infos. Hätte nicht gedacht dass Sun der Bride nur Notfall-Qualitäten zuschreibt. Nun ja, JDBC wird generell über Interfaces realisiert. Und das ResultSet Interface sagt nun mal nicht, das mehrfaches aufrufen der Funktion immer wieder den Wert zurückgibt. Auch wenn die meisten anderen JDBC Driver Hersteller das so implementiert haben. Gruß Jaraz Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.