# ausgelesene SQL-Statements ausführen



## chillor (19. Okt 2010)

Hallo,

ich habe zwei funktionierende Klassen und möchte nun die eingelesenen SQL-Statements aus einer Text-Datei (siehe Klasse->DateiEinlesen) ausführen. Die Klasse DB ist für die Datenbankanbindug zuständig. Nun sollen die Statements aus der Klasse "DateiEinlesen" in die Klasse "DB" überführt werden, um dort diese auszuführen. 
Wie könnte der Quellcode aussehen, um meine Problematik zu lösen? 


```
public class DateiEinlesen {

    public static void main(String[] args) throws Exception {

        //Variable deklarieren
        String statement;

        //Ort der Datei
        File file = new File("c:/x/SQL_Statements.txt");

        //Zeilenweise auslesen
        BufferedReader br = new BufferedReader(new FileReader(file));
   
        while ((statement = br.readLine()) != null) {
            System.out.println(statement);
        }

        br.close();

    }
}
```



```
public class DB {

    public static void main (String[] args) throws SQLException {
        try {
            DB db = new DB("x");
            ResultSet rs = db.query("//hier soll das erste ausgelesene Statement hin");

            rs.first();
            System.out.println("aktualisiert = "+rs.getInt("aktualisiert"));
            rs.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
        
        try {
            DB db = new DB("x");
            ResultSet rs = db.query("//hier soll das zweite ausgelesene Statement hin");

            rs.first();
            System.out.println("neu = "+rs.getInt("neu"));
            rs.close();
        } catch(Exception e) {
            e.printStackTrace();
        }



    }
```


----------



## ARadauer (19. Okt 2010)

Die main Methode ist der Einstiegs Punkt zum Starten eines Progammes. Es macht wenig sind in einem Programm zwei main Methoden zu haben...

Mach eine Klasse die die Funktionalität besitzt die Textdatei einzulesen und die zeilen als ArrayList zurück zu geben.
Mach eine Klasse die die Funktionalität besitzt eine Liste mit Strings entegenzunehemn und diese als Query auszufürhen.

Mach eine Klasse mit der Main methoden die die anderen beiden Klassen benutzt um die Queries zu lesen und auszuführen...


----------



## timbeau (19. Okt 2010)

Sobald du dann die beiden Klassen instanziierst kannst du alle Methoden dieser Klasse nutzen und dort dann die SQl-Parameter übergeben.


----------



## chillor (20. Okt 2010)

Hallo, 

ich habe nun das Ganze umgesetzt, wie oben beschrieben. Da aber mehrere Statements ausgelesen werden, müssen diese separiert werden. Wie teile ich die ausgelesenen Statements aus der Text-Datei so, dass ich mehrer querys abschicken kann? 

Danke im Vorraus.


----------



## SlaterB (20. Okt 2010)

auf korrekte Weise,
wenn jede Zeile ein Statement ist, dann Zeilenumbruch,
sonst nach ; suchen oder komplizierter nach neuen SELECT usw.

überlege wie du es selber mit Kopf und Schere, Papier und Bleistift machen würdest, nichts anderes soll das Programm machen


----------



## chillor (21. Okt 2010)

Hallo, 

dass Programm wird doch jetzt etwas komplexer. 
Der Ablauf könnte wie folgt aussehen: 
-Start (per Task ausführbar)
-Nutzer wählt SQL-Statements?
 - nein->Stop->Liste anzeigen mit Statements

 - ja->Anfang & Enddatum definieren? 
          nein->Standartwerte für Statements setzen
          ja->Eingabe der Daten
- ausführen der Statements
-Ergebnisse werden standardmäßig als Textdatei abgespeichert

Hat jemand eventuell sowas schon programmiert? Würde mich über Quellcode freuen! 

Danke im Vorraus.


----------



## ARadauer (21. Okt 2010)

> Hat jemand eventuell sowas schon programmiert? Würde mich über Quellcode freuen!


nicht dein ernst oder? Wir helfen natürlich gerne! Aber deine Arbeit erledigt dir hier keiner!


----------



## chillor (21. Okt 2010)

Hätte ja sein können, dass jemand hier im Forum sowas ähnliches schon progrmmiert hat.


----------



## timbeau (21. Okt 2010)

Wo sind denn die einzelnen Probleme? 

Die Variablen einzulesen ist ja kein großes Problem wobei man natürlich die üblichen Fehler abfangen muss. Dann musst du die SQL-Queries laden und diese enthalten dann eben schon die vorgefertigten Variablen. 

Diese werden dann auf die DB losgelassen und die Ergebnisse per Filewriter o.ä. gespeichert.


----------



## chillor (22. Okt 2010)

Hallo, 

da ich noch ein Anfänger bin, habe ich Schwierigkeiten eine Main zu den zwei Klassen "DateiEinlesen" und "DB" (siehe oben) passend zu erstellen. In der Main muss ja das eingelesene Statement  der Klasse "DB" übergeben und ausgeführt werden. Ich habe leider keinen Plan wie ich die Main erstellen muss, um dan ein Ergebniss der Abfrage zu erhalten. Könntet ihr mir da weiterhelfen?

Danke im Vorraus.


----------



## ARadauer (22. Okt 2010)

Nein, sorry das sind absolute Grundlagen... entweder du beschäftgst dich damit und ließt dich mal in die grundlagen ein, 1-7 Kapitel im Java insel Buch oder du bezahlst dafür...


----------



## nrg (22. Okt 2010)

ich würde da eine ConnectionWrapper schreiben, die erstmal deine Datenbank anhand von Properties initialisiert. Dann dort Funktionen anbieten, wie z.B.

public void executeStatement(String statement)...

public ResultSet executeQuery(String query)....

dort führst du dann einfach deine Statements bzw. Querys aus.

Dann nimmst du ne ScriptEngine (z.B. Rhino JS) und übergibts dieser deine Instanz von der connection:

deineEngine.put("meineConnection", deinConnectionsObjekt);

Jetzt kannst du in properties o.ä. Statements definieren:

meineConnection.executeStatement(deinStatement);

Somit bist du komplett variabel, kannst der Engine noch weitere Variablen übergeben, die dann alle in deinem Statement verwendbar sind und dir steht zudem die komplette JavaScript API zur Verfügung.


----------



## chillor (22. Okt 2010)

Danke für die Hilfe!


----------



## ARadauer (22. Okt 2010)

> Dann nimmst du ne ScriptEngine (z.B. Rhino JS) und übergibts dieser deine Instanz von der connection:
> 
> deineEngine.put("meineConnection", deinConnectionsObjekt);


warum?


----------



## nrg (22. Okt 2010)

ARadauer hat gesagt.:


> warum?



warum nicht?


----------



## SlaterB (22. Okt 2010)

weil 99.99% aller Foren-Themen ohne ScriptEngine auskommen, was hat das speziell hier für eine Bedeutung?


----------



## henpara (22. Okt 2010)

bau dir einfach klassen, die deine aufgaben übernehmen. 
überleg dir, was die andre klasse an infos haben muss, und mach entsprechende (statische) methoden.
in der main methode rufst du dann NUR die methoden der einzelnen klassen in der reihenfolge auf, wie du sie brauchst.

zB 
klasse db-connection
aufgabe. stellt verbindung zur db her und bearbeitet statements.
klasse texte/statements einlesen
aufgabe: statements verfassen und mit resulsets textdateien schreiben
klasse gui
aufgabe: grafische benutzeroberfläche, zur auswahl der statements, button fürs schreiben etz..

fertig.
wie schon gesagt, programmieren musst du schon selber.


----------



## ARadauer (22. Okt 2010)

Ich versteh nicht ganz wozu ich hier die Java Script Engine benötige.
Das soll nicht heißen, dass es keinen Sinn macht, sondern dass ich es nicht verstehe.

Ich sehe hier keine Verwendung dafür....


----------



## nrg (22. Okt 2010)

ja gut zugegeben. hier etwas am ziel vorbeigeschossen. war mit den gedanken ein bisschen wo anders.

@ARa: gib dir ja recht. hatte den Thread nicht komplett gelesen und das auf den ersten Blick falsch interpretiert.


----------



## ARadauer (22. Okt 2010)

@henpara: lass es ... du kannst dem Threadsteller schon erklären wie man einen Tisch baut, aber wenn der nicht weiß was ein Hammer ist, wird das wenig Erfolg haben...


----------



## chillor (25. Okt 2010)

Hallo, 

ich habe jetzt mal eine Klasse zum einlesen nach meinem Geschmack erstellt (siehe unten). 

Ich habe jetzt noch paar Probleme bei der Main. Meinen Ansatz kann man unten sehen. Ich weiß zwar, dass es für manche trivial ist, aber ich hab da Probleme. Im Grunde genommen ist es nur eine Konsolenanwendung. Wie man sehen kann, möchte ich einen Schalter abfragen, der vom Nutzer aktiviert wird, sobald man das passende Statement (mind. ein Statement) gewählt hat. Das gewählte Statement kann dan sofort übernommen werden.

Mich würde es interessieren, ob die Prüfung der Parameter stimmt und wie ich das ausgewählte Statement aus der Konsole sofort abspeicher und der Klasse DB zum ausführen übermittle?.

```
public class ReadData {

    /**
	 *
	 * @return
	 * @throws Exception
	 */
	public String[][] read_file()throws Exception {

        //Ort der Datei
        File file = new File("c:/SQL_Statements.txt");

        //Zeilenweise auslesen
        BufferedReader br = new BufferedReader(new FileReader(file));

		//Deklaration
		String statement;
		int anzahlstatements=0;
		//Ermitteln der Anzahl an Zeilen
		while((statement = br.readLine()) !=null) {
			++anzahlstatements;
		}

		String[][] array = new String[anzahlstatements][2];
		br.close();
		br = new BufferedReader(new FileReader(file));
        for(int i = 0; i < array.length; i++)
        {
			//pro Zeile
			statement = br.readLine();
			String tmp[] = statement.split("\",,,\"");//Felder aus Datei für Zeile i in tmp eingelesen
			if(tmp.length != array[i].length) throw new Exception("größen stimmen nicht überein");
            for(int j = 0; j < array[i].length; j++)
            {
				//pro Feld
				array[i][j] = tmp[j];
            }
        }
        br.close();
		return array;
    }
}
```


```
public class Main {

		public static void main(String[] args) throws Exception{
		
		//1. eingabeparameter prüfen (statement gewählt? zeitangaben->variablen,etc.)
			
		//die Argumente der Kommandozeile, die sich im Feld args[] befinden werden ausgegeben
		for ( int i = 0; i < args.length; i++ )
			System.out.println( args[i] );

		//Um zu testen, ob auf der Kommandozeile der Schalter --name gesetzt ist
		String Schalter = "--name";
		String Kommandozeile = args[i];
		if(Schalter.equals(Kommandozeile))
		{
			System.out.println("beinhaltet --name");
		}
		else{
			System.out.println("beinhaltet nicht --name");
		}

			//3. ausführen
			//->DB::

			//4. Ausgabe in Textdatei speichern (additiv? überschreibend? einzelne Dateien?)
			//->StoreValues::

			//5. Ausgabe für evtl. weitere Exportvarianten

			//6. Ende

			//Objekt ReadData
			ReadData r1 = new ReadData();
			//Statements ausgeben
			String[][] test = r1.read_file();
			//Testweise test ausgeben
			System.out.println("Das Statement mit dem Namen "+test[0][1]+" lautet:");
			System.out.println(test[0][0]);
			System.out.println("Das Statement mit dem Namen "+test[1][1]+" lautet:");
			System.out.println(test[1][0]);
		}
}
```


----------



## SlaterB (26. Okt 2010)

wie soll man beurteilen was du alles für Argumente hast, was als richtig oder falsch ist?
man kann nur lockerleicht den Programmablauf vorhersagen:

ist z.B. der Aufruf
> java Programmname a --name
dann ist einfach ersichtlich der erste Parameter a, der zweite --name,

du prüfst in einer Schleife jeden Parameter, der erste, a, ist nicht --name, dann schreibt dein Programm also als Ausgabe
"beinhaltet nicht --name"
ob das mal richtig ist?

------

direkt jedes Statement abzuspeichern geht vor allem dadurch, indem der Speichercode in die read_file-Methode direkt in die Schleife rein geschrieben wird, etwas unsauber aber wohl das einzig realistische im kleinen Maßstab


----------

