Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

ResultSet Abfrage, 'No data found'

Empfohlene Antworten

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.

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

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.

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

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.

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

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

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)

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Konto

Navigation

Suchen

Suchen

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.