# Keine Aussicht mit Prepared Statement



## Guest (30. Mai 2007)

Hallöchen.

nachdem ich mich nun 4 Stunden zu tode gesucht habe, habe ich beschlossen nun zu fragen:

Ich habe eine Klasse die mir die Verbindung zu meiner Datenbank herstellt.
Diese instanziere ich bei bedarf und übergeben mein SQL Statement als String.

Nun habe ich dieses Hochkommaproblem. Wenn Texte aus einem Formularfeld ' oder " enthalten, gibt es
einen Fehler. Als Lösungsvoschlag habe ich hier dieses PreparedStatement gefunden.

Wie aber implementiere ich das? Also wie übergebe ich dieses Statement an die Klasse der Datenbankverbindung?
Hier habe ich meist nur Beispiele gefunden, in denen das PRepared Statement direkt in der Verbindungsklasse implementiert ist.

Das geht aber bei mir nicht, da ich der Klasse DB Verbindung verschiedene Statemenst übergebe und damit das setString nicht in der Verbindungsklasse verwenden kann oder? Weil ich doch jedes mal was anderes übertrage.

Ich kapier es einfach nicht. Könnt ihr mir bitte helfen?

Danke!


----------



## SlaterB (30. Mai 2007)

was du da machst ist schleierhaft

> da ich der Klasse DB Verbindung verschiedene Statemenst übergebe und damit das setString nicht in der Verbindungsklasse verwenden kann 

kann alles mögliche bedeuten, 
es gibt tausende Wege wie es funktioniert, und noch viel mehr wie es nicht nicht funktioniert,

eine Standardoperation sieht so aus:

```
public xy sucheBestimmtestDing(String parameter) {

   PreparedStament erzeugen mit festen SQL-String,
   Parameter einfügen
   Ergebnisse verarbeiten
}
```

etwas allgemeiner gerne auch


```
public xy sucheIrgendwas(String sql, List<String> parameter) {

   PreparedStament erzeugen mit Parameter SQL,
   alle vorhanden Parameter einfügen 
   // Aufrufer muss aufpassen, dass Anzahl stimmt
   Ergebnisse verarbeiten
}
```

keinerlei Probleme zu sehen


----------



## Guest (30. Mai 2007)

Hallo Slater alter Freund :wink: 

Etwas konkreter. Hier die Klasse der ich ein SQL Statement übergebe:

```
public class DbVerbindungAccess {

	// Datenbank modifizieren
	public void dbUpdate(String statement) {

		try {

			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			Connection conn = DriverManager
					.getConnection("jdbc:odbc:Sternverzeichnis");
			Statement stmt = conn.createStatement();
			stmt.executeUpdate(statement);
			stmt.close();
			conn.close();

		} catch (SQLException sqle) {
			System.out.println("Verbindung ist fehlgeschlagen: "
					+ sqle.getMessage());
		}

		catch (ClassNotFoundException cnfe) {
			System.out.println("Treiber kann nicht geladen werden:"
					+ cnfe.getMessage());
		}

	}

}
```

Die Methode dbUpdate erwartet also ein SQL Statement vom Typ String. Ich übergebe dieser Methode die verschiedensten SQL Statements. Nun ist bei mir dieses Hochkommaproblem aufgetreten, welches ich mit einem
Prepared Statement lösen wollte. Wie aber implementiere ich dieses nun? Meiner Auffasung nach müsste ich
es doch in dieser Klasse einbauen, was aber in meinem Fall nicht geht, da es ja verschiedene SQL Statements sind.
Ich fülle doch mit setString die "?" eines PreparedStatement mit inhalt. Da der Inhalt bzw. die Form des Statements immer verschieden ist, weil es ja immer unterschiedliche SQL Statements sind kann ich doch das PreparedStatement nicht an dieser Stelle implementieren?


----------



## SlaterB (30. Mai 2007)

das beste wäre, wenn du generell alle Anfragen auf PreparedStatement umstellst 

ansonsten brauchst du eine zweite Operation

public void dbUpdatePrepared(String statement, List<String> parameter) { 
}

wie oben beschrieben,


man kann da einiges tricksen, um nicht zuviel doppelt zu schreiben,
z.B. eine Operation getConnection(),
und der du 

  catch (ClassNotFoundException cnfe) { 
         System.out.println("Treiber kann nicht geladen werden:" 
               + cnfe.getMessage()); 
      } 

schreiben kannst (und NIRGENDWO sonst im Programm)


anderes wie das 

} catch (SQLException sqle) { 
         System.out.println("Verbindung ist fehlgeschlagen: " 
               + sqle.getMessage()); 
      } 

läßt sich mit einfachen Mitteln vielleicht nicht überall vermeiden, ist aber ok


----------



## Guest (30. Mai 2007)

Hallo Slater,

also irgendwie habe ich das nicht verstanden :cry: 

Hier ein Beispiel wie ich eine Anfrage an die oben gezeigte DB Verbindungsklasse sende:


```
package Datenbank;

import Entities.EnGesamtbestelldetails;

public class DbGesamtbestelldetails {

	public void gesamtbestelldetailsEintragen(EnGesamtbestelldetails detailDaten) {
			
		int auftragsnummer = detailDaten.getAuftragsnummer();
		String lVorname  = detailDaten.getLVorname();
		String lNachname  = detailDaten.getLNachname();
		String lStrasse = detailDaten.getLStrasse();
		int lPlz = detailDaten.getLPlz();
		String lOrt = detailDaten.getLOrt();
		String lLand = detailDaten.getLLand();
		int artikelNummer = detailDaten.getArtikelNummer();
		
		
		String statement = "INSERT INTO Bestelldetails (Auftragsnummer, LVorname, LNachname, LStrasse, LPlz,     Lort, LLand, Artikelnummer) VALUES ('"
				
				+ auftragsnummer
				+ "','"
				+ lFirma
				+ "','"
				+ lVorname
				+ "','"
				+ lNachname
				+ "','"
				+ lStrasse
				+ "','"
				+ lPlz
				+ "','"
				+ lOrt
				+ "','"
				+ lLand
				+ "','"
				+ artikelNummer
				+ "')";

		DbVerbindungAccess kundendatenEintragen = new DbVerbindungAccess();
		kundendatenEintragen.dbUpdate(statement);

	}
	
}
```

Die einzelnen Inhalte lese ich aus einer Arraylist und weise sie einer Variablen zu, die ich wiederum an das String Statement übergebe. Was muss ich nun tun, um aus diesem Statement ein prepared Statement zu machen, welches mir auch problemlos hochkommas in die DB einträgt, wenn ich es an die Klasse mit der DAtenbankverbindung sende?


----------



## SlaterB (30. Mai 2007)

so nun nicht, PreparedStatement allgemein lernt man mit Lehrbüchern, nicht mit Slater


----------



## Guest (30. Mai 2007)

Hallo Slater,

so war es wirklich nicht gemeint. Ich habe hier das JavaBuch,
dann noch das Open Book Java.....Insel,
dann dieses Forum,
dann noch eine SQL Referenz,
und zu gute letzt noch ein recht mageres Skript aus der Uni.

Ich sitzt nun schon den ganzen Nachmittag an diesem Problem. Ich hab wirklich schon
tausendman reingeschaut (EHRENWORT) und versteh es einfach nicht


----------



## SlaterB (30. Mai 2007)

nix verstehen ist kein Argument,
ich kann ohne ein Zucken mein Leben weiterleben ohne dass du das je kapierst 

je mehr du dich auf die 'ich mach gar nix'-Schiene abkapselst, 
desto weniger Sinn sehe ich darin, hier überhaupt noch zu antworten,

also: in jedem Lehrbuch gibts lange Kapitel dazu
http://www.galileocomputing.de/open...20_010.htm#mjb00e1bc95eda8d4f8bb3a64db6528aea

im Grunde kann man aber eigentlich nicht mehr dazu sagen als in kurzen Beispielen steht:
PreparedStatement updateLieferant = con.prepareStatement( 
  "UPDATE Lieferanten SET Adresse = ? WHERE Adresse LIKE ?" ); 
updateLieferant.setString( 1, "Uferstraße 80" ); 
updateLieferant.setString( 2, "Uferstrasse 78" ); 
updateLieferant.executeUpdate();

so gehts und mehr ist da fast nicht zu sagen, selbst wenn ich wollte 

--------

formuliere in deutscher Sprache, WAS du daran nicht verstehst,
dann könnte man Korrekturen versuchen


----------



## Guest (30. Mai 2007)

Hi Slater,

habe es mittlerweile hinbekommen  
Hab im Internet eine ganz gute Erklärung gefunden.

"Ich will nix verstehen" gibt es bei mir nicht bzw. geht auch nicht da ich meine Uni noch fertig machen muss.
Ist ja nur noch dieses Semester   

Manchmal steht man auf dem Schlauch und braucht einen Schupser...
Bin in Java noch ein blutiger Anfänger und deswegen für jeden Tip dankbar!

Nochmals Danke für Die Antworten!

Viele Grüße


----------



## Guest (31. Mai 2007)

jetzt hab ich wieder einen Fehler gefunden... :x 

Mein preparedStatement funktioniert.
Allerdings, wenn ich ein Hochkomma setze, wird es nicht mit in die DB geschrieben.
Setze ich zwei Stück vor z.B. einen Namen, wird eins übertragen.

Was läuft hier falsch?


----------



## SlaterB (31. Mai 2007)

Beispiel?
aber ich kann es derzeit eh nicht ausprobieren, 

neuer Thread vielleicht erfolgsversprechender


----------

