Benutzer mit den meisten Antworten
SQLServer Datenbankdatei (*.mdf) verschieben

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
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- Als Antwort markiert Holger M. Rößler Mittwoch, 27. Januar 2010 19:36
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
-
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- Bearbeitet Holger M. Rößler Montag, 25. Januar 2010 18:52 Rechtschreibfehler :o)
-
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 -
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 -
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 -
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- Als Antwort markiert Holger M. Rößler Mittwoch, 27. Januar 2010 19:36
-
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