/// <summary> /// Pseudo-Konstruktor: Wenn noch keine Instanz existiert wird eine /// erstellt, sonst nicht. /// </summary> /// <returns>Die Referenz auf die Instanz einer Klasse zum DB-Zugriff</returns> public static Cdv_DB HoleInstanz() { // Instanz erstellen, wenn noch nicht vorhanden if (_obj_instanzVonCdv_DB == null) _obj_instanzVonCdv_DB = new Cdv_DB(); // Referenzen hochzählen _i_anzahlReferenzen++; // Instanz zurückgeben return _obj_instanzVonCdv_DB; }
private void InitialisiereCdv_DB() { // Instanz erstellen _cdv_DB = Cdv_DB.HoleInstanz(); // Configfile auslesen XMLZugriff XMLZugriffsObject = new XMLZugriff(); XMLZugriffsObject.LadeDatei(CKonstanten._str_ServerConfigPfad); XMLZugriffsObject.WaehleKnoten("pELS/pELS-Server/DBConfig"); #region Testen der Konfig Daten evtl. neu konfigurieren string str_verbindenErfolgreich = _cdv_DB.testeDB( XMLZugriffsObject.HoleKnotenAttribut(0, "UserID"), XMLZugriffsObject.HoleKnotenAttribut(0, "PW"), XMLZugriffsObject.HoleKnotenAttribut(0, "Host"), XMLZugriffsObject.HoleKnotenAttribut(0, "Port"), XMLZugriffsObject.HoleKnotenAttribut(0, "DBName"), XMLZugriffsObject.HoleKnotenAttribut(0, "Lifetime") ); if(str_verbindenErfolgreich != "") { System.Windows.Forms.MessageBox.Show("Folgender Fehler trat beim Verbinden mit der Datenbank auf:\n\n" + str_verbindenErfolgreich + "\n\nKonfigurieren Sie die Datenbankanbindung bevor es weiter gehen kann.", "Fehler bei DB-Konfiguration", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); Cpr_frm_ServerKonfiguration konfig = new Cpr_frm_ServerKonfiguration(); konfig.ShowDialog(); //Wenn der nutzer es bis dahin immer noch nciht gepackt hat, dann soll er gehen if(!konfig.EingabeErfolgreich) Environment.Exit(2); else //Nochmal die Methode starten (rekursiv) this.InitialisiereCdv_DB(); } #endregion else { // DB-config-Daten zur Verbindung nutzen bool b_verbindenErfolgreich = _cdv_DB.VerbindeMitDB( XMLZugriffsObject.HoleKnotenAttribut(0, "UserID"), XMLZugriffsObject.HoleKnotenAttribut(0, "PW"), XMLZugriffsObject.HoleKnotenAttribut(0, "Host"), XMLZugriffsObject.HoleKnotenAttribut(0, "Port"), XMLZugriffsObject.HoleKnotenAttribut(0, "DBName"), XMLZugriffsObject.HoleKnotenAttribut(0, "Lifetime") ); // wenn was schief ging Exception werfen if (!b_verbindenErfolgreich) throw new Exception("Verbindung mit DB konnte nicht aufgebaut werden."); } }
/// <summary> /// Achtung! Die Methode wurde noch nicht getestet!!! /// Datenbank auf Initialzustand setzen /// </summary> public void ErstelleNeuePelsDatenbank(string pin_dbName) { #region Verbindung zur DefaultDB herstellen string str_tmp_angemeldeterNutzer; // Schließe Verbindung zur Datenbank, falls offen _cdv_DB.SchliesseDBVerbindung(); // Öffne neue Verbindung zur der Default PostgreSQL Datenbank _cdv_DB = Cdv_DB.HoleInstanz(); // Configfile auslesen XMLZugriff XMLZugriffsObject = new XMLZugriff(); XMLZugriffsObject.LadeDatei(CKonstanten._str_ServerConfigPfad); XMLZugriffsObject.WaehleKnoten("pELS/pELS-Server/DBConfig"); // DB-config-Daten zur Verbindung nutzen bool b_verbindenErfolgreich = _cdv_DB.VerbindeMitDB( XMLZugriffsObject.HoleKnotenAttribut(0, "UserID"), XMLZugriffsObject.HoleKnotenAttribut(0, "PW"), XMLZugriffsObject.HoleKnotenAttribut(0, "Host"), XMLZugriffsObject.HoleKnotenAttribut(0, "Port"), "template1", XMLZugriffsObject.HoleKnotenAttribut(0, "Lifetime") ); //merken des Benutzernamen um Ihn beim Erstellen zu ersetzen str_tmp_angemeldeterNutzer = XMLZugriffsObject.HoleKnotenAttribut(0, "UserID"); // wenn was schief ging Exception werfen if (!b_verbindenErfolgreich) throw new Exception("Verbindung mit DB konnte nicht aufgebaut werden."); #endregion #region pELS_DB erstellen und damit verbinden // Löscht die Datenbank falls existent try { _cdv_DB.AusfuehrenDDLAnfrage("DROP DATABASE \"" + pin_dbName + "\";"); } catch (Exception ex) { //nur den Fehler abfangen, dass man eine DB droppen will, die nicht existiert if(!ex.Message.StartsWith("ERROR: 3D000")) throw ex; } // Erstellt die neue Datenbank try { //Optimierungen bzw. der Syntax hier: http://pgsqld.active-venture.com/sql-createdatabase.html _cdv_DB.AusfuehrenDDLAnfrage("CREATE DATABASE \"" + pin_dbName +"\" TEMPLATE=\"template0\";"); } catch (Exception ex) { //Fehler abfangen, und an Nutzer weiterreichen System.Windows.Forms.MessageBox.Show(ex.Message , "Fehler beim Anlegen der Datenbank"); } // Mit neuer DB verbinden this.InitialisiereCdv_DB(); #endregion #region SQL Befehle zur DB Initialisierung aus Datei auslesen und an DB übertragen //Variablendeklaration StreamReader sqlStream = null; // Liest die Skripte aus einer Datei try { sqlStream = new StreamReader(CKonstanten._str_PfadZuPelsDbSchemaDatei); } catch (Exception ex) { //Hinweis auf Fehler geben System.Windows.Forms.MessageBox.Show("Folgender Fehler beim öffnen der Datei "+CKonstanten._str_PfadZuPelsDbSchemaDatei+" auf\n\n\n"+ex.Message, "Fehler beim Lesen der Datei", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } // Zwischenspeicher für die einzelnen Befehlszeilen string str_Befehlszeile = String.Empty; string str_sqlBefehl = String.Empty; if(sqlStream !=null) { // Datei Zeilenweise durchgehen while ((str_Befehlszeile = sqlStream.ReadLine()) != null) { if (str_Befehlszeile.StartsWith("//") || str_Befehlszeile.StartsWith("/*")) { //es handelt sich um einen Kommentar, der nicht betrachtet wird } else { //Anfügen und auch gleich den Richtigen Benutzer eintragen -> alexG str_sqlBefehl += str_Befehlszeile.Replace("UserNameToReplace",str_tmp_angemeldeterNutzer); if(str_sqlBefehl.EndsWith(";")) { _cdv_DB.AusfuehrenDDLAnfrage(str_sqlBefehl); str_sqlBefehl = String.Empty; } } } } #endregion }