Mehrere unterschiedliche ResultSets

Status
Nicht offen für weitere Antworten.

FenchelT

Bekanntes Mitglied
Hallo zusammen,

ich habe mal eine Frage zu ResultSets.

ICh habe eine Datenbankklasse welche eine Verbindung zur Datenbank herstellt und die Abfragen ausfuehrt:

Code:
import java.sql.*;

public class DB_Klasse 
{
//	 Instanzvariablen
	// --------------------
	   private static Connection connection;
	   private Statement statement;
	   private ResultSet resultRead;
	  
	   
	// Konstruktor der Klasse 
	// -----------------------
	   public DB_Klasse ()
	   {
		   try
		   {
			   // Treiber laden
			   // ----------------
			   	  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

			   
			   // Verbindung zur Datenbank aufbauen
			   // -----------------------------------
			   	  connection =
			   		  DriverManager.getConnection
			   		  	("jdbc:odbc:TEST", "user", "pw");
			    
			   
			   // initialisieren
			   // -----------------
			   	  this.statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
	
		} // end try
		catch(Exception e)
		{
			System.out.println(e.getMessage());
		} // end catch
	
	}
	
	
	
	
	
	public ResultSet read(String query)
	{
		// SQL-Statement absetzen (einfaches SQL-Statement)
		// ----------------------------------------------------
		   try
		   {
			   this.resultRead = this.statement.executeQuery
		   			(query);
			   
		   }
		   catch (Exception ex)
		   {
			   System.out.println(ex.getMessage());
		   }
		   
		   return this.resultRead;
		   
	}  // end read
	
	

	
	
	public void terminate()
	{
		try
		{
			this.statement.close();
			connection.close();
		}
		catch (Exception ex)
		   {
			   System.out.println("Geworfene Exception  der Methode terminate() \n" + ex.getMessage());
		   } // end catch
	}
	
	
}


Nun gibt die Methode read() ein ResultSet an die aufrufende Klasse zurueck.
Soweit funktioniert das.

Nun moechte ich aber durch die Methode read drei unterschiedliche Resultsets zurueckgeben lassen und drei unterschiedlichen Instanzvariablen der aufrufenden Klasse zuweisen.


Code:
import java.sql.*;


public class MyController 
{
	ResultSet rsVertragskopf;
	ResultSet rsVertragsprodukt;
	ResultSet rsVertragskunde;
	
	String sqlVertragskopf;
	String sqlVertragskunde;
	String sqlVertragsprodukt;
	
	public MyController()
	{
		
	}
	
	
	
	public void steuerung()
	{

		DB_Klasse db = new DB_Klasse();
		
		// SQLs aufbauen
		// ----------------
			this.sqlVertragskopf = "SELECT vnr, vertragnr, gueltigvon, gueltigbis, loekz FROM vertragskopf WHERE loekz = 'N'";
		
			this.sqlVertragskunde ="SELECT vnr, klnr, klnrjde FROM vertragskunde WHERE loekz = 'N'";
			
			this.sqlVertragsprodukt = "SELECT vnr, pr, prlv, sollmenge, preis FROM vertragsprodukt WHERE loekz = 'N'";
			
			
		// Queries ausfuehren
		// --------------------
			this.rsVertragskopf = db.read(sqlVertragskopf);
			this.rsVertragskunde = db.read(sqlVertragskunde);
			this.rsVertragsprodukt = db.read(sqlVertragsprodukt);
			
			ausgabe();
			
	}
	
	
	public void ausgabe()
	{
		int intVertragskopfVnr=0;
		int intVertragskundeVnr=0;
		int intVertragsproduktVnr=0;
		
		try
		{
			while(this.rsVertragskopf.next())                                                   <-----hier wird bereits mit einem Fehler ausgestiegen
			{
				intVertragskopfVnr=this.rsVertragskopf.getInt("vnr");
				System.out.println(intVertragskopfVnr);
				System.out.println("--------------------\n");
				
				while(this.rsVertragsprodukt.next())
				{
					intVertragsproduktVnr = this.rsVertragsprodukt.getInt("vnr");
					
					if (intVertragsproduktVnr == intVertragskopfVnr)
					{
						System.out.println(this.rsVertragsprodukt.getInt("pr"));
						System.out.println(this.rsVertragsprodukt.getFloat("sollmenge"));
						System.out.println(this.rsVertragsprodukt.getFloat("preis"));
						System.out.println("\n\n\n");
					}
				}
				
			}
				
		}
		catch (Exception ex)
		{
			System.out.println("Fehleralarm: " + ex);
		}
		
	}
}

Fehlermeldung: ResultSet is closed.

Wie haelt man nun drei unterschiedliche ResultSets zeitgleich offen?
 
Warum machst du das nicht über eine einzige Query mit nem Join über die 3 Tabellen?

Ausserdem solltest du die DB-Schicht besser kapseln. Es ist keine gute Idee ResultSets aus dem Backend an die View weiter zureichen. Guck dir mal das DAO-Pattern an.
 
Hallo foobar,

erstmal Danke fuer Deine Antwort.
Das mit dem JOIN ist leider nicht so einfach, wie es auf den ersten BLick erscheint, da die Produkte nicht am Kunden, sondern auf gleicher Ebene wie die Kunden dem Vertrag zugeordnet sind. Aber das alles zu erklaeren wuerde etwas zu weit fuehren.

Gibt es eine Moeglichkeit, drei unterschiedliche Resultsets gleichzeitig zu benutzen, wenn ich entgegen jeder Regel, die Daten doch aus dem Backend Bereich herausgeben moechte?


Danke nochmals fuer DEine Unterstuetzung
 
Hallo nochmal,

habe mich nun mehrere Wochen ueber das CachedRowSet belesen :### u.A. bei Sun direkt.

Ich werde einfach nicht schlau daraus :autsch:

Kann mir jemand auf die Spruenge helfen?

Wie muss ich vorgehen um ein CachedRowSet zu implementieren?


Ich stehe ganz ehrlich was das Thema angeht ziemlich auf dem Schlauch. :bahnhof:

Hat evtl. jemand sogar ein kleines Beispiel fuer mich?


Vielen Dank nochmals fuer eure Unterstuetzung.
 
hi FenchelT,

für die Benutzung von CachedRowSet habe ich keine Idee.

Nur eine Anmerkung: Initialisiere doch drei Statementvariablen und weise die Ergebnisse Deine drei Abfragen den einzelnen Variablen zu. Dann verlieren die ResultSets auch den Inhalt nicht.

noch ohne benutzername
 
Hallo,

danke fuer den Vorschlag, die Idee hatte ich auch schon. Da ich die Daten aber eine ganze Zeit lang vorhalten muss und ich gelesen habe, dass man mit Statement Ressourcen sorgsam umgehen sollte, stand dies fuer mich nicht
wirklich zur Diskussion.

Habe das Ergebis nun in drei ListArrays geladen um damit weiterzuarbeiten, aber gluecklich bin ich damit auch nicht.
Ich suche immernoch nach einem Beispiel, wie CachedRowsets erzeugt und eingesetzt werden :roll:

Danke nochmals und viele Gruesse
FenchelT
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben