none
SQLServer Datenbankdatei (*.mdf) verschieben RRS feed

  • Frage

  • Hallo liebe Community,

    ich habe ein Programm, das einen MS SQLServer 2008 verwendet. Nun stehe ich vor der
    Herausorderung, dass der Benutzer für die mdf Datei einen beliebigen Speicherort angeben
    können soll.

    Der ConnectionString sieht folgender Maßen aus:
    "Server=.\sqlexpress;AttachDbFilename=|DataDirectory|Dateiname.mdf;User Instance=true;Initial Catalog=Kontoverwaltung;Integrated Security=SSPI;"

    Der SQLServer meckert beim Start der Applikation, dass die Datenbank nicht angelegt werden kann.

    Die genaue Meldung lautet:
    "Die 'J:\Michael\Kontoverwaltung\Kontoverwaltung\bin\Debug\Kontoverwaltung.mdf'-Datenbank ist bereits vorhanden. Wählen Sie einen anderen Datenbanknamen aus.
    Die Datei 'C:\Dokumente und Einstellungen\Holger M. Rößler\Eigene Dateien\Visual Studio 2008\Projects\Kontoverwaltung\Kontoverwaltung\bin\Debug\Kontoverwaltung.mdf' kann nicht als 'Kontoverwaltung'-Datenbank angefügt werden."


    Wer mag mir helfen?

    Viele Dank für Eure Mühe :o)


    Viele Grüße
    Holger M. Rößler
    • Bearbeitet Holger M. Rößler Montag, 25. Januar 2010 16:36 1 Fehler gefunden, Fehlermeldung hinzugefügt
    Montag, 25. Januar 2010 14:15

Antworten

  • Hallo Holger,

    Auf den zweiten Blick auffällt fällt mir auf, dass Du sowohl
    AttachDbFileName wie auch Initial Catalog verwendet hast -
    was nicht der erzeugten Standard Verbindungszeichenfolge
    für Benutzrinstanzen entspricht.

    Entferne die Angabe Inital Catalog=Kontoverwaltung

    In dem Fall versucht Express die Datenbank unter dem Namen (hier Kontoverwaltung)
    weiter zu verwenden, wenn es bereits einen Datenbank unter dem Namen gibt.
    Und da jeweils kopiert wird schlägt die Verbindung fehl, sobald auf die Datenbank
    zugegriffen werden soll, da sie bereits (vom erstmaligen Anfügen) in Verwendung ist.

    Gruß Elmar
    Mittwoch, 27. Januar 2010 09:41

Alle Antworten

  • Hallo Holger,

    bei Benutzerinstanzen werden Netzwerkangaben überhaupt nicht unterstützt:
    Herstellen einer Verbindung mit SQL Server Express-Benutzerinstanzen (ADO.NET)
    und Datenbanken in ein lokales Verzeichnis kopiert.

    Aber auch bei verbundenen Datenbanken muß das SQL Server Dienstkonto Zugriff auf
    die Datenbank-Dateien haben. Und auf Netzwerklaufwerke (bei J: gehe ich davon aus)
    ist das in der Regel nicht der Fall - zumal gemappte Laufwerke je Konto verwaltet werden,
    also für das Dienstkonto womöglich gar nicht existiert.

    Beim Anfügen einer Datenbank versucht der SQL Server zudem die Sicherheit durchzusetzen:
    Sichern von Daten- und Protokolldateien

    Programmverzeichnisse sollten generell (nicht nur für Datenbanken) für veränderliche
    Daten tabu sein. Denn spätestens mit Vista und später erhält ein Konto keinen schreibenden
    Zugriff (solange nicht UAC abgewinkt wurde).
    Für verbundenen Datenbanken verwende das Datenbankverzeichnis, dass der SQL Server
    bei der Installation einrichtet und mit entsprechenden Rechten versieht.

    Andere Daten sollten in das Applikationsverzeichnis (Benutzer oder allgemein)
    gespeichert werden, was Du über Environment.GetFolderPath ermitteln kannst.

    Gruß Elmar








    Montag, 25. Januar 2010 17:52
  • Hallo Elmar,

    genau das ist das Problem, die Datei liegt ja nicht auf Laufwerk J: (ist meine externe USB-Festplatte) sondern direkt im Projektverzeichnis auf C:. Zudem scheint VS Express die Datenbanken und die App.config bei jedem Compiliervorgang in den Debug bzw. Release-Ordner zu kopieren. Die Datenbankdatei wird ja gefunden, also scheint der Connectionstring nicht falsch zu sein.

    Die Frage ist nur, warum weigert sich der SQL Server die Datenbank anzufügen, bzw. warum meldet er, dass bereits eine Datenbank mit gleichem Namen vorhanden ist. Lt. Management Studio, befindet sich keine Datenbank in der Instanz.

    Danke und viele Grüße
    Holger M. Rößler

    Montag, 25. Januar 2010 18:46
  • Hallo Holger,

    vermutlich existiert noch eine Benutzer Instanz in der Express Instanz.
    Eröffne mal eine Verbindung mit dem Management Studio (Express) und
    gebe dort unter Optionen -> Zusätzliche Verbindungsparameter an:
    User Instance = true

    Dann siehst Du alle verbundenen Instanzen des Benutzers - ggf auch historische Einträge.
    Trenne die Datenbank über das Kontextmenü (Tasks->Trennen).
    Danach sollte eine geänderte Datenbank erneut verbunden werden können.

    Das oben Gesagte bezieht sich primär auf die spätere Verteilung.

    Die Kopierorgie bei der Entwicklung ist "normal". Wenn Du nur Express hast
    und über VS entwickelst, ist das leider die einzige Option.
    Besser ist eine permanent verbundene Datenbank zu verwenden,
    damit verweigern aber bei Express die Designer die Zusammenarbeit.

    Achte immer darauf, dass Du die Verbindung im Datenbank-Explorer geschlossen hast.
    Und das Änderungen, die Du beim Testen im Programm machst, durch das Kopieren verloren gehen.
    Du wärst nicht der erste, der sich fragt, warum er keine neuen Daten sieht ;-)

    Gruß Elmar
    Dienstag, 26. Januar 2010 13:33
  • Hallo Elmar,

    erstmal vielen Dank für deine Hilfe.

    Aber unter Extras(?) -> Optionen habe ich keinen Eintrag "Zusätzliche Verbindungsparameter" gefunden.
    Oder habe ich da im falschen Menü gesucht?

    Ich habe jetzt mal die Systemtabelle sys.dm_os_child_instances abgefragt und tatsächlich existiert noch eine
    Benutzerinstanz! Nur reinschauen kann ich halt nicht.


    Viele Grüße
    Holger M. Rößler
    Dienstag, 26. Januar 2010 13:52
  • Hallo,

    Ok, wer lesen kann ist klar im Vorteil. Hab die Option gefunden :o)
    Und tatsächlich sind da sogar noch mehrere Userinstanzen angelegt.

    Aber keine die auf die Datenbank meines Projektes verweisen würde.

    Sonst noch ne Idee?

    Danke und Gruß
    Holger M. Rößler
    Dienstag, 26. Januar 2010 16:11
  • Hallo Holger,

    Auf den zweiten Blick auffällt fällt mir auf, dass Du sowohl
    AttachDbFileName wie auch Initial Catalog verwendet hast -
    was nicht der erzeugten Standard Verbindungszeichenfolge
    für Benutzrinstanzen entspricht.

    Entferne die Angabe Inital Catalog=Kontoverwaltung

    In dem Fall versucht Express die Datenbank unter dem Namen (hier Kontoverwaltung)
    weiter zu verwenden, wenn es bereits einen Datenbank unter dem Namen gibt.
    Und da jeweils kopiert wird schlägt die Verbindung fehl, sobald auf die Datenbank
    zugegriffen werden soll, da sie bereits (vom erstmaligen Anfügen) in Verwendung ist.

    Gruß Elmar
    Mittwoch, 27. Januar 2010 09:41
  • Hallo Elmar,

    vielen Dank für deine Anmerkung. Ich werde das probieren.

    Jetzt habe ich noch eine einzige Frage bevor ich den Thread schliesse:

    Kann der SQL Server bzw. der Dienst auf externe Laufwerke zugreifen?
    Ich rede nicht von Netzwerklaufwerken, sondern von USB-Sticks bzw. USB-Festplatten
    die an den Rechner angestöpselt werden?

    Danke und viele Grüße
    Holger M. Rößler
    Mittwoch, 27. Januar 2010 18:37
  • Hallo Elmar,

    das war die Lösung!!!! Es war wirklich der ConnectionString (Initial Catalog) *jupiiii* :o)

    Wieder mal vielen Dank an dich :o)

    Viele Grüße
    Holger M. Rößler
    Mittwoch, 27. Januar 2010 19:36