Zum Inhalt springen

ResultSet Abfrage, 'No data found'


Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

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

Geschrieben

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)

Geschrieben
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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...