# Split String für SQl query



## Chriss_07 (11. Jun 2010)

Ich bekomme eine String soweit schon aufgesplittet, das mir die einzelnen Werte angezeigt werden

```
String[] split = ((String) tour).split("\\,");
	for(int i = 0, length = split.length;i < length; i++){
		System.out.println(split[i]);
```

Nun möchte ich diese aber für ein 
	
	
	
	





```
insert into table
```
 verwenden und sie dabei richtig sortiert dem _Table _übergeben.

Insgesamt werden so 9 Values der DB zugeführt, 5 aus dem String und 4 über 
	
	
	
	





```
...'" + value.getTest1 + "' ........
```
 So könnte ich den SQL String aufbauen um dem Aufbau der DB gerecht zu werden, d.h ich versuche nun via _Getter _und_ Setter _auf die einzelnen Stringelemente zuzugreifen bisher aber ohne Erfolg.

```
split[0] =  getString(0);
		split[1] =  getString(1);
```
Aber ich komm da nicht weiter und suche mir in Foren einen Wolf, denn zum Thema _split String 
_ gibt es ne Menge. 

Hat jeamnd eine guten Tipp für mich?
Gruß Chriss


----------



## gman (11. Jun 2010)

> d.h ich versuche nun via Getter und Setter auf die einzelnen Stringelemente zuzugreifen



Getter und Setter wovon? Du hast doch jetzt alle Bestandteile in dem Stringarray "split"
oder habe ich da was falsch verstanden? Damit kannst du dir doch einen anderen
String zusammenbauen:


```
...'" + value.getTest1 + "'" + split[0] + "' .....
```


----------



## Chriss_07 (11. Jun 2010)

gman hat gesagt.:


> Damit kannst du dir doch einen anderen
> String zusammenbauen:
> 
> 
> ...


Ja aber wie übergebe ich das einer anderen Klasse? 
Hatte ich nicht erwähnt - aber da steh ich auf dem Schlauch:bahnhof:

Edit: Also den _split[0]_ usw aus einer Klasse in die Klasse mit dem SQL String


----------



## gman (11. Jun 2010)

Mach doch aus "split" eine Instanzvariable mit Getter/Setter-Methoden in der Klasse A 
und ruf diese aus Klasse B auf. Natürlich musst du in Klasse B ein Objekt von A erzeugen
oder irgendwie eine Referenz auf ein bestehendes Objekt erhalten. Wie du das machst,
hängt davon ab wie die beiden Klassen zusammenhängen.


----------



## Chriss_07 (11. Jun 2010)

Joa so hatte ich mir das gedacht, mit

```
private String[] split;
```
die Instanz erstellt
und

```
public void setTour(Object tour) {
		this.tour = tour;
	
	String[] split = ((String) tour).split("\\,");
	for(int i = 0, length = split.length;i < length; i++){
		System.out.println(split[i]);;
```
 zerlegt den String _Tour_
mit 
	
	
	
	





```
public Object getTour() {
		return tour;
		
	}
```
 gebe ich ihn zurück, komme da aber nicht ran
Also 

Getter Setter für den Split
	
	
	
	





```
public void setSplit(String split[]){
		this.split = split;
	}
	public String[] getSplit(){
		return split;
	}
```
Dann bekomme ich 'null'!


----------



## gman (11. Jun 2010)

Du musst dann auch die Instanzvariable "split" setzen. Du legst jetzt ja eine neue 
(lokale) Variable an:


```
String[] split = ((String) tour).split("\\,");
```

Lass einfach das "String[]" weg, dann sollte es laufen.


----------



## Chriss_07 (12. Jun 2010)

Ja das ist wohl wahr.
Mit der Instanzvariabel und einem Getter
	
	
	
	





```
'" + tour.getSplit() + "'
```
bekomme ich 
	
	
	
	





```
[Ljava.lang.String;@c3c749
```
. Selbst wenn, könnte ich nicht die einzelnen Werte im String übergeben, sondern nur den ganzen Stringinhalt.
Setzte ich statt 
	
	
	
	





```
'" + tour.getSplit() + "'
```


```
'" + split[0] + "'
```
 kann ich es nicht kompilieren - _split _muss eine lokale Variable sein.
Also der String setzt sich aus einer DB Abfrage zusammen. Dort sind viele Rows, die als String in einer ComboBox angezeigt werden. Der nun selektierte String soll in eine andere DB geschrieben werden. 
Die Klasse mit der ComboBox wird von einem Container verwaltet ( getter und setter ), da auch andere Formularfelder Werte beisteuern( 5 im String - 4 weitere Formularfelder). Hier soll der String für den letzten SQL insert vorbereitet werden, da die Werte im String falsch sortiert sind. Das lässt sich auch nicht ändern, da bestimmte Werte im String in der CB an erster Stelle stehen sollen, später aber in der DB an anderer Stelle. Somit muss der String zerlegt werden und einzeln zugreifbar sein ( geht nicht). 
Was mich wundert ist, wenn ich ein _system.out_ ranhänge, bekomme ich die einzelnen Werte angezeigt. Nur darauf zugreifen kann ich nicht.

-Als Vector fülle ich die CB mit den Strings.
- der Container erbt das Object 
	
	
	
	





```
private Object tour;
```

Damit komme ich recht schnell klar - nur die weitere Verarbeitung scheitert. Ich probier das noch mal mit einem Array, vllt fällt dir aber noch was wichtiges ein, was ich übersehen habe.
Ich denke mal es ist der Vector, den ich zum String zerlegen will.


----------



## gman (12. Jun 2010)

"getSplit()" liefert dir ja ein Stringarray zurück, daher die komische Ausgabe. Um auf die
einzelnen Elemente zuzugreifen kannst du einfach sowas machen:


```
'" + tour.getSplit()[0] + "'
```

oder du speicherst das Stringarray in Klasse B auch wieder in einer Instanzvariablen und
weist ihr den Rückgabewert von "getSplit()" zu.


----------



## Gast2 (12. Jun 2010)

Chriss_07 hat gesagt.:


> Ich probier das noch mal mit einem Array, vllt fällt dir aber noch was wichtiges ein, was ich übersehen habe.



Du solltest PreparedStatements verwenden und nicht die Queries als String zusammen konkatenieren - und hast auch keine Probleme mit dem Escaping

Das dein Code nicht geht ist klar:


```
'" + tour.getSplit() + "'
```

Das kann nicht gehn, da die Rückgabe von tour.getSplit ein Array ist, also wird dann einfach toString aufgerufen. Du müsstest nehmen:

```
'" + tour.getSplit()[0] + "'
```


Oder aber:

```
String[] split = tour.getSplit();
'" + split[0] + "'
```

//EDIT: zu langsam


----------



## Chriss_07 (12. Jun 2010)

fassy hat gesagt.:


> Du solltest PreparedStatements verwenden



Das habe ich jetzt schon öfters gehört:autsch:




fassy hat gesagt.:


> Das kann nicht gehn, da die Rückgabe von tour.getSplit ein Array ist, also wird dann einfach toString aufgerufen. Du müsstest nehmen:
> 
> ```
> '" + tour.getSplit()[0] + "'
> ```



Jupp so geht's - Danke euch beiden.
Nu habe ich nur noch ein 
	
	
	
	





```
datatype mismatch
```
. 
Wahrscheinlich sind einige Felder leer ( ,'  ', ) oder null ( , 'null', ). Aber sollte das der Datenbank nicht egal sein? Die Felder sind vom Typ TEXT bzw. NUMERIC

EDIT:


```
datatype mismatch
```
 kommt auch wenn alle Felder ausgefüllt sind

EDIT EDIT:

Habs gefunden - ein Feld war als PRIMARY KEY deklariert, das sollte aber TEXT sein.
Nun stimmts. :toll:


----------



## Gast2 (12. Jun 2010)

Chriss_07 hat gesagt.:


> Habs gefunden - ein Feld war als PRIMARY KEY deklariert, das sollte aber TEXT sein.



Erm - das eine hat nichts mit dem anderen zu tun. PRIMARY KEY ist der Constraint/Index auf der Spalte - TEXT defniert den Datentyp. Natürlich kann eine Spalte vom typ TEXT und gleichzeitig ein PRIMARY KEY auf der Spalte gesetzt sein.

ABER: PRIMARY KEY erzwingt das alle Werte unterschiedlich und nicht NULL sein müssen - sonst würde eine Primärschlüssel auch wenig Sinn machen.

Wenn deine Lösung da drin besteht den PRIMARY KEY zu droppen damit du NULL oder Leerstrings in die Spalte inserten kannst hast du soeben dein Datenmodel in die Mülltonne geworfen


----------

