Join fachinformatiker.de Forum Now
Ergebnis 1 bis 10 von 10

ResultSet Abfrage, 'No data found'

Diskussion über ResultSet Abfrage, 'No data found' in Java der Kategorie Programmierung; iLoha Javaisten, ich knabber schon seit ein paar Tagen an einem seltsamen Problem wo selbst Kollegen von mir keine Idee ...

  1. #1
    Reg.-Benutzer Avatar von Merlin_Level_E
    Reg.-Datum
    12.08.2002
    Ort
    Hoch oben im höchsten Turm der Zitadelle
    Beiträge
    115

    Standard ResultSet Abfrage, 'No data found'

    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.....

    Code:
    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.

    Geändert von Merlin_Level_E (18.08.2005 um 15:55 Uhr) Grund: Rechtschreibung lag nur im Verborgenem dunkel der gleißend hellen Nacht
    "2+2 sind 4, manchmal aber auch 3,5,6 oder gleichzeitig alles zusammen. Es zählt nicht was du selber für wahr erachtest, es gilt nur was dir die Partei zu glauben gibt." George Orwell, 1984

    [Wichtig] Weder Boardbetreiber noch Beitragsersteller haften für verlinkte Inhalte ! [/Wichtig]

  2. #2
    Reg.-Benutzer Avatar von perdian
    Reg.-Datum
    24.02.2005
    Beiträge
    2.759

    Standard

    <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?

  3. #3
    Reg.-Benutzer Avatar von Merlin_Level_E
    Reg.-Datum
    12.08.2002
    Ort
    Hoch oben im höchsten Turm der Zitadelle
    Beiträge
    115

    Standard

    iLoha Perdi,

    <Nummer5>mehr input</Nummer5>
    na dem Wunsch komme ich doch gerne nach

    Code:
    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; 
     }
    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.
    Geändert von Merlin_Level_E (18.08.2005 um 16:17 Uhr)
    "2+2 sind 4, manchmal aber auch 3,5,6 oder gleichzeitig alles zusammen. Es zählt nicht was du selber für wahr erachtest, es gilt nur was dir die Partei zu glauben gibt." George Orwell, 1984

    [Wichtig] Weder Boardbetreiber noch Beitragsersteller haften für verlinkte Inhalte ! [/Wichtig]

  4. #4
    Reg.-Benutzer Avatar von Merlin_Level_E
    Reg.-Datum
    12.08.2002
    Ort
    Hoch oben im höchsten Turm der Zitadelle
    Beiträge
    115

    Standard

    um das ganze noch ein wenig zu ergänzen:

    Verbindung zur Access DB per ODBC
    Code:
    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
    Code:
    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
    Code:
    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
    Geändert von Merlin_Level_E (18.08.2005 um 17:32 Uhr)
    "2+2 sind 4, manchmal aber auch 3,5,6 oder gleichzeitig alles zusammen. Es zählt nicht was du selber für wahr erachtest, es gilt nur was dir die Partei zu glauben gibt." George Orwell, 1984

    [Wichtig] Weder Boardbetreiber noch Beitragsersteller haften für verlinkte Inhalte ! [/Wichtig]

  5. #5
    Reg.-Benutzer Avatar von perdian
    Reg.-Datum
    24.02.2005
    Beiträge
    2.759

    Standard

    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.

  6. #6
    Reg.-Benutzer Avatar von Merlin_Level_E
    Reg.-Datum
    12.08.2002
    Ort
    Hoch oben im höchsten Turm der Zitadelle
    Beiträge
    115

    Standard

    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 ...
    "2+2 sind 4, manchmal aber auch 3,5,6 oder gleichzeitig alles zusammen. Es zählt nicht was du selber für wahr erachtest, es gilt nur was dir die Partei zu glauben gibt." George Orwell, 1984

    [Wichtig] Weder Boardbetreiber noch Beitragsersteller haften für verlinkte Inhalte ! [/Wichtig]

  7. #7
    Reg.-Benutzer Avatar von perdian
    Reg.-Datum
    24.02.2005
    Beiträge
    2.759

    Standard

    Du hast noch immer keinen Stacktrace gepostet - her damit!

  8. #8
    Reg.-Benutzer Avatar von Jaraz
    Reg.-Datum
    02.05.2001
    Beiträge
    3.812

    Standard

    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/...ridge.doc.html


    Gruß Jaraz
    Geändert von Jaraz (19.08.2005 um 13:43 Uhr)

  9. #9
    Reg.-Benutzer Avatar von Merlin_Level_E
    Reg.-Datum
    12.08.2002
    Ort
    Hoch oben im höchsten Turm der Zitadelle
    Beiträge
    115

    Standard

    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:
    Code:
    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)
    "2+2 sind 4, manchmal aber auch 3,5,6 oder gleichzeitig alles zusammen. Es zählt nicht was du selber für wahr erachtest, es gilt nur was dir die Partei zu glauben gibt." George Orwell, 1984

    [Wichtig] Weder Boardbetreiber noch Beitragsersteller haften für verlinkte Inhalte ! [/Wichtig]

  10. #10
    Reg.-Benutzer Avatar von Jaraz
    Reg.-Datum
    02.05.2001
    Beiträge
    3.812

    Standard

    Zitat Zitat von Merlin_Level_E
    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

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. LevelOrder Traversierung von Bäumen
    Von Jaipur im Forum C und C++
    Antworten: 20
    Letzter Beitrag: 15.12.2010, 20:47
  2. mod_php 4.3.8 installieren/updaten
    Von kills im Forum Linux + Unix
    Antworten: 41
    Letzter Beitrag: 07.09.2004, 10:07
  3. [SQL] Abfrage in Abfrage ?
    Von 2daBeat im Forum Datenbanken
    Antworten: 4
    Letzter Beitrag: 31.10.2003, 11:18
  4. Probleme mit Modem oder was?
    Von JayN im Forum Windows Betriebssysteme
    Antworten: 20
    Letzter Beitrag: 17.02.2003, 21:48
  5. Datenbanl abfrage via JAVA und SQL
    Von startup im Forum Java
    Antworten: 20
    Letzter Beitrag: 29.04.2002, 12:31