SqlToDataset

    • Release
    • Closed Source
      Name:
      SqlToDataset

      Beschreibung:
      LINQ ist eine sehr gute Sache. Jedoch wenn ich meine Datatables zusammen hatte und mit Daten befüllte, musste ich immer nachdenken, im Internet suchen, wie ich die gewünschten Daten mit LINQ abfrage. Den SQL-Befehl hatte ich aber sofort im Kopf. Es wäre also gut gewesen, wenn man mit einem SQL-Befehl die Daten aus den verschiedenen Datatablen hätte abfragen können. Und als ich im Internet suchte, las ich, dass ich mit diesem Wunsch nicht alleine war.

      So habe ich mir die Mühe genommen und eine Library programmiert, mit deren Hilfe man mit SQL-Befehlen Daten aus einem Dataset, welches mehrere Datatables enthält, abfragen kann. Ironischerweise habe ich dabei LINQ sehr gut kennengelernt.

      Die Library enthält vier Klassen:
      • SqlToDatasetBase: beinhaltet die grundlegenden Datenstrukturen zur Verarbeitung der Daten im Dataset
      • SqlSyntaxChecker: prüft die Abfrage auf Richtigkeit (zum Thema Prüfung siehe noch weitere Details unten)
      • SqlTranslator: "übersetzt" die Abfrage und generiert eine Datatable (System.Data.DataTable), welche die selektierten Daten enthält
      • SqlQuery: führt die Abfrage aus
      Unterstützte SQL-Funktionen, Operatoren, etc.:
      • SELECT Statement
      • mehrfache JOINS (nur inner join, left join und right join), basierend aber nur auf einer Bedingung (also t1.f1 ON t2.f1 AND t1.f3 ON t2.f3 ist momentan nicht möglich)
      • mehrfache WHERE clauses (AND, OR, NOT)
      • GROUP BY nach mehreren Feldern
      • ORDER BY nach mehreren Feldern
      • MIN, MAX, SUM, AVG, COUNT, FIRST, LAST Funktionen
      • >=, <=, =, <>, >, <, NOT IN, IN, NOT LIKE, LIKE
      • Datatypes: System.Char, System.String, System.DateTime, System.Boolean, System.Byte, System.Decimal, System.Double, System.Int16, System.Int32, System.Int64, System.SByte, System.Single, System.UInt16, System.UInt32, System.UInt64
      • spezielle Charakters in den Feldnamen (solche Felder müssen aber in [] stehen)
      • spezielle Charakters sind: space, ',", !, %, \, =, ?, ;, :, #, &, @, {, } (natürlich kann die Liste weiter ergänzt werden)
      Z. Zeit werden nicht unterstützt:
      • alias Namen werden zwar während der Syntaxprüfung erkannt und gespeichert, aber man kann auf sie im weiteren Teil des SQL-Befehls nicht beziehen
      • mathematische und sonst. Ausdrücke werden im ganzen Teil des SQL-Befehls erkannt und gespeichert, werden jedoch nicht ausgewertet (z. B. SELECT 2*f1 FROM t1 gibt nur f1 zurück und nicht 2*f1)
      • "Gruppierung" der WHERE-Bedingungen ist momentan noch nicht möglich (also z. B. (a=1 AND b=2) OR (c=3 AND d=4))
      • Subqueries
      • Stern im SELECT statement
      Ich habe aber vor, auch diese einzubauen.

      Geschwindigkeit:

      Die Geschwindigkeit einer Abfrage setzt sich aus drei Teilen zusammen (in Millisekunden):
      • SyntaxCheckTime: verstrichene Zeit für die Syntaxprüfung
      • TranslateTime: verstrichene Zeit für die "Übersetzung" der Abfrage
      • OutputTime: Ausgabe der selektierten Daten in eine Datatable
      Syntaxprüfungen:
      • allgemeine Syntaxprüfungen der SQL-Sprache
      • durchgängige Prüfung der Felder in allen Clauses (z. B. ob ein Feld in GROUP BY clause überhaupt in den selektierten Datatablen enthalten ist, etc.)
      • field type Prüfungen (z. B. wenn f1 ein string Feld ist und es in einer WHERE clause so benutzt wird: WHERE f1>10)
      • ambiguous Feldprüfungen
      Benutzung:

      Nachdem man die Daten in die von uns gewünschten Datatablen eingelesen hat, muss eine Instanz der SqlToDatasetBase Klasse deklariert werden:

      VB.NET-Quellcode

      1. Dim test_sqltodataset = New SqlToDataset.SqlToDatasetBase


      Danach müssen die mit Daten befüllten Datatablen der Instanz zugefügt werden, z. B. so:

      VB.NET-Quellcode

      1. test_sqltodataset.Tables.Add(testdataset.Tables(0))
      2. test_sqltodataset.Tables.Add(testdataset.Tables(1))
      3. test_sqltodataset.Tables.Add(testdataset.Tables(2))
      4. test_sqltodataset.LoadData()


      Danach kann die Abfrage in Textform der Funktion RunQuery übergeben werden. Die evtl. Syntax- o. andere Fehler können abgefangen werden:

      VB.NET-Quellcode

      1. Dim sqlquery As New SqlToDataset.SqlQuery(querytext)
      2. dgvOutput.DataSource = Nothing
      3. Try
      4. dgvOutput.DataSource = sqlquery.RunQuery(test_sqltodataset)
      5. Catch ex As SqlToDataset.SqlSyntaxChecker.SqlSyntaxException
      6. MessageBox.Show(ex.Message, "SqlToDataset", MessageBoxButtons.OK, MessageBoxIcon.Error)
      7. Exit Sub
      8. End Try


      Wenn notwendig, können die Geschwindigkeitsdaten abgefragt werden.

      Die sample Anwendung kann folgendermaßen benutzt werden:
      • man lädt die Musterdaten aus der Datenbank in die drei Datatablen (Load database)
      • man erstellt eine Instanz von SqlToDataset (Create SqlToDataset)
      • man wähtl eine Musterabfrage aus (sie dienen nur zur Demonstrierung der Möglichkeiten) oder gibt eine eigene ein
      • und startet die Abfrage (Run SQL query)
      • das Ergebnis wird dann in ein Datagridview ausgegeben.
      Screenshot(s):
      Klassendiagramm siehe Anhang

      Verwendete Programmiersprache(n) und IDE(s):
      Visual Basic .NET / IDE Visual Studio 2010

      Systemanforderungen:
      Net Framework 4.0

      Systemveränderungen:
      keine Systemveränderungen

      Download(s):
      Im Anhang ist eine sample Anwendung zu finden (1.795 kb). Sie enthält auch eine MS-Access Datenbank, aus der die Musterdaten geladen werden.

      Lizenz/Weitergabe:
      Es gelten Folgendes:
      • die Library ist closed source
      • die Library darf nicht dekompiliert werden
      • die Library darf nur unter Namensnennung benutzt werden
      • die Library darf für kommerzielle Entwicklung benutzt werden
      • dem Benutzer ist der Verkauf der Library und das Nutzenziehen aus der Library selbst untersagt
      • sonst gelten die allgemeinen Urheberrechte
      Bilder
      • ClassDiagram1.png

        247,59 kB, 871×3.020, 165 mal angesehen
      Dateien
      • SqlToDataset.zip

        (1,84 MB, 186 mal heruntergeladen, zuletzt: )

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

    • 1 Benutzer hat hier geschrieben