Falscher Connection string im Executable

  • VB.NET
  • .NET (FX) 4.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Falscher Connection string im Executable

    Hallo Forum,

    ich habe ein merkwürdiges Problem in meiner VB 2010 Anwendung. Zu Beginn des Programms lade ich mehrere Datenbanken, die mit Hilfe verschiedener Connection Strings definiert sind. Funktioniert alles auch ganz gut. Sowohl im Debugger als auch als ausführbares Programm im Standard Verzeichnis gibt es keine Probleme. Nehme ich nun das Executable und packe es auf mein Distribution Verzeichnis läuft es auf meinem Rechner (und nur auf dem) beim Laden einer Datenbank (und nur auf der) auf eine Exception. Die Fehlermeldung verweist auf einen uralten Pfad für die Datenbank, die mittlerweile dort gar nicht mehr liegt. Gebe ich vor dem Fehler den Connection String aus, hat dieser den richtigen, aktuellen Pfad drin.

    Woher erhält die Applikation also seine Pfad? Wird irgendwo (Registry, File) noch eine Verbindung gespeichtert?

    Wäre schön wenn jemand eine Idee hätte

    Reiner
    Wie gibtst du der App eigentlich den Pfad der Datenbank mit? Speicherst du die im Code oder liest du den Pfad/String mittels FileStream und StreamReader aus einer Textdatei aus? Oder hast du das in den My.Settings gespeichert (->ganz schlecht wenn du die App auf einem anderen Rechner laufen lassen willst)?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Das ist ein wenig komplizierter. Da ich mehrere Datenbanken benutzte, die auch noch alle auf verschiedenen Laufwerken liegen arbeite ich hier mit arrays. Abgelegt werden diese aber in Text Strings in MySettings.
    Das könnte natürlich die Ursache sein. Da die Anwendung vom Netzlaufwerk gestartet werden kann, kann natürlich jeder Benutzer die Pfade ändern (er würde es dann für alle User unbeabsichtigt machen). Je nachdem wo er jetzt seine Pfade gelinkt hat läuft das ganze mal auf einem Rechner, mal nicht (je nachdem wer als letzter damit wo gearbeitet hat).
    Diese Ursache bestätgt auch die folgende Beobachtung:
    Ich wollte heute morgen die These von Oben überprüfen, starte wie gestern das executable und siehe da : es läuft. (Gleiche Version wie gestern, als es nicht lief).

    So wie es aussieht ist der Ansatz Initialisierungsdaten in MySettings abzulegen nur bei Single Usern auf Single Maschinen sinnvoll. Wo wird eigentlich der Inhalt der Mysettings Werte im executable abgelegt? (Hatte immer gedacht in der Registry unter Benutzer). In den Settings liegen meine Variablen auch alle im Bereich 'Benutzer', daher meine Vorstellung, die Settings Daten seien Benutzer spezifisch.

    Wäre es günstiger nicht mit den MySettings zu arbeiten und statt dessen ein eigenens Initialisierungssystem (File) aufzubauen (gerade wenn viele User von einem zentralen Laufwerk das Programm benutzen)?
    Jaaaa...xD das kenn ich, einmal läuft die Anwendung nicht und man is fast am Verzweifeln und dann am nächsten Tag habt man keine Zeile geändert und es läuft wie am Schnürchen :D
    Naja jedenfalls zu deiner Frage wo die My.Settings gespeichert werden: Den genauen Speicherort kann ich dir auch ned sagen(5 MInuten bei Madam Google und deine Wünschen werden erfüllt xD) aber sie werden irgendwo unter %appdata%\... gespeichert.
    Es gab eh mehrer Posts, in denen gefragt wurde, wie man sensible Strings wie Connectionstrings, Banlisten, etc. unter My.Settings speichern kann. Ich glaub die standart Antwort war (im übertragenen Sinne): "Hast du 'n Rad ab? Jeder der weis, wo die XML-Datei liegt, in der die gespeichert werden, kann ganz einfach deine Anwendung hacken!"
    Wie gesagt sie werden irgendwo in einer XML-Datei gespeichert. Du kannst soweit ich weis, im Projektexplorer die MySettings Datei (Klemptnerschlüsselsymbol) ansehen, so sieht dann die Datei aus.
    Wie du ach selber geschrieben hast, ist es auf jeden Fall sicherer und praktischer wenn du die Strings in einer Datei speicherst. Diese Datei kannst du entwerder mittels WebClient aus dem Internet runterladen(von einem Webspace oder Netzwerk Server). Oder du Importierst sie beim Erstellen der Anwendung in die Ressourcen, dann wird die Datei mit'verkompilliert'. Wenn du dann die Anwendung startest, kannst du den Inhalt der Ressourcen-Txt zeilemweise auslesen und dann mit FileStream und StreamWriter in %tmp% oder wo auch immer wegspeichern. Gibt da n Haufen Optionen

    PS: Wenn du das Programm in einem Netzwerk(Intranet von einer Schule oder einer Firma laufen lassen willst) dann erstell irgendwo, wo jeder Zugriff hat, eine *.jpg Datei und schreibt dann in die Datei die Strings weg (evt. markier die Datei mit +Hidden). Vorteil is der, dass wenn jemand die Datei aufmacht, dann kommt er nicht gleich drauf Rechtsklick->Öffnen mit->Editor zu machen xD)
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Wo wird eigentlich der Inhalt der Mysettings Werte im executable abgelegt?
    Die Daten werden in der Datei user.config im Pfad abgespeichert.
    Siehe Näheres hier.
    Siehe auch da eine Möglichkeit, wie du Settings benutzerspezifisch persistieren könntest - da könnte man auch die Daten mit CryptoStream verschleiern...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    So, die Story geht weiter.
    Nachdem es jetzt über einen Monat keinen Fehler gegeben hat trat gestern wieder das Gleiche auf. Das executable stürzt mit der Fehlermeldung, der Datenbank Pfad wäre falsch, ab.
    Ich habe nun die config.user in dem user Verzeichnis:
    ...user\appdata\local\....\komischerUrlpfad\1.0.0.0 analysiert und keinen Fehler entdeckt. Dann habe ich sie mir in den Debugger Pfad kopiert und siehe da ich konnte den Fehler im Debugger wiederholen (Einen Schritt weiter). Damit habe ich herausbekommen, das die Ursache des Fehlers das OleDbDataAdapter.fill statement war. Alle anderen vorherigen Zugriffe auf die Datenbank waren OK! Also mußte der Fehler woanders liegen, nicht in den Settings.
    Nach langer weiterer Suche stellte sich dann heraus, das nicht das VB Programm eine Fehler hatte sondern die aufgerufene Datenbank. Die Tabellen, die ich benutze sind gelinkt und dieser Link war falsch.
    Die Fehlermeldung (>> P:\Databases\SDB\CGS_SDB\CGS_SDB.mdb' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.<<) ist insofern missverständlich, da keinen Hinweis enthält, dass der Link zu DB falsch ist und nicht der Aufrufpad der DB selbst.

    Das Problem ist also gelöst.

    Vielen Dank für eure Hilfe

    Reiner