# Tabelleninhalt als Objekt zurückgeben



## fenerli23 (18. Dezember 2007)

Hi, 

habe folgendes Problem soll den Inhalt einer tabelle z.B. "select last_name, first_name, geb_date from employees where employee_id = ?" ausgeben können als java Objekt..

Wie muss ich ncoh meine Methode getPerson füllen damit ich das als Java Objekt "retun" kann, DANKE FÜR EURE HILFE

Habe nun folgendes gemacht:
das Hauptproblem die Mehtode zum eingeben der Employee_id:

```
public Person getPerson(int Id) {
		Person person = null;
		//TODO
		
		Connection conn = null;
		ResultSet  rs   = null;
		PreparedStatement  stmt = null;
		
		String Sql = "Select last_name, first_name, geb_id from employees where employee_id = ?"; 
		try
		{
			Class.forName(DbDrv);
			conn = DriverManager.getConnection( DbUrl, User, Pwd );
			stmt = conn.prepareStatement(Sql);
			stmt.setInt(1, Id);
			
			rs = stmt.executeQuery();
		}catch (Exception ex) {
			ex.printStackTrace();
		}
		
		
		return person;
	
	}
```


----------



## fenerli23 (19. Dezember 2007)

hi,
habe die Methode Person soweit erstellt:
Nun wenn ich das ganze ausführe wird dies hier angezeigt, anstatt der Inhalt der Tabelle stimmt die erstellte Methode nicht?!


```
meinpackage.SqlParamStub$Person@29e357
```

Methode Person:

```
public Person getPerson(long Id) {
		Person person = null;

	
		String Sql = "Select last_name, first_name, geb_id from employees where employee_id = ?"; 
		try
		{
			Class.forName(DbDrv);
			conn = DriverManager.getConnection( DbUrl, User, Pwd );
			stmt = conn.prepareStatement(Sql);
			stmt.setLong(1, Id);
			
			rs = stmt.executeQuery();

			if(rs.next()){ 
			  person = new Person(); 
			  person.setNachname(rs.getString("last_name")); 
			  person.setVorname(rs.getString("first_name")); 
			  person.setGebDatum(rs.getDate("geb_id")); 
			} 
			
			rs.close(); 
			stmt.close(); 
			conn.close();
			

		}catch (Exception ex) {
			ex.printStackTrace();
		}
		
		
		return person;
	
	}
```


----------



## Andron (19. Dezember 2007)

Wo gibst du das aus?
Kannst das auch posten?


----------



## fenerli23 (19. Dezember 2007)

Ich gebe das als Client aus etwa so: Das stimmt doch soweit oder habe ich etwas falsch programmiert?!


```
public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader in = new BufferedReader
			(new InputStreamReader (System.in));
		
		try {
			TestStub stub = new TestStub();
			TestStub.GetPerson request = new TestStub.GetPerson();
			TestStub.GetPersonResponse resp = null;
			
			String s_id = "";
			System.out.println("Eingabe der Employee_id: ");
			s_id = in.readLine();
			
			long id = Long.valueOf(s_id);
			
			request.setId(id);
			
			resp = stub.getPerson(request);
			
			System.out.println(resp.get_return());
			
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
```


----------



## lernen.2007 (19. Dezember 2007)

Hallo,


wie ist wenn du direkt auf Methode getPerson() zugreifst?

Gruß
lernen.2007


----------



## fenerli23 (19. Dezember 2007)

Ich habe doch direkt auf die methode getPerson() zugegriffen damit die Ausgabe erfolgen kann...

```
resp = stub.getPerson(request);
```


----------



## Andron (19. Dezember 2007)

resp = stub.getPerson(request);
System.out.println(resp.get_return());

Wenn ich das richtig verstehe, versuchst du das Objekt selbst auszugeben. Das wird natürlich nicht gehen.


----------



## Andron (19. Dezember 2007)

versuch mal folgendes:

```
System.out.println(stub.getPerson(request).getName());
```


----------



## fenerli23 (19. Dezember 2007)

Die ausgabe klappt nun habe das so gemacht:

```
System.out.println(resp.get_return().getNachname() + " " + resp.get_return().getVorname() 
					+ " " + resp.get_return().getGebDatum());
```

Nur wird das datum nicht ausgegebn dafür steht das hier:

```
java.util.GregorianCalendar[time=156034800000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=1974,MONTH=11,WEEK_OF_YEAR=50,WEEK_OF_MONTH=2,DAY_OF_MONTH=12,DAY_OF_YEAR=346,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=3600000,DST_OFFSET=0]
```


----------



## Tobias Köhler (19. Dezember 2007)

Du hast das Datum wahrscheinlich noch nicht formatiert.


----------



## fenerli23 (19. Dezember 2007)

hab das mit dem datum hinbekommen...
wie könnte ich nun die Spaltennamen ausgeben mit ResultSetMetaData oder?


----------



## fenerli23 (19. Dezember 2007)

wenn ich eine Ausgabe mit mehreren Tabelleninhalten hätte z.B. drei Nachname, drei Vornamen und drei geburtsdaten könnte dies dann immer noch so funktionieren oder müsste ich was dazufügen?!


----------



## fenerli23 (19. Dezember 2007)

hat sich erledigt


----------



## Andron (19. Dezember 2007)

Dein "resp" ist immer null.


----------



## fenerli23 (19. Dezember 2007)

genau ist immer null vorher wo ich nur einen Spaleninhalt hatte war das ok da habe ich einfach dies so aufgerufen..


```
System.out.println(resp.get_return().getNachname()+ " " + resp.get_return().getVorname());
```

Hast du eine Idee wie ich die Liste auf der Clientseite darstellen kann?


----------



## Andron (19. Dezember 2007)

Ich glaube, du hast da was vergessen:

resp = stub.getPerson(request);

oder irre ich mich?


----------



## fenerli23 (21. Dezember 2007)

Andron hat gesagt.:


> Ich glaube, du hast da was vergessen:
> 
> resp = stub.getPerson(request);
> 
> oder irre ich mich?



Ja das hatte ich vergessen, habe das mit hineinbezogen funktioniert irgendwie immer noch nicht so ganz

er gibt nun dies hier aus:

```
[Lmeinpackage.TestStub$Person;@e95a56
```

hast du eine Idee wie ich das Realiseren könnte...?


----------



## Andron (21. Dezember 2007)

Diese Ausgabe bedeutet, dass du ein Objekt auszugeben versuchst. 
Poste bitte deinen Code vom Client.


----------



## fenerli23 (21. Dezember 2007)

Andron hat gesagt.:


> Diese Ausgabe bedeutet, dass du ein Objekt auszugeben versuchst.
> Poste bitte deinen Code vom Client.



Hier der Client den ich erstellt habe, müsste doch soweit stimmen oder?

```
public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader in = new BufferedReader
			(new InputStreamReader(System.in));
		
		try {
			TestStub stub = new TestStub();
			TestStub.ListPersonen request = new TestStub.ListPersonen();
			TestStub.ListPersonenResponse resp = null;
			

			
			String statement = "";
			System.out.println("Eingabe des gewünschten Statements: ");
			statement = in.readLine();
			request.setStatement(statement);
			
			String s_id = "";
			System.out.println("Eingabe des ersten Parameter: ");
			s_id = in.readLine();
			int id = Integer.valueOf(s_id);
			request.setId(id);
			
			String s_ids = "";
			System.out.println("Eingabe des zweiten Parameter: ");
			s_ids = in.readLine();
			int ids = Integer.valueOf(s_ids);
			request.setIds(ids);
			
			resp = stub.listPersonen(request);
			System.out.println(resp.get_return());
			
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

	}
```


----------



## Andron (21. Dezember 2007)

Sehe auf der vorherigen Seite.
Das 

```
resp.get_return();
```
liefert dir ein Objekt vom Typ Person, nehme ich an.
Wenn du an die Attribute des Objekts kommen willst, muss du die entsprechende Methoden aufrufen

```
System.out.println(resp.get_return().getName());
```


----------



## fenerli23 (21. Dezember 2007)

Andron hat gesagt.:


> Sehe auf der vorherigen Seite.
> Das
> 
> ```
> ...



ja das Problem ist, ich will ja mehrere Daten ausgeben Dass ich nach der Eingabe von "resp.get_return()" nichts mehr dem Spezifisch anhängen kann habe das schon versucht ...;(


----------



## Andron (21. Dezember 2007)

Welche Methoden kannst du denn nach resp.get_return() aufrufen?
Was liefert die denn die Methode get_return()?
Arbeitest du mit Eclipse?


----------



## fenerli23 (21. Dezember 2007)

Als Methoden die direkt mit meinem Code zusammenstehen, kann ich folgende aufrufen:

clone() Person[] - Person
lentht int - TestStub.Person[]

Die Methode get_return(), gibt mir dies aus:

```
[Lmeinpackage.TestStub$Person;@e95a56
```

Ja genau ich arbeite mit Eclipse ...


----------



## Andron (21. Dezember 2007)

Ich meinte nicht die Ausgabe auf der Konsole.
Wenn du in Eclipse mit der Maus über die Methode "fährst", erscheint ein kleines Fenster. Was steht da?

Versuch mal so:

```
resp.get_return()[0].getNachname();
```


----------



## fenerli23 (21. Dezember 2007)

Wenn ich da drüber gehe ist folgendes zu sehen...

```
Auto generated getter method 

Returns:
Person[]
```

Wenn ich das nun so ausführe wie du es sagst, dann stehen die Methoden Nachname, .. etc zur Verfügung, jedoch tritt folgender fehler auf: 

```
Exception in thread "main" java.lang.NullPointerException
	at meinpackage.Client.main(Client.java:46)
```


----------



## Andron (21. Dezember 2007)

Also resp.get_return() gibt die ein Array vom Typ Personen zurück.
Das haben wir schon geklärt .

Ich nehme an, er kann dir keinen Nachnamen ausgeben, weil das Array leer ist.

Versuch mal so:

```
System.out.println(resp.get_return().length);
```


----------



## fenerli23 (21. Dezember 2007)

Mmh das könnte sein, habe das mal so ausprobiert wie du das vorgeschlagen hast, als Ausgabe wird die gleiche fehlermeldung wieder ausgegeben ..

Stimmt den meine Methode nicht die ich erstellt habe?!


----------



## Andron (21. Dezember 2007)

Die Methode listPersonen stimmt nicht so ganz.
Du hast da ein Array und eine ArrayList, die jedoch nicht benutzt wird.

Das Array pArr wird zwar auf die Größe gesetzt, jedoch nicht gefüllt.
Du läufts in der Schleife durch das ResultSet und erzeugst dir Personen. Dann ist die Schleife zuende und du erzeugst dir ein Array mit einer Größe, die der erg.size() entspricht. Die Größe von erg ist aber zu dem Zeitpunkt undefiniert.

Änder diese Methode so, dass sie dir eine ArrayList zurückgibt.
In der while-Schleife am Ende machst du dann erg.add(person).

Wenn du aber so haben willst, wie bisjetzt, musst du noch eine Schleife einbauen und in dieser über die Elemente von erg iterieren und dein Array füllen.


----------



## fenerli23 (21. Dezember 2007)

ok, hab das jetzt hinbekommen danke für deine Hilfe nun kann der Client die Daten anzeigen...

Was ich nochmal Nachfragen wollte, man könnte doch noch eine Methode definieren, die die Inhalte der Spalten untereinander ausgibt?!

etwa so:
Müller      Heinz
Hermann  Marc

zur Zeit ist die ausgabe so:
Müller  Heinz
Hermann  Marc


----------



## Andron (21. Dezember 2007)

fenerli23 hat gesagt.:


> ok, hab das jetzt hinbekommen danke für deine Hilfe nun kann der Client die Daten anzeigen...
> 
> Was ich nochmal Nachfragen wollte, man könnte doch noch eine Methode definieren, die die Inhalte der Spalten untereinander ausgibt?!
> 
> ...



Sehe ehrlich gesagt, keinen Unterschied.


----------



## MiMi (21. Dezember 2007)

Er will wohl das die Nachnamen direkt untereinander stehen und die Vornamen auch. Also muesste nach dem Mueller erstma ne Reihe Leerzeichen oder aehnliches kommen. Damit das Heinz auf der gleichen Hoehe beginnt wie Marc.

So hab ich es verstanden.


----------



## fenerli23 (21. Dezember 2007)

ja genau die sollen alle unternander folgen:
zur Zeit ist es so
	
	
	



```
Müller  Heinz
Hermanns  Dieter

würde es gerne so haben:
Müller    Heinz
Hermanns  Dieter
```


----------



## fenerli23 (27. Dezember 2007)

Hat jemand eine Idee wie ich das realisieren kann damit die Ausgabe schön untereinander erfolgt?!




fenerli23 hat gesagt.:


> ja genau die sollen alle unternander folgen:
> zur Zeit ist es so
> 
> 
> ...


----------



## MiMi (27. Dezember 2007)

Es gibt ne Klasse Formatter in Java. Such mal danach. 
Vielleicht hilft dir das weiter (google Suche: java String Formatter text ausrichten):
http://www.rgagnon.com/javadetails/java-0463.html


----------



## fenerli23 (27. Dezember 2007)

MiMi hat gesagt.:


> Es gibt ne Klasse Formatter in Java. Such mal danach.
> Vielleicht hilft dir das weiter (google Suche: java String Formatter text ausrichten):
> http://www.rgagnon.com/javadetails/java-0463.html



dank dir, hat nun geklappt jetzt steht alles schön untereinander...


----------



## fenerli23 (9. Januar 2008)

nun würde ich gerne die Ausgabe der Spaltennamen realisieren habe dazu in der Methode dies hier mit hinein implementiert. Das System.out.println, dient zur Kontrolle ... Nur kann ich das im Client nicht ausführen lassen...

Könntet ihr mal bitte drüber schauen und eventuell helfen...?

für die Spaltennamen...

```
ResultSetMetaData md = 	rs.getMetaData();
			Column[] columns = new Column[md.getColumnCount()];
			System.out.println("Count: " + md.getColumnCount());
			for (int i=1; i<=md.getColumnCount();i++) {
				columns[i-1]= new Column();
				columns[i-1].setName(md.getColumnName(i));
				
				System.out.println("Column(" + i + "): " + columns[i-1].getName());
			}
			person = new Person();
			person.setColumns(columns);
```

im Client dazugefügt:

```
for (int i=0; i<3;i++){
				System.out.println(resp.get_return().getColumns()[i]);
			}
```


----------



## fenerli23 (10. Januar 2008)

Hi,
wenn ich nun den Client teste kommt leider diese Fehlermeldung...
obwohl sich in der Columns[] etwas befindet.. da ich das vorher so teste in meinem Webservice 

```
System.out.println("Column(" + i + "): " + person.getColumns()[i-1]);
```

und wenn ich im Client dies so aufrufe wie auch sonst ... entsteht eine Fehlermeldung...

```
System.out.println(resp.get_return().getColumns()[1];)
```

Fehlermeldung

```
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
	at meinpackage.ClientPerson.main(ClientPerson.java:38)
```


----------

