SQLCE-Datenbank - Wohin damit?

  • Allgemein

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

    SQLCE-Datenbank - Wohin damit?

    Hi,

    ich habe eine SQL CE 3.5-Datenbank. Ich verwende sie mit Linq-To-SQL. Diese liegt in einem AppData-Unterordner (auf den ich Zugriff habe). Funktioniert wunderbar.
    Jetzt gibt es da aber ein Problem:
    Anscheinend will SQLCE nicht, dass es aus einem Netzwerkpfad geladen wird (genauer: DFS). In einer Umgebung, in der AppData-Ornder auf ein DFS umgeleitet wird, gibt es folgende Exception bei DataContext.CreateDatabase():

    Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: SQL Network Interfaces, error: 26 - Fehler beim Bestimmen des angegebenen Servers/der angegebenen Instanz)

    Source der Exception: .Net SqlClient Data Provider

    Der Zielordner der Databasefile existiert, sowie Zugriff mit den Standardrechten ist möglich.

    Nun denke ich mir, dass es wohl nicht so schlau ist, die DB in AppData zu packen, denn es kommt sicherlich öfters vor, dass die Anwendungsdaten gerne mal (in ein DFS?) umgeleitet werden.

    Wohin soll sie aber sonst? In den Programme-Ordner könnte man es wohl nicht packen, denn dann wären sicher wieder Administratorenrechte nötig, um in den eigenen Programme-Ordner zu schreiben bzw. Daten hinzuzufügen/zu ändern.

    Jemand eine Idee zur Lösung der Exception oder für einen neuen Speicherort?


    nikeee
    Von meinem iPhone gesendet
    Wenn du die DB nur auf deinem Rechner benötigst, kannst du dir irgendein lokales Verzeichnis definieren.
    Meinetwegen C:\myApp

    Wenn du sie nur für den einen User benötigst, kannst du sie auch irgendwo unter "Eigene Dateien" platzieren.

    Wenn es eine Netzwerk-Lösung sein soll, was die meisten DB-Anwendungen ja sind, geht es nicht mit der "kleinen" Microsoft-Variante.
    In diesem Fall würde ich als dateibasierte Datenbank SQLite nehmen.
    Oder eben gleich eine serverbasierte Variante wie mySQL.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi,

    diese Datenbank soll für jeden Benutzer automatisch nach dem ersten Programmstart angelegt werden, da dort für jedem Benutzer spezifische Dinge dokumentiert werden. Diese Anwendung bleibt also nicht nur bei mir, sondern wird auf viele andere Umgebungen skaliert. Von daher wäre es gut, wenn es auch keine Probleme mit DFS-Freigaben hätte.

    "C:\myApp" wäre keine schöne Lösung dafür. Der User muss dazu explizit die Zugriffsrechte auf den Ordner vergeben. Außerdem geht dann die Multiuser-Fähigkeit verloren.

    Es muss keine Netzwerklösung sein. Es sollte dateibasiert und architekturunabhängig (sprich: "AnyCPU") sein. Der User sollte nicht extra einen SQL-Server dafür installieren.
    Ich möchte einfach nur für jeden (Windows-)Benutzer eine eigene Datenbank anlegen, in der z.B. diverse Statistiken festgehalten werden. Da scheint mir ein datebasiertes Format am geeignetsten - oder nicht?

    Mit SQLite habe ich nicht so schöne Erfahrungen gemacht, denn AFAIK sind die SQLite-Assemblys immer noch nicht AnyCPU bzw. nur x86/x64 separat.
    Ich meide es grundsätzlich, "verschiedenbittig" kompilierte Versionen meiner Anwendung herauszubringen. Am Ende soltle eine AnyCPU-Version rauskommen, also keine x86-Version, die auf 64-Bit Rechnern im Subsystem läuft oder eine, die explizit für 64-Bit kompiliert ist.

    Warum ich mich für SQLCE entschieden habe? Weil es im Framework mitgeliefert wird, und ich aus dem oben genannten Grund die Anwendung als AnyCPU verteilen kann.

    Gibt es denn wirklich nichts anderes?
    Von meinem iPhone gesendet
    Naja, wenn es benutzerspezifische Daten sind, die für jeden User einzeln gelten, warum dann DFS? Reicht es dann nicht unter eigene Dateien bzw. AppData? Wobei hier dann zu sagen ist: reicht hier nicht eine Config oder Ini o.ä.? Das musst du entscheiden, aber ich verstehe noch nicht ganz, warum du diese, wenn sie für jeden Benutzer da sein soll (einzeln), dann ins Netzwerk machen willst?

    Ansonsten kannst du natürlich ´nen kleinen Service drunter basteln, was auch helfen würde, wobei sich die Frage stellt, ob das net Oversized ist.

    Kagurame schrieb:

    Naja, wenn es benutzerspezifische Daten sind, die für jeden User einzeln gelten, warum dann DFS? Reicht es dann nicht unter eigene Dateien bzw. AppData?
    In der Umgebung ist es so, dass AppData auf ein DFS umgeleitet wird. Daran ist nichts zu ruckeln. Also %appdata% führt auf eine DFS-Netzwerkfreigabe. Das ist ja, wie oben schon erwähnt, nicht immer der Fall (eig. nur in größeren Netzwerken). Die Anwendung sollte dadurch aber nicht inkompatibel werden. Bei "normalen", lokalen Anwendungsdaten, wie es oft bei Home-Systemen der Fall ist, funktioniert es einwandfrei.
    Wenn jemand aber das Programm ausführt, und die Ordner auf eine Netzwerkfreigabe umgeleitet werden (das kann ich ja nicht wissen), dann kommt es an der Stelle anscheinend zu Inkompatibilitätsproblemen.
    Von meinem iPhone gesendet
    Dann solltest du in dem Fall (soltest du sowieso bei einer Datenbank) den Speicherort der Datenbank konfigurierbar machen, was aber dennoch nicht ausschließt, das die DB im Netzwerk landet. Mhhhm... hast du mal über einen Service oder so für solche Fälle nachgedacht?

    Kagurame schrieb:

    Dann solltest du in dem Fall (soltest du sowieso bei einer Datenbank) den Speicherort der Datenbank konfigurierbar machen, was aber dennoch nicht ausschließt, das die DB im Netzwerk landet.
    Das möchte ich auch Vermeiden, denn die Datenbank soll ja beim (ersten) Programmstart angelegt (und auch initialisiert) werden.

    Gibt es wirklich nix dafür? Am liebsten würde ich ja einfach die Exception loswerden, dann appdata ist IMO ja dafür da.
    Von meinem iPhone gesendet
    @ErfinderDesRades: Naja, UNC-/Netzwerkpfade kennzeichnen sich duch ein "\\" am Anfang. Außerdem gibt es sicherlich bei der URI-Klasse ein Property dafür.

    Aber was willst du da modifizieren? Ich gebe nirgendswo einen ConnectionString an, wie es normalerweise üblich ist. Alles, was ich mache, ist eine Instanz eines DataContexts zu erstellen. Im Konstruktor wird dann der Pfad übergeben:
    msdn.microsoft.com/de-de/library/bb350721.aspx
    Dort übergibt man entweder den Pfad zur SQLCE-Datei oder einen ConnectionString. Könnte man also statt einem Pfad einen modfizierten ConnectionString übergeben?

    Wenn man dann CreateDatabase() aufruft, gibt es die Exception, die ich oben geschildert habe.

    Wenn ich wüsste, ob es ein Netzwerkpfad ist, oder nicht - was soll dann gemacht werden?
    Von meinem iPhone gesendet

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

    Ich gehe davon aus, dass der Pfad so bleibt. Ich probiere es mal kurz aus.
    @ErfinderDesRades: Ja, wie vermutet bliebt der Pfad gleich. Also in etwa so:

    Quellcode

    1. \\domäne.local\DFS\Anwendungsdaten\username\AppData\Roaming\unterornder\db\db.mdf
    Von meinem iPhone gesendet

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

    LocalAppData

    Probiere es mal mit LocalAppData. Diese Referenz sollte immer auf den lokalen PC verweisen.

    AppData wird meines Wissens fuer Roaming-Profile verwendet und liegt ggf. als Server-basiertes Profile am Server.

    Viel Erfolg,
    Harald
    Sehr schön. Dafür ist LocalAppData also da. :)

    Es gibt dieses Verzeichnis zwar nicht auf Windows XP, aber ich glaube für diesen kleinen Benutzerkreis kann ich das auch auf dem normalen AppData lassen.

    Ich werde es mal ausprobieren. :)
    Von meinem iPhone gesendet

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

    Ich habe es nun mit LocalAppdata ausprobiert. Der Pfad ist jetzt lokal, wie erwartet. Jedoch bekomme ich den gleichen Fehler.
    Der Pfad sieht in etwa so aus:

    Quellcode

    1. C:\Users\benutzername\AppData\Local\Anwendungsname\Unterordner\db.mdf

    Der Domänenbenutzer hat Vollzugriff auf das Verzeichnis. Außerdem existiert der Ordner Anwendungsname und der entsprechende Unterordner.

    Fehler:
    Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: SQL Network Interfaces, error: 26 - Fehler beim Bestimmen des angegebenen Servers/der angegebenen Instanz)


    Edit:
    Auch, wenn ich die DB auf dem Testrechner auf einen Pfad lege (z.B: C:\wat\db.mdf) gibt es diesen Fehler. Dabei hat der benutzer volle Rechte auf den Ornder.

    Der Fehler ist trotzdem der gleiche. Was soll das? Ich verstehe es nicht. Mache ich irgendetwas grundsätzlich falsch?
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „nikeee13“ ()

    Guten Morgen,

    ich vermute, dass Du auf dem Testrechner die SqlCE / Dot.Net Geschichte nicht korrekt registriert hast.

    Da der Zugriff auch lokal nicht funktioniert und die Fehlermeldung besagt, dass er den SQLServer nicht findet, scheint es KEIN Problem mit dem
    Pfad zu sein, sondern ein generelles SQLServer/VB Problem zu sein.

    Versuche mal auf dem TestPC die notwendige Dot.Net x.y Version und eventuell die SqlCE Variante neu zu installieren. Wenn Du gar nicht weiter kommst, installiere Dir
    das VStudio dort und probiere, ob es dann läuft - VStudio installiert so, dass man auch mit SqlCE arbeiten kann.
    Wenn es dann geht, weißt Du, dass für die CE-Geschichte noch irgendetwas fehlt/nicht registriert ist. Ist dem so, hilft sicher auch Gooogle weiter.
    Vielleicht hast Du auf dem TestPC einfach nur nicht alle notwenigen DLL's drauf installiert. Auch ein Link auf Deinen PC und dem EXE-Ordner (auf dem es ja läuft)
    ist nicht 100% ein Garant, dass es laufen muss, da ja einiges in's Windows Verz. installiert wird und natürlich auch registriert werden muss.

    Viel Erfolg.

    Harald
    Morgen,

    vielen Dank für deine Antwort.

    SoftDevIT schrieb:

    Da der Zugriff auch lokal nicht funktioniert und die Fehlermeldung besagt, dass er den SQLServer nicht findet, scheint es KEIN Problem mit dem
    Pfad zu sein, sondern ein generelles SQLServer/VB Problem zu sein.
    Das ist ja das Einzige, was noch über bleibt.

    SoftDevIT schrieb:

    Versuche mal auf dem TestPC die notwendige Dot.Net x.y Version und eventuell die SqlCE Variante neu zu installieren. Wenn Du gar nicht weiter kommst, installiere Dir das VStudio dort und probiere, ob es dann läuft - VStudio installiert so, dass man auch mit SqlCE arbeiten kann.
    Auf dem Testrechner ist bereits Visual Studio 2010 (SP1) und .NET 4.0 (Client Profile + Extended) installiert. SQL Server Compact 3.5 (SP2) ist auch installiert. Genau deshalb bin ich ja ratlos.

    Beide PCs sind praktisch Entwicklungs-PCs. Einer davon befindet sich in einer Domäne und hat umgeleitete Ordnerpfade (wie hier beschrieben). Der andere PC ist praktisch nur ein Home-PC mit VS drauf. Der Quelltext ist beim Debuggen der gleiche, denn die Projekte werden auf beiden PCs über einen TFS aktuell gehalten. Beide PCs sind 64-Bit Windows 7-Rechner. Auf dem Home-PC funktioniert es; auf dem Domänen-PC alledings nicht.

    Wie sieht es mit der UAC aus? Werden zum Anlegen einer Datenbank Adminrechte benötigt?

    Ich werde noch mal schauen, ob ich noch eine fehlende Komponente finde.
    Von meinem iPhone gesendet
    Welche SQLCE Version verwendest du denn ?

    Lesen hilft .. 3.5 SP2 sollte eigentlich sogar DB auf nem Netzwerkpfad öffnen können..sehr strange ^^
    Das ist meine Signatur und sie wird wunderbar sein!

    SQLServer CE - tiefere Problemanalyse

    Hallo,

    jetzt müssen wir doch etwas tiefer einsteigen.

    Wann genau bekommst Du die Fehlermeldung? Wenn Du auf die DB zugreifst oder wenn Du das DB-File erzeugen möchtest? Wenn es beim Erzeugen abbricht, versuche mal das MDF-File vom HomePC zu nehmen und über diesen Weg die DB nur zu öffnen. Wie sieht es dann aus?

    Wenn schon das Öffnen nicht klappt, versuche das DB-File umzubenennen und schau, was dann für ein Fehler kommt - sprich, wenn er die DB überhaupt nicht findet. So oder so müssen wir uns and den Fehler herantasten.

    Ich vermute, dass es tatsächlich an den UACs liegen kann, wobei man m.E. KEINE Admin-Rechte, sondern lediglich volle Rechte auf den Ordner benötigt, in dem man schreiben möchte. Problem kann natürlich auch noch sein, dass der PROGRAMM-Ordner über keine ausreichenden Rechte verfügt und demzufolge die DLL's von SQLCE nicht geladen werden können.

    Aber um die UAC-Thematik auszuschliessen, einfach mal den ADMIN verwenden. Wenn Du den Domain-Admin nicht bekommst, lass Dir einen lokal Admin nur für diesen Server einrichten und versuche es dann nochmal. Deaktiviere dort auch die Firewall - NICHT den Dienst!!! Und schalte die DEP - Data Execution Protection aus - eventuell bekommst Du darüber noch Seiteneffekte rein.

    So, und nun bin ich gespannt, wie die Ergebnisse aussehen. :)

    Viele Grüße
    Harald