MAX und ResultSet#next

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Tach,

ich möchte den höchsten Wert einer Spalte in einer Tabelle rausfinden, dazu habe ich folgende Methoden geschrieben:

Code:
	public int getNextID(String table, String id) {
		
		try {
			ResultSet rs = getQuery("SELECT MAX(" + id + ") FROM " + table);
			if (rs.next()) {
				return rs.getInt(1);
			}
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
		return 0;
	}

	public ResultSet getQuery(String statement) {
		
		try {
			Statement stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(statement);
			return rs;
		}
		catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}

funktioniert auch wunderbar, aber nur wenn ich wie man sieht ein rs.next() miteinbaue. Lasse ich das rs.next() weg bekomme ich eine SQLException geworfen. Aber mit diesem Statement sollte ich ja eigentlich nur den höchsten Wert zurückbekommen und somit auch nur einen Datensatz im ResultSet haben.

Hoffe mir kann das jemand erklären!

Danke!
 

AlArenal

Top Contributor
API hat gesagt.:
A ResultSet object maintains a cursor pointing to its current row of data. Initially the cursor is positioned before the first row.

Daraus folgt, dass man ein #next machen muss, um überhaupt auf die erste Position zu kommen. Oder ein #first und schauen, ob true geliefert wird.
 

The_S

Top Contributor
ah, ok. Wer lesen kann ist klar im Vorteil :oops:

[edit] und wie bekomm ich jetzt raus, ob überhaupt etwas gefunden wurde? Also ob das ResultSet leer ist? Mit isLast() will ich nicht unbedingt arbeiten, weil das ja laut API recht performance-fressend sein kann :?
 

The_S

Top Contributor
Murray hat gesagt.:
Wenn nichts gefunden wurde, dann sollte bereits das erste rs.next() false liefern.

Gibt MAX aufjedenfall 0 zurück wenn nichts gefunden wurde (nutze HSQLDB)? Dann würde das nämlich meine Verwirrung erklären ;)
 

AlArenal

Top Contributor
Probier die Abfrage doch zu Fuß auf ner leeren Tabelle aus und du dürftest feststellen, dass das Statement NULL liefert. Entsprechend wird das ResultSet keine Einträge haben.
 

thE_29

Top Contributor
Ich will nix sagen, aber das ist PFUI!!!

1. resultsets werden mit einem einfachen .close() net immer geschlossen!!

Dh, wenn auf dem resultset noch 100 Sätze liegen würden, du aber nur den ersten ausliest und rs.close() sagst, ist dieser gar nicht zu!

Deswegen empfiehlt es sich bei ResultSets und Prepared/Statements close Methoden zu schreiben!

2. Wenn du das statement offen lässt, braucht das jedes mal eine Verbindung und irgendwann sind alle weg!

Dh,

try {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(statement);
return rs;
}

sowas ist nie zum Empfehlen, da das statement immer offen bleibt!

Mann sollte auch immer mit finally arbeiten und die ResultSets vor den Statements closen

Bsp.:

Code:
pubic static void _close(ResultSet rs)
{
try{
if(rs != null)
{
   while (rs.next()) ; //; hier also einfach nur durchgehen
   rs.close();
}
}catch(Exception ex)
{ ex.printStackTrace(); } //musst du selber entscheiden ob dich das hier interessieren würde
}

public static void _close(Statement stm)
{
  try{
    if(stm != null)
      stm.close();
  }
  catch(Exception ex)
  { }
}

public static void _close(PreparedStatement pstm)
{
  try{
    if(pstm != null)
      pstm.close();
  }
  catch(Exception ex)
  { }
}


public int getNextID(String table, String id) {
      
   Statement stm = null;
   ResultSet rs = null;
      try {
 stm = conn.createStatement();
  rs = stm.executeQuery("SELECT MAX(" + id + ") FROM " + table);
         if (rs.next()) {
            return rs.getInt(1);
         }
      }
      catch (SQLException e) {
         e.printStackTrace();
      }
      finally{
      _close(rs);
      _close(stm);
}
      return 0;
   }

Durch die Methoden kann man das immer im finally Block schreiben ohne nochmals try/catch einbauen zu müssen!


Zwar fällt das bei kleinern Anwendungen net so ins Gewicht, aber wennst dann doch mal größer wird und viel geschrieben wird, kann genau sowas zu einem Problem führen!!
 

The_S

Top Contributor
Hey, danke für die Antwort. Das war bis jetzt mehr als Beispielcode gedacht, aber ich hab in der Tat immer "nur" einfach geclosed :oops:.

Wenn ich mir dein Beispiel mal anschaue, dann wird das ResultSet und das Statement nur geclosed wenn das ResultSet leer ist!?
 

thE_29

Top Contributor
Naja, das Statement könnte sogar geclosed werden!

Aber das resultset wird wirklich nur dann geclosed, wenn es leer ist!

Bei Oracle kann man auf die offenen Cursor abfragen und da bin ich auf das draufgekommen!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
T ResultSet#next Ungültige Reihenfolge (DB2) Datenbankprogrammierung 5
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
J SQL ResultSet Previous Datenbankprogrammierung 10
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3
F generelle Vorgehensweise ResultSet Datenbankprogrammierung 5
S ResultSet Datenbankprogrammierung 2
A MySQL ResultSet.updateBytes schlägt fehl Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
D ResultSet gibt nichts aus. Datenbankprogrammierung 3
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
J jdbc ResultSet types Datenbankprogrammierung 5
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
F ResultSet to String[] Datenbankprogrammierung 3
E ResultSet in HashMap Datenbankprogrammierung 8
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
M Problem mit ResultSet bei SQL Server 2005 Datenbankprogrammierung 6
S ResultSet in ArrayList ablegen Datenbankprogrammierung 17
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
T ResultSet initialisieren Datenbankprogrammierung 2
C kein Resultset Datenbankprogrammierung 2
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
S ResultSet variabel auslesen Datenbankprogrammierung 4
D Anzahl der Elemente im ResultSet ermitteln Datenbankprogrammierung 8
A Leeres ResultSet mit H2 unter Vista Datenbankprogrammierung 3
A Warum ist mein ResultSet leer? Datenbankprogrammierung 5
S ResultSet closed Datenbankprogrammierung 2
Z ResultSet mit einer anderen Datenquelle Datenbankprogrammierung 7
O Spaltenname aus Resultset Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
E ResultSet vergisst Reihe? Datenbankprogrammierung 2
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
F ResultSet refresh moeglich? Datenbankprogrammierung 3
S ResultSet enthält keine Daten Datenbankprogrammierung 2
B Geschlossenes ResultSet Datenbankprogrammierung 6
T ResultSet schließen? Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
S ResultSet Datenbankprogrammierung 6
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
@ Like-Klausel; NPE bzw. leeres ResultSet Datenbankprogrammierung 4
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
B No ResultSet was produced Datenbankprogrammierung 2
S ResultSet erweitern ? Datenbankprogrammierung 4
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
RaoulDuke ResultSet - Wie arbeitet sowas intern Datenbankprogrammierung 2
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
R ResultSet zu bestimmtem DS navigieren Datenbankprogrammierung 4
S .leeres Resultset abfangen Datenbankprogrammierung 2
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben