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>
        /// liest das ConfigFile aus
        /// </summary>
        /// <returns>Objekt mit der aktuellen Serverkonfiguration zurück</returns>
        public Cdv_Serverkonfiguration LadeServerkonfiguration()
        {
            XMLZugriff XMLZugriffsObject = new XMLZugriff();
            XMLZugriffsObject.LadeDatei(CKonstanten._str_ServerConfigPfad);
            XMLZugriffsObject.WaehleKnoten("pELS/pELS-Server/Address");
            string _str_IP = XMLZugriffsObject.HoleKnotenAttribut(0, "IP");
            string _str_Port = XMLZugriffsObject.HoleKnotenAttribut(0, "Port");

            Cdv_Serverkonfiguration pout_ServerKonfiguration = new Cdv_Serverkonfiguration();
            pout_ServerKonfiguration.IP = _str_IP;
            pout_ServerKonfiguration.Port = _str_Port;

            return pout_ServerKonfiguration;
        }
        /// <summary>
        /// Exportiern der kompletten Datenbank in eine Datei im csv oder pels Format
        /// mögliches Feature: zusätzlich xml
        /// </summary>
        /// <param name="pin_FileStream">wohin gehen die Daten</param>
        /// <returns></returns>
        public bool ExportiereDatenbestand(string pin_FileName)
        {
            // ausgewählte Exportformate
            bool pels = false;
            bool csv = false;

            // Überprüfen in welchem Format exportiert werden soll.
            switch (pin_FileName.Substring(pin_FileName.LastIndexOf(".") + 1).ToLower())
            {
                case "pels":
                {
                    // PgAdmin wird verwendet um die PostgreSQL Datenbank komplett zu exportieren
                    pels = true;
                    break;
                }
                case "csv":
                {
                    // Export in einem csv Format für THWin
                    csv = true;
                    break;
                }
                default:
                {
                    pin_FileName += ".pELS";
                    pels = true;
                    break;
                }

            }

            if (pels)
            {
                // Prozesscontainer in dem der pgAdmin ausgeführt wird
                InitialisiereHintergrundProzess();
                //Zugriff auf die Konfig
                XMLZugriff XMLZugriffsObject = new XMLZugriff();
                XMLZugriffsObject.LadeDatei(CKonstanten._str_ServerConfigPfad);
                XMLZugriffsObject.WaehleKnoten("pELS/pELS-Server/DBConfig");
                // Aufruf
                System.Windows.Forms.MessageBox.Show(XMLZugriffsObject.HoleKnotenAttribut(0, "DBName").ToString());

                BackupProzess.StartInfo.FileName = _str_pgAdminPfad + "pg_dump.exe";
                BackupProzess.StartInfo.Arguments =
                    " -i -h " + XMLZugriffsObject.HoleKnotenAttribut(0, "Host")
                    + " -p " + XMLZugriffsObject.HoleKnotenAttribut(0, "Port")
                    + " -U " + XMLZugriffsObject.HoleKnotenAttribut(0, "UserID")
                    + " -W -F c -c -v -f \"" + pin_FileName + "\""
                    + " \"" + XMLZugriffsObject.HoleKnotenAttribut(0, "DBName") + "\"";
                // Starten des Prozesses
                BackupProzess.Start();
                // Automatisierte Eingabe des Passworts
                BackupProzess.StandardInput.WriteLine(XMLZugriffsObject.HoleKnotenAttribut(0, "PW"));
                return true;
            }

            if (csv)
            {
                // Exportdatei
                StreamWriter _FileStream = new StreamWriter(pin_FileName, false);

                // Benötigte Parameter um die Daten aus der Datenbank zu holen
                Cdv_DB _obj_InstanzVonDB = Cdv_DB.HoleInstanz();
                NpgsqlDataReader _dr_TabellenNamen;
                NpgsqlDataReader _dr_Tabelle;
                string _str_Tabellenname = String.Empty;
                string _str_Anfrage = String.Empty;
                int _i_Datensaetze = 0;

                // Alle Tabellen in der Datenbankermitteln
                _str_Anfrage = "SELECT tablename FROM pg_tables WHERE schemaname='public' AND tablename!='spatial_ref_sys' AND tablename!='geometry_columns';";
                _dr_TabellenNamen = _obj_InstanzVonDB.AusfuehrenSelectAnfrage(_str_Anfrage, out _i_Datensaetze);

                // Schleife über alle Tabellen in der Datenbank
                while(_dr_TabellenNamen.Read())
                {
                    // Export einer Tabelle
                    _str_Tabellenname  = _dr_TabellenNamen.GetValue(0).ToString();
                    _str_Anfrage = "SELECT * FROM \"" + _str_Tabellenname + "\";";
                    _dr_Tabelle = _obj_InstanzVonDB.AusfuehrenSelectAnfrage(_str_Anfrage, out _i_Datensaetze);

                    // Schreiben des Tabellennamen
                    _FileStream.Write(":" + _str_Tabellenname + ";");
                    // Schreiben der Spaltennamen
                    for (int _spalte=0; _spalte<_dr_Tabelle.FieldCount; _spalte++)
                        _FileStream.Write(_dr_Tabelle.GetName(_spalte) + ";");
                    _FileStream.WriteLine();

                    // Auslesen und exportieren der Daten
                    while (_dr_Tabelle.Read())
                    {
                        // Alle Werte einer Zeile in einem Array speichern
                        object[] _obj_Values = new object[_dr_Tabelle.FieldCount];
                        _dr_Tabelle.GetValues(_obj_Values);

                        // Werte durch Semikolon getrennt speichern
                        foreach(object _obj_Value in _obj_Values)
                            _FileStream.Write(_obj_Value.ToString() + ";");

                        // Zeilenumbruch zum Ende des Datensatzes
                        _FileStream.WriteLine();
                    }
                }
                // Schließen der Exportdatei
                _FileStream.Close();
                return true;
            }

            // Wenn man an dieser Stelle ist, wurde nichts exportiert
            return false;
        }
 /// <summary>
 /// Importieren der Einsatzdaten aus einer externen Datei
 /// </summary>
 /// <param name="pin_FileName">Name und Pfad der Datei, aus der importiert wird</param>
 /// <returns>Bool ob der Import funktioniert hat</returns>
 public bool ImportiereDatenbestand(string pin_FileName)
 {
     // Prozesscontainer in dem der pgAdmin ausgeführt wird
     InitialisiereHintergrundProzess();
     //Schaffe Zugriff auf Konfig
     XMLZugriff XMLZugriffsObject = new XMLZugriff();
     XMLZugriffsObject.LadeDatei(CKonstanten._str_ServerConfigPfad);
     XMLZugriffsObject.WaehleKnoten("pELS/pELS-Server/DBConfig");
     // Aufruf
     BackupProzess.StartInfo.FileName = _str_pgAdminPfad + "pg_restore.exe";
     BackupProzess.StartInfo.Arguments = " -i -h " + XMLZugriffsObject.HoleKnotenAttribut(0, "Host")
         + " -p " + XMLZugriffsObject.HoleKnotenAttribut(0, "Port")
         + " -U " + XMLZugriffsObject.HoleKnotenAttribut(0, "UserID")
         + " -d \"" + XMLZugriffsObject.HoleKnotenAttribut(0, "DBName") + "\""
         + " -c -v \"" + pin_FileName + "\"";
     // Starten des Prozesses
     BackupProzess.Start();
     // Automatisierte Eingabe des Passworts
     BackupProzess.StandardInput.WriteLine(XMLZugriffsObject.HoleKnotenAttribut(0, "PW"));
     return true;
 }
        /// <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
        }