Mehrere Rückgabewerte in einer Methode

ramzymamzy

Mitglied
Kann man mehrere Rückgabewerte in einer Methode haben? So weit ich weiss gehts ja nicht! Andere Möglichkeit? Ich will z.B. die Anzahl der fehlgeschlagenen und gesendeten Mails in einer DB ausgeben!
Anbei mein Code:
Code:
	public ResultSet showMailqueueStatus(Connection theConnection){	
		  
		ResultSet rs = null;
		ResultSet sr = null;
	  
		try {  
			// Create a result set containing all data from my_table
			Statement stmt = theConnection.createStatement();
			
			rs = stmt.executeQuery("SELECT COUNT(*) FROM MAIL_QUEUE WHERE STATUS LIKE 'failed' ");
			sr = stmt.executeQuery("SELECT COUNT(*) FROM MAIL_QUEUE WHERE STATUS LIKE 'sent' ");
    
			// Fetch each row from the result set
			  while (rs.next()) {
				 String s = rs.getString("COUNT(*)");
				 //String r = sr.getString("COUNT(*)");
				 System.out.println("Anzahl der fehlgeschlagenen Mails: " + s);
				 //System.out.println("Anzahl der gesendeten Mails: " + r);
			  }
			 
			  while (sr.next()) {
							String r = sr.getString("COUNT(*)");
							//String r = sr.getString("COUNT(*)");
							System.out.println("Anzahl der gesendeten Mails: " + r);
							//System.out.println("Anzahl der gesendeten Mails: " + r);
			  }
			} 

			  catch (SQLException e) {
		      }
	  return rs, sr;
	}

wenn ich nur einen Rückgabewert eingebe gehts!
 
Hi,

ich würde einfach ein Objekt mit beiden gewünschten Eigenschaften zurückgeben:
Code:
class ResSets {
    ResultSet rs;
    ResultSet sr;
    public ResSets(ResultSet s1, ResultSet s2) {
        rs = s1;
        sr = s2;
    }
}

...

und dann: 

return new ResSets(sr, rs);
Wobei die Methode vom Typ "ResSets" sein muss.

Gruß
.
 
Du solltest grundsätzlich nicht Methoden schreiben die 2 Dinge erledigen.
Schreib deine Methode um.

Code:
ResultSet showMailqueueStatus(Connection theConnection){	

in 

ResultSet showMailqueueStatus(Connection theConnection, String status){	

....

rs = stmt.executeQuery("SELECT COUNT(*) FROM MAIL_QUEUE WHERE STATUS LIKE '"+status+"' ");

aufruf mit 
rs = showMailqueueStatus(conn,"failed");
rs = showMailqueueStatus(conn,"sent");

Noch besser ist wenn du kein ResultSet sondern gleich den count als int zurücklieferst
 
Hi,

nun, viel zu verstehen gibts da nicht: Du brauchst eine neue Klasse (ich habe sie ResSets genannt), die zwei Membervariablen vom Typ ResultSet (was immer das ist) besitzt. Nun kann Deine Funktion einfach ein Objekt dieser Klasse zurückgeben. Deine Funktionsdeklaration sollte dann so aussehen:
Code:
public ResSets showMailqueueStatus(Connection theConnection) {
und mit return ein neues ResSets-Objekt zurückgeben. Um die Werte auszulesen, musst Du dann natürlich auf die Membervariablen dieses Objektes zugreifen (bei mir sind sie public, aber mit Getter-Methoden ist das natürlich besser):
Code:
ResSets ergebnis = showMailqueueStatus(meineConnection);

ResultSet gesendet = ergebnis.rs;
ResultSet fehler = ergebnis.sr;
Nun kenne ich zwar alle diese Datenbankklassen nicht, aber ich hoffe, das Prinzip ist klar.

Gruß

EDIT: Oder Christians Vorschlag beherzigen. Ich habe das einfach mal so gelassen, da ich nicht wusste, was Du mit diesen Werten eigentlich machen willst. ;)
.
 
Hallo!

Händisch SQL Statements zu bauen ist IMHO vorsintflutlich *duck*
Wenn du auf diesem Level Entwickeln musst verwende doch einen gute JDBC Abstraction Layer: -> http://www.ibatis.com/

Btw. du könntest auch ein Array / List / Set / Map zurück geben / reinreichen um mehrere Rückgabewerte zu "simulieren"

Gruß Tom
 
Zurück