C # Minimal SQL-Datenbank

12

Ich arbeite an einem kleinen Projekt (nicht in der Produktion), in dem ich genügend Daten speichern muss, damit so etwas wie eine CSV nicht effizient verarbeitet werden kann und ein SQL / MySQL-Server zu viel ist. Kann .Net mehrere Dateneinträge effizient speichern und abfragen, ohne eine Verbindung zu einem Server herstellen und verwalten zu müssen, statt eine einzelne Datei zu laden und zu verarbeiten?

David
quelle
Wenn Sie bereits einen Datenbankserver eingerichtet haben, auf dem eine andere Datenbank erstellt werden kann, ist dies ziemlich einfach. Wenn Sie nur die Daten verwenden, können Sie möglicherweise Access in Betracht ziehen.
Brad
@Brad dies ist nur ein persönliches Projekt und ich betreibe derzeit keine Datenbankserver bei mir zu Hause. Ihr Vorschlag von Access ist vielleicht genau das, wonach ich suche.
David
4
Ich bin kein Fan von Access , aber ich gebe ihm vielleicht manchmal die richtige Lösung. Haben Sie die Objektserialisierung in Betracht gezogen ? Erstellen Sie einfach ein Objekt und schreiben Sie es in eine Datei. (Das Objekt könnte ein sein List<foo>)
Dan Pichelman
Möchten Sie, dass diese beibehalten werden, oder müssen sie nur im Speicher vorhanden sein?
Richard
1
@ David: 4000 Einträge - so wenige? Warum nicht alle in Erinnerung behalten? Wenn Sie nur eine In-Memory-Datenbank benötigen, um einige Abfragen ohne Verwaltungstools durchzuführen, kann ein Dataset mit einigen zu datierenden Daten (die in einer Datei gespeichert bleiben) für Ihre Anforderungen ausreichen.
Doc Brown

Antworten:

15

Es gibt einige Alternativen, in keiner bestimmten Reihenfolge:

  1. Alle Versionen von (kostenpflichtigem?) Visual Studio werden mit installiertem SQL Server Express ausgeliefert . Das kannst du benutzen.
  2. (Ugh) XML-Dateien
  3. SQL Server CE (im Grunde lokales SQL über Datei)
  4. SQLite

Weitere Ideen hier: /programming/3639846/what-is-a-good-embedded-database-to-use-with-c

Sklivvz
quelle
Ich möchte wirklich etwas, das vollständig in einer einzigen ausführbaren Datei enthalten ist, keine DLLs und keine Software von Drittanbietern. Kann eine der oben genannten Methoden, mit Ausnahme von XML, diese Anforderungen erfüllen?
David
Sie können die DLLs vielleicht in Ihre ausführbare Datei einbetten.
Sklivvz
Nun, ich denke, der wichtigste Teil ist, dass keine Drittanbieter-Dienste wie MSSQL / MySQL # 3 oder # 4 dazu passen würden
David
Ich erinnere mich nicht, ob SQL CE eine separate Laufzeit hat oder nicht. SQLite nicht, aber es kann ein wenig schwierig sein, ein .NET-Projekt einzurichten.
GalacticCowboy
3
Ich würde hinzufügen, dass LocalDB eine Option ist. Siehe diese Antwort: stackoverflow.com/questions/9655362/…
Andy
4

Haben Sie neben den von Sklivvz angebotenen Optionen keine Angst, sich außerhalb des SQL-Bereichs zu bewegen und eine eingebettete objektorientierte Datenbank-Engine wie Sterling oder DB4O zu verwenden .

Sie bieten den Vorteil, dass sie klein und dateibasiert sind, in Ihre Anwendung eingebettet werden können, aber auch sehr schnell und einfach zu programmieren sind.

Eric King
quelle
3

SQLite wäre Ihre beste Option.
Wie auf ihrer Website geschrieben:

SQLite ist eine Softwarebibliothek, die eine eigenständige, serverlose, nicht konfigurierbare Transaktions-SQL-Datenbank-Engine implementiert.

Scheint wirklich was du suchst!

Es gibt sogar ein Chocolatey-Paket, wenn Sie zu faul sind, es selbst herunterzuladen und zu installieren!

MaxSC
quelle
2

ADO.NET kann in XML serialisiert werden und verfügt über nahezu die gesamte Funktionalität eines RDBMS. (Na ja, die billigen sowieso.)

Ich weiß, dass es "alt" ist und auf jetzt herabgesehen, aber ADO.NET funktioniert wirklich gut für genau das, was Sie beschreiben. Es macht sogar eine ziemlich anständige Aufgabe, nicht festgeschriebene Änderungen zu verfolgen.

Es mag "alt" sein, aber es ist sicher nicht "kaputt". Es hat jedoch einen ziemlich großen Speicherbedarf, also rufen Sie das an. 4000 Datensätze werden kein Problem sein.

Wesley Long
quelle
Könnten Sie einen "großen Speicherbedarf" erläutern?
David
@David - Dies bedeutet, dass die gesamte Datenmenge im Speicher gehalten wird und nicht nur die Datensätze, die Sie von einer Abfrage zurückgeben. Wenn Sie eine Datenbank mit 4 Millionen Datensätzen hätten, wäre das Speichern aller Datensätze in einem ADO.NET-Dataset eine erhebliche Belastung für die Ressourcen, wohingegen ein "reales" RDBMS sie auf einem Datenträger speichern würde, bis Sie eine Teilmenge davon abfragen. 4000 Datensätze sind ein kleines Niesen in der Speichernutzung, deshalb würde ich mir darüber keine Sorgen machen.
Wesley Long
+1, ich denke das ist die beste Option, für diese Anforderungen scheint auch etwas kleines wie SQLlite viel Aufwand zu sein.
Doc Brown