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 }