Frage

Hintergrund:

Unsere C # .NET-Anwendung erzeugt und führt Anfragen an verschiedene Arten von Datenbanken (Oracle, SQL Server, MySQL), aber eine Anforderung kam auch sie in ein proprietäres Dateiformat anzuwenden.

  1. Der Namensraum bisher verwendete System.Data.Common.
  2. Die Abfragen wir brauchen, sind nicht-trivial (verschachtelte SELECTs, Aliase in FROM, substring Methoden und String-Verkettungen) anwenden

Wir konvertiert zunächst den Inhalt der proprietären Datei zu CSV, für die es die Treiber existiert {Microsoft Text Driver (* .txt; * .csv)} . Allerdings benötigt der Kunde, dass keine temporären Dateien erzeugt werden, und alles sollte im Speicher passieren.

einen ODBC-Treiber Erstellen der Datei abzufragen scheint direkt zu zeitanspruchsvoll. So erwägen wir einen Treiber (möglicherweise ODBC) zu schaffen, in dem wir „einbetten“ den SQLite-ODBC-Treiber werden. Innerhalb dieser Treiber können wir den Inhalt der CSV-Dateien in der „In-Memory“ -Datenbank, und dann nach vorne der Abfrage an den inneren ODBC-Treiber laden.

Meine Fragen:

  1. Ist diese Lösung scheint machbar?
  2. Wo sollen wir beginnen, um einen ODBC-Treiber von Grund auf neu zu erstellen?

Danke

War es hilfreich?

Lösung

Bei der Verwendung von SQLite als Backend eine Möglichkeit ist, kann ich nicht wirklich sehen, warum Sie nicht ein ADO .NET-Provider Ihre SQLite-Datenbank wie System.Data.SQLite .


Von Ihrem Kommentar, ich glaube, Sie sind in der Tat mit den ODBC-ADO .NET-Provider für alle Datenbankverbindungen (System.Data.Odbc). Wenn Sie das gleiche Schema halten müssen, dann ein benutzerdefinierte ODBC-Provider ist der Weg zu gehen (aber dann ist es klar, C nativen Entwicklung und ziemlich schmerzhaft glaube ich).

Eine andere Möglichkeit wäre zu gehen einen dritten Parameter zu Ihrem DB hinzuzufügen (die ersten beiden die SQL und die Verbindungszeichenfolge ist): der Anbieter ADO .NET verwendet werden (wie es ist soll in Konfigurationsdateien erfolgen finden Sie in der providerName Attribut). So können Sie jede ADO .NET-Provider verfügbar nutzen könnten.

Dann könnte man die die SQLite-Provider in der eigenen, kundenspezifische, ADO .NET-Provider wickelt, dass die Erzeugung und Bevölkerung der SQLite DB enthalten könnte. Vorteil dieser Lösung:. Reine verwaltete .NET

Andere Tipps

Die Client-Anfrage ungerade ist. Es wird immer beteiligt Dateien werden Sie aus einer Datei zu lesen.

Wenn sie ihre Sachen in Erinnerung wollen (wieder eine seltsame Kunde) legten die CSVs auf einen RAM-Disk: http://members.fortunecity.com/ramdisk/RAMDisk/ramdriv001.htm

Gebäude und ODBC-Laufwerk ist ein nicht-triviale Unternehmen, wenn Sie über die Leistung und Stabilität sorgen.

Ich denke, Ihre Lösung ist zeitaufwendig. Sie können bestehende Lösungen für das finden, was Sie zu tun versuchen. Hier sind einige Alternativen.

Warum versucht Linq nicht auf Text / CSV-Datei?

Beide Lösungen sind im Speicher.

Eine weitere Idee, dass, können Sie Datei in xml statt CSV oder Text exportieren (ich ziehe immer den Export in XML, wenn ich zu Prozess in meinem Code habe). Als Sie System.Xml oder Linq zu Xml verwenden, um Operationen durchzuführen.

Wenn Sie nur eingeschränkt sind keine temporären Dateien zu erstellen, können Sie auf die Verwendung in-Memory-Modus von SQLite versuchen. Hier ist ein Beispiel der Verbindungszeichenfolge für sie ( Quelle ):

Data Source=:memory:;Version=3;New=True;

In meinen Augen ist dies einfacher als der Bau ausgewachsene Anbieter. $

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top