# SQL Statement auf Gültigkeit prüfen



## marcel_sana (24. November 2004)

Hallo,

ich soll ein Program coden, welches *.java files auf SQL Statements durchsucht und dann testet ob es die Tebellen und Spalten auch gibt, auf deutsch ob die Abfrage funktioniert.

Als erstes, gibt es sowas schon ?
Wenn nicht dann die nächsten Fragen.

1. Ein einzeilen Statement kann ich ohne Probleme auslesen, nur wie kann ich erkännen das 
es ein mehrzeiliges statement ist ?

2. Habt ihr ansatzpunkte wie ich dann das Statement auseinander nehemen kann?

Ich würde es sonnst duch die zerlegung mit Substring machen.

Für jede Idee oder anregung wäre ich dankbar, deswegen schon mal Danke für eure Mühen.

Grüße Marcel


----------



## schnuffie (29. November 2004)

Du hast schon recht, ein einzeiliges Statement ist leicht zu erkennen. Sind die Statements (z.B. wie bei mir, da ich viel mit StringBuffer + append arbeite) aber auf etliche Zeilen verteilt, bleibt nur das Verwenden von Start- und End-Marken. Bei vorhandenen Java-Dateien könntest Du allerdings nur alle Strings suchen und der Reihe nach einem StringBuffer hinzufügen. Dabei gibt's auch Probleme:
- nicht jeder String gehört zu einem Statement
- nicht jedes Statement muß ein String sein (Verwendung von Methodenparametern z.B.)

Mir ist nichts Sinnvolles aus dem Internet bekannt, was Dein Problem optimal umsetzen könnte.

Das Problem ist ziemlich schlecht so lösbar:
Ich würde die vorhandenen Java-Dateien in "mühevoller" Kleinarbeit mit den Start- und Ende-Marken versehen und neue Java-Klassen gleich so schreiben. Damit sind Start und Ende bekannt und Du kannst den Quellcode durchlaufen.

Das Problem ist komfortabler so lösbar:
Ich würde *eine* Methode schreiben, die per Methoden-Parameter das Statement übergeben bekommt - somit ist klar, was das Statement ist.

Das Testen, ob ein Statement funktioniert geht z.B. bei Oracle recht einfach:

```
desc xxxxxx
```
liefert:

```
Name									 Null?	Typ
----------------------------------------- -------- ----------------------------
KEY									 NOT NULL VARCHAR2(10)
VALUE											 VARCHAR2(100)
```
 
Somit kannst Du vor dem Ausführen prüfen, ob es eine solche Tabelle mit diesen Spalten überhaupt gibt.


----------



## marcel_sana (29. November 2004)

@schnuffie Du hast recht, es ist ein sch... Problem alle Statements im Code zu finden.
Einzeilige und Mehrzeilige sind leicht, auch der vergleich mit der Datenbank klappt.
Nur eben die mit StringBuffer.

Den Code zu durchforsten ist sehr müsählig, da ich ihn übernommen habe und es nicht bloß zwanzig Klassen sind.

Ich habe ein paar Ideen, vileicht könnte mir da jemand beim weiter denken helfen.
Ich arbeite mit JBuilder. Wenn ich nun die API anzapfe und mir im Debugmodus alle StringBuffer auf Statements durchsuche.

Geht das, kennt sich jemand aus oder weis wo ich infos zur API finde?

Oder, es gibt doch auch Tools wie PMD oder FindBugs. Kann man da sich mit reinklinken?
Haben die eine API?

Ich danke Euch ...

Ich bin für jede Idee offen, auch wenn sie noch nicht zuende gedacht ist. Danke!


----------



## schnuffie (30. November 2004)

Mit dem Debugging ist das auch nicht einfacher. Notfalls könntest Du den Text nach " durchsuchen, ob Dich das aber schneller zum Ziel bringt?

 Wie sieht's aus mit DAO-Pattern?
 Du könntest den ganzen SQL-"Quatsch" aus den Klassen entfernen und eine neue Klasse schreiben, die vielleicht im 1. Step nur eine einzige Methode besitzt: Parameter-Übergabe = ein Statement, return-Wert = ResultSet. 

 Jeden gefundenen String prüfst Du auf Statement, wenn ja, ersetzt Du das mit dem Methoden-Aufruf Deines einfachen DAOs.


----------

