Wie bereits in Additional.NET beschrieben, arbeite ich seit ca. 2007 an einem Framework zur Erweiterung der .NET-Funktionalitäten.
Ein Punkt dabei war der Zugriff auf Datenbanken bzw. Daten in datenbank-ähnlichen Strukturen über eine einheitliche Schnittstelle.
Dank der Feiertage bin ich diesem Ziel nun wieder einen Schritt näher gekommen.
Aus dem anfänglichen Testprojekt ist ein für mich recht wichtiges Werkzeug geworden. Im Gegensatz zu einem erst zu installierendem SQL Management Studio mit locker 100 MB ist der Database-Explorer (im folgenden nur noch DBE genannt) sofort einsatzbereit und mit ca. 22MB (bzw. ca. 7MB als ZIP) auch schneller geladen (OK, mit Oracle-Dateien sind es knapp 120 MB).
Der Vorteil liegt in der gleichzeitigen Verwaltung mehrere Datenquellen in einer Oberfläche. Sicherlich bieten die DB-speziellen Tools einige Vorteile, aber für den alltäglichen Bedarf sind diese in der Regel nicht notwendig (behaupte ich zumindest mal).
Die Komponenten des Frameworks dürfen auch in eigenen Projekten verwendet werden, ein Beispiel findet sich in einem der folgenden Beiträge.
Z.Zt unterstützt der DBE folgende Datenquellen (Stand Aug. 2016):
MS SQL
MS SQL Compact
mySQL, wenn der Connector v6.3.5 im GAC liegt (andere Versionen wurden nicht getestet)
Oracle (bei installiertem Client)
ODBC
CSV/Text
Firebird
SQLite (benötigt sqlite.dll)
HTML
dBase
Excel (bis 2007-2013)
Access (über 32bit-MS-Jet 4.0-Treiber) (aktuell nur die 64-Bit-Version hochgeladen)
SharePoint 2007-2013
Die Datenquellen werden nach Datenquellentyp (MSSQL, mySQL, ...) sortiert angezeigt. Das TreeView-Control arbeitet dynamisch, d.h. beim erstmaligen aufklappen kann es etwas dauern, bis die darunterliegenden Informationen geladen wurden (gerade bei den dateibasierten Datenquellen).
Einstellungen:
Aktuell habe ich noch das Problem, dass hier oft englische und deutsche Namen durcheinander kommen, da arbeite ich noch dran. Bei einigen dateibasierten Datenquellen (CSV, Text, HTML) sind zusätzliche Einstellungen möglich, um die Auswahl einzuschränken bzw. Vorgaben bzgl. der Daten zu machen (bei CSV bspw. ob die erste Zeile die Spaltennamen enthält).
Folgendes ist geplant (Reihenfolge ist nicht zwingend maßgebend):
Transaktionen
Implementierung von IDataReader
Verbesserter Support für MS SQL, mySQL und Oracle bzgl. Views und Procedures.
Unterstützung für DB2, PostGreSQL (Reihenfolge nicht relevant ).
Abfrage über mehrere Datenquellen, also z.B. zwischen Excel, MSSQL und CSV
Unterstützung für MS CRM-Listen und Word-Tabellen.
Verbesserte Unterstützung für Word, Excel und Access.
Verbesserte Encoding-Prüfung beim CSV-Import.
Verbesserte Unterstützung für dBase (Memotexte, Encoding, Indizees, Geschwindigkeit).
Mehrstufige Abfragen (z.B. zu einer Angebotsnummer nicht nur den Eintrag aus einer Angebotstabelle sonder zusätzlich auch die Angebotspositionen aus einer anderen Tabelle laden und separat anzeigen).
Vergleich von Abfragen, Verwenden von Teilergebnissen bzw. Spalten eines Ergebnisses für weitere Abfragen.
SQL-Query-Editor mit IntelliSense (das wird dauern ).
Schreiben in dateibasierte Datenquellen
SQL-Parser für erweiterte SELECT-Abfragen bei dateibasierten Datenquellen (teilweise schon umgesetzt)
Notifications, sofern von der DB unterstützt
Auflistung und Ausdrucksmöglichkeit für angegebene Referenzen
Rechteverwaltung
Stored Procedures
...
Leider ist das Archiv mit OpenXML-Support zu groß für den Upload geworden, daher nun per Link: DatabaseExplorer.zip (7.66 MB). Das Archiv einfach in einen Ordner entpacken und die exe starten, Mindestvorraussetzung ist .NET v4.
Und hier noch ein Screenshot mit Erläuterung der Symbole (die Toolbar ist unterteilt in die Bereiche Panel-Steuerung, Panel-Layout, Ergebnis-Layout und Ergebnis-Verwendung): (Stand ca. Mitte 2012, muss mal wieder angepasst werden)
Dieser Beitrag wurde 35 mal editiert, zum letzten Mal von tom-essen am .
coole Sache der Database-Explorer. Funktioniert mit meinen DBASE IV Datenbanken nur zum Teil.
Bei der wichtigen DB werden Tabelle und Spalteninfo ausgelesen. Allerdings ohne Inhalte. Liegt vermutlich daran, daß die DB Memory Felder enthält.
Bei einer mit dem DB Base Viewer erstellten DB wird die Tabelle komplett geöffnet.
Das Logging scheint noch nicht zu funktionieren. Zumindest habe ich den Pfad angegeben. Wird die Datei automatisch erstellt?
.csv Dateien wurden Problemlos geöffnet. Schön wäre eine Möglichkeit der Angabe des Trenners.
Könnte ich die TD.Additional.Data.Dbase.dll nutzen? Wenn ja wie?
@bounty4:
Ja stimmt, die MemoryFelder, werden (noch) nicht unterstützt (d.h die Daten in den DBT-Dateien).
Bzgl. Logging: Die Datei wird automatisch erstellt, sobald eine Meldung erstellt wird. Allerdings unterstützen die dateibasierten Datenquellen-Adapter z.Zt. noch kein Logging. Ist aber nun auch mit auf der Liste.
Bzgl. Trenner bei CSV-Import: Ebenfalls ein guter Hinweis, ist nun auch auf der Liste.
EDIT: Stand Nov. 2012 alles umgesetzt.
Die TD.Additional.Data.Dbase.dll kann man selbstverständlich auch in eigenen Projekten verwenden.
Als Verweise muss man "TD.Additional.dll", "TD.Additional.Data.dll" und die jeweilige Datenquellen-Assembly einbinden.
using TD.Additional.Data;
using TD.Additional.Data.Dbase;
using TD.Additional.Data.File;
[...]
var settings = new DbaseDataSourceSettings()
{ FileSource = new FileSourceSettings() { FileName = "Name der dbase-Datei" } };
using (var dataSource = Connections.CreateConnection(settings))
if (dataSource != null)
{
var dataTable = dataSource.Execute("SELECT * FROM whatever");
// ...
}
Zuerst werden die Einstellungen erstellt, für jede Datenquelle gibt es entsprechende Settings-Klassen. Für jede muss man anschließend die benötigten Eigenschaften setzen (bei dBase ist momentan nur die Quelle notwendig).
Bei den dateibasierten Datenquellen kann man aktuell zwischen Dateien (FileSourceSettings, Property FileName), Verzeichnissen (FolderSourceSettings, Property Folder) und frei zugänglichen Internetpfaden für einzelne Dateien (UriSourceSettings, Property Uri) wählen. Connections ist eine statische Klasse, die z.Zt. einzige Methode CreateConnection erstellt eine zum Settings-Typ passende Adapter-Instanz. Wird keine gefunden, wird null zurückgegeben (daher die Prüfung). Mit Execute kann man dann die Daten für eine (gültige) Query abrufen.
EDIT (05.09.2011): Die Methode "Execute" hieß früher "GetData".
@Scavanger:
SQLite kommt mit auf die Liste.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von tom-essen am .
Habe gerade im ersten Post eine neue Version online gestellt:
In der TreeView werden nun zusätzlich Icons angezeigt, um das Ganze etwas bunter zu machen.
Die Ergebnisse lassen sich nun schließen oder über den Pin als eigenes Fenster abdocken (und wieder andocken). Je nach Einstellungen funktioniert auch das Snapping.
Die Query eines Ergebnisses kann nun bearbeitet und das Ergebnis auch aktualisiert werden.
Die Spaltenbreite kann nun automatisch berechnet werden, die Zeilenhöhe kann ebenfalls angepasst werden.
CSV unterstützt nun auch eigene Trennzeichen (bisher wurde immer automatisch gesucht in der Reihenfolge "Tab, Semikolon, Komma". Als nächstes kommt evtl. noch die feste Breite für Spalten, Probleme gibt's teilweise noch bei deim Encoding.
Logging funktioniert nun auch bei den dateibasierten Datenquellen.
Nun können auch Acces- und Excel-(xls/xlsx)-Dateien eingelesen werden.
Beim Minimieren verschwindet der DB-Explorer nun im Try, ein Klick reicht zur "Wiederbelebung" aus.
In den Programm-Einstellungen kann man den DB-Explorer nun auch wahlweise mit Windows starten lassen.
Zusätzlich findet sich nun im ersten Post auch eine Liste mit geplanten Erweiterungen.
Programm startet. Allerdings bekomm ich keine der Datenquelleninhalte angezeigt:
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei TD.Additional.Data.File.FileDataSource.GetData(String query)
Bei DBase und CSV Dateien kommt diese Fehlermeldung.
Betreffs der DBT Dateien wäre es schön wenn zumidest die DBF Datei abgefragt werden könnten
Ist da was geplant?
Habe gerade eine neue Version im ersten Post online gestellt.
Das Logging funktioniert nun endlich korrekt, im Hilfe-Menü kann man das Protokoll direkt anzeigen lassen (es gibt noch einige Probleme beim nach dem Minimieren).
Weiterhin gibt es im Hilfe-Menü nun ein Feedback-Formular, wenn man etwas mitteilen möchte.
An einem erweiterten Ausnahme-Dialog arbeite ich noch.
Bei den Excel-Einstellungen kann man nun auch angeben, dass nicht per OLE-Treiber, sondern entweder per COM (für xls, ACHTUNG: Langsam) oder OpenXML (xlsx) geladen werden soll
Access-Import rudimentär möglich
Datei kann auf TreeView gezogen werden, wenn mit rechter Maustaste gezogen, kommt nach den Einstellungen die Frage, ob die Datei als Datenquelle eingebunden oder nur die enthaltenen Tabellen angezeigt werden sollen
dBase nun mit rudimentärem Memotext-Support, Encoding funktioniert noch nicht korrekt
Neue Datenquelle bzw. ändern oder löschen nun direkt über die Toolbar möglich
@bounty4:
Bzgl. der MemoFiles sucht er nach einer gleichnamigen Datei mit Endung dbt. Entweder hat er diese nicht gefunden oder er hat Probleme beim Einlesen (steht was in den Logs).
@all:
Leider fehlte im letzten Archiv die OpenXML-Assembly, das habe ich gerade geändert.
@bounty4:
Schau mal im Menü "Programm" unter "Einstellungen" nach, dort steht der Ordner, in dem die Protokolle abgelegt werden (standardmäßig unter AppData ...)
13.01.2011 10:08:55 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
13.01.2011 10:08:57 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
13.01.2011 10:08:59 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
13.01.2011 10:09:00 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
13.01.2011 10:09:00 Debug LoadTable Loading table 'Daten' from 'D:\ProjectSource\New Folder\Daten\Daten.dbf'
13.01.2011 10:09:00 Debug LoadTable Table with 0 rows loaded
13.01.2011 10:09:06 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
13.01.2011 10:09:06 Debug GetData New query: 'SELECT * FROM Daten'
13.01.2011 10:09:06 Debug LoadTable Loading table 'Daten' from 'D:\ProjectSource\New Folder\Daten\Daten.dbf'
13.01.2011 10:09:06 Debug LoadTable Table with 0 rows loaded
13.01.2011 10:09:34 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
13.01.2011 10:09:34 Debug GetData New query: 'select * from Daten'
13.01.2011 10:09:34 Debug LoadTable Loading table 'Daten' from 'D:\ProjectSource\New Folder\Daten\Daten.dbf'
13.01.2011 10:09:34 Debug LoadTable Table with 0 rows loaded
@Harry B.:
Schreibender Zugriff wird erst möglich sein, wenn ich einen halbwegs vernünftigen SQL-Parser habe, daran arbeite ich gerade.
Wofür sind die Index-Dateien?
Index-Dateien sind zum schnellen Suchen innerhalb von DBF-Dateien.
Enthält eine DBF-Datei z.B. eine Spalte mit Artikelnummern und sucht man jetzt nach einer ganz bestimmten Artikelnummer, so muss man nicht die ganze DBF-Datei lesen, sondern schaut im Index nach, wo genau der Datensatz ist.
Dazu gibt es unter dBase(-Dialekten) den SEEK-Befehl (SEEK('4711')). In SQL, aber das weißt Du selber, wäre es ein SELECT * WHERE ARTIKEL='4711'.
Gruß,
Harry B.
----------------------------------------------
Kaum macht man 's richtig, schon funktioniert 's!
Der Download im ersten beitrag wurde wieder aktualisiert:
Die Query-Eingabe ist nicht mehr modal, dafür wird nun sofort ein neues Panel geöffnet, in welchem die Eingabe erfolgt.
Der Refresh ist nun auch per Hotkey "F5" möglich, z.Zt. aber nur, wenn die Textbox fokusiert ist.
Die Query-Ausführung wurde in einen Thread ausgelagert und kann unterbrochen werden (der Refresh-Button ändert sich während der Abfrage in den Abbruch-Button).
Neu ist der Snippet-Manager: Zu jedem Datenquellentypen kann man nun Abrfragen definieren und diese auf Wunsch im Kontextmenü der Datenquellen anzeigen lassen. Der derzeit einzige Platzhalter "{tablename}" wird dabei durch den Namen der Tabelle ersetzt, welche aktuell markiert ist. Somit kann man z.B. für MS SQL eine Abfrage erstellen, welche nur die ersten 500 Datensätze einliesst (SELECT LIMIT 500 * FROM {tablename}). diese Abfragen werden dann auch nur im Tabellen-Menü angezeigt.
Bzgl. der dateibasierten Datenquellen sollten diese nun etwas schneller geöffnet werden, wenn Sie lokal vorliegen.
Bei dBase habe ich die Encoding-Auswertung integriert, funktioniert aber zumindest bei mir noch nicht korrekt. Beim Import von Menotexten habe ich zusätzliche Fehlerprüfungen eingebaut und das Logging erweitert.
Das Protokoll kann übrigens auch direkt über das Hilfe-Menü aufgerufen und parallel angezeigt werden, dann muss man nicht erstz mühsam die Datei suchen.
Edit: Die Textbox mit der Query kann auch aus- und wieder eingeblendet werden, der Button dafür ist der ehemalige Edit-Button im Ergebnis-Panel.
Edit2: Das Andocken/Anpinnen (weis einer, wie man das korrekt nennt?) in die TabControl-Liste funktioniert nun auch wieder. Und auch dem anschnappen der Fenster gab es Probleme, die nun behoben sind.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von tom-essen am .
@Harry-B.:
Z.Zt. wird bei den dateibasierten Datenquellen lediglich "SELECT * FROM {Tabelle}" unterstützt, alles weitere kommt erst mit dem SQL-Parser (also z.B. auch WHERE-Bedingungen). D.h. auch, dass die Index-Dateien ganz hinten auf die Liste kommen.
EDIT: Stand Nov. 2012 werden einzelne Spaltenangaben in SELECT unterstützt, dBase-Index-Dateien noch nicht.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von tom-essen am .
16.01.2011 11:53:56 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
16.01.2011 11:53:58 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
16.01.2011 11:53:59 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
16.01.2011 11:54:00 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
16.01.2011 11:54:00 Debug LoadTable Loading table 'Daten' from 'D:\ProjectSource\_MyDotNet Projekts\Lotus Datenbank\New Folder\Daten.dbf'
16.01.2011 11:54:01 Debug LoadTable Table with 0 rows loaded
16.01.2011 11:54:22 Debug .ctor New instance of TD.Additional.Data.Dbase.DbaseDataSourceAdapter created
16.01.2011 11:54:22 Debug GetData New query: 'SELECT * FROM Daten'
16.01.2011 11:54:22 Debug LoadTable Loading table 'Daten' from 'D:\ProjectSource\_MyDotNet Projekts\Lotus Datenbank\New Folder\Daten.dbf'
16.01.2011 11:54:22 Debug LoadTable Table with 0 rows loaded
Ist im download die neue Version schon drin? - hab keine neuere Datei gesehen.
Beim öffnen der DBASE IV DB bekomme ich jetzt die Fehlermedung:
16.01.2011 17:02:48 Debug Initialize Codepage is 1252 / System.Text.SBCSCodePageEncoding
16.01.2011 17:02:48 Error GetRecord Error reading record 0 memotext: Die Eingabezeichenfolge hat das falsche Format.
16.01.2011 17:02:48 Error GetRecord Error reading record 0: Die Eingabezeichenfolge hat das falsche Format.
@maYer:
Ich denke mal, es geht um MS SQL.
Ist dass dann nicht eigentlich auch das korrekte Verhalten? Soweit ich weis, wird bei einer Abfrage ohne Schema zunächst nach {Benutzerschema}.Tabelle gesucht, wenn diese fehlt, dann nach {Standardschema}.Tabelle. Benutzt du dieselben Anmeldedaten wie im SQL Studio?