Announcement

Collapse
No announcement yet.

SQL-Syntax unter ODBC

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL-Syntax unter ODBC

    Liebe Delphi-Gemeinde,<p>
    ein frohes neues Jahr!<br><br>
    Ich greife mit <font color=olive>ADO</font> auf unterschiedliche Datenquellen zu. Der Anwender kann wählen zwischen <i>mdb</i>, <i>xls</i>, <i>dbf</i> und <i>txt</i> im CSV-Format (das Programm dient der Fremddatenübernahme).<br>
    Nach bestimmten Kriterien werden die Daten überprüft, aufbereitet und in eine <i>mdb</i> feststehender Struktur importiert. Das klappt soweit hervorragend.<p>
    Bei der Erweiterung des Programms auf <font color=olive>ODBC</font>-Datenquellen lese ich die ODBC-Angaben aus der Registry oder <i>dsn</i>-Dateien aus und baue sie in den Connectionstring ein. Auch das funktioniert. Die Daten können angezeigt und ausgelesen werden. Tests liefen mit DB2-, Oracle- oder MSSQL-Datenbanken reibungslos.

    Doch bei den Datenprüfungen und -aufbereitungen trat ein Problem auf: Sobald bestimmte Funktionen (Len, iif, val) oder Stringoperationen verwendet werden (Strings mit & aneinanderfügen), funktionieren die entsprechenden SQL-Abfragen nicht.<br><br>
    Das ist eigentlich sogar ganz logisch, denn bei der ADO-Technik übernimmt nicht der ODBC-Treiber die Anpassung der SQL-Syntax, sondern ADO schleust diese direkt auf die Datenquelle durch. Damit ist man vom SQL-Dialekt der Datenquelle abhängig (+ oder || statt &, 0 statt false, sysdate oder getdate oder now, usw.).<br><br>
    Also dachte ich so bei mir, verzichte doch in diesen wenigen, aber entscheidenden Fällen auf ADO, nimm die Objekte TDataset und TQuery. Problem gelöst.<br>
    Doch leider haben diese Objekte gar keine Eigenschaft <font color=olive>Connectionstring</font>. Stattdessen gibt es TQuery.Database, doch die erwartet offenbar direkt eine Datenbank, denn dsn-Dateien werden nicht akzeptiert. Und wenn ich Benutzer- oder Systemdatenquellen verwende, habe ich nur die in der Registry eingetragenen Verbindungsdaten zur Verfügung und gar keine Datei, die ich der Eigenschaft Database geben könnte.<br><br>
    Dann gibt es noch TQuery.Datasource, die auf ein TDatasource verweist. Dazu brauche ich dann aber TDatasource.Dataset, die auf ein TDataset verweist. Die wiederum hat TDataset.Datasource. Hier drehe ich mich im Kreis, bin auch auf dem Gebiet nicht so beschlagen, denn ich habe bisher immer mit ADO gearbeitet, Connectionstring und fertig.<br><br>
    Die Frage also ist:
    <font color=green><ul>Wie kann ich mich mit beliebigen ODBC-Datenbanken verbinden und den ODBC-Treiber die SQL-Syntax interpretieren lassen? </ul>
    <ul>Wenn es wirklich nicht mit ADO geht, wie bringe ich den normalen Delphi-Objekten die ODBC-Verbindung bei?</ul>
    <ul>Gibt es noch weitere Möglichkeiten (DAO, RDO, OLEDB)?</ul></font>
    <br>Wer weiß Rat?<p>
    mfg Alex

  • #2
    Hallo,

    &gt;... TQuery.Database, doch die erwartet offenbar direkt eine Datenbank, denn dsn-Dateien werden nicht akzeptiert.

    doch - auch TDataBase kann auf einen ODBC-DSN zugreifen. Allerdings gehört TDataBase und TQuery zur BDE (Borland Database Engine), so dass man zuerst einen <b>BDE-Alias</b> für diesen ODBC-Treiber über das BDE-Tool <b>BDE-Verwaltung</b> anlegen muss.

    Die BDE unterstützt gleich 2 SQL-Versionen: <br>
    a) LOCAL SQL (die eigene SQL-Simulation) <br>
    b) Passthrough-SQL (die SQL-Anweisung wird zur Datenbank durchgereicht)<br>
    Im Fall von LOCAL SQL würde der Sprachumfang für LOCAL SQL für alle Datenbanken gleichermaßen gelten.

    Allerdings unterstützt Borland seit einiger Zeit die SQL-Links-Treiber der BDE nicht mehr, so dass die BDE nur noch für Desktop-Datenbanken (dBASE und Paradox) in Frage kommt.

    Lange Rede - kurzer Sinn: Der ADO-Weg ist zur Zeit der Beste, auch wenn dann je Datenbank spezielle Anpassungen zum unterstützten SQL-Funktionsumfang notwendig werden.

    &gt;Gibt es noch weitere Möglichkeiten (DAO, RDO, OLEDB)?

    DAO : Altes Objektmodell der Microsoft JET Engine für ACCESS-Datenbanken

    RDO : Altes Objektmodell für den Zugriff auf SQL-Server (mengenorientierte Datenbanken)

    OLE DB: Aktuelles Fundament von AD

    Comment


    • #3
      Hallo Herr Kosch,

      vielen Dank für die Hinweise.

      <font color=olive>&gt;...so dass man zuerst einen BDE-Alias für diesen ODBC-Treiber über das BDE-Tool BDE-Verwaltung anlegen muss.</font>

      Das habe ich noch nie gemacht, wie gesagt, habe nur ADO-Erfahrungen. Aber so, wie ich das verstehe, ist es nicht möglich, die Erstellung eines Aliases so zu automatisieren, daß der Anwender beliebige ODBC-Datenquellen einsetzen kann.

      <font color=olive>&gt;Der ADO-Weg ist zur Zeit der Beste, auch wenn dann je Datenbank spezielle Anpassungen zum unterstützten SQL-Funktionsumfang notwendig werden.</font>

      So war ich also schon auf dem richtigen Weg , aber da der Funktionsumfang vorher nicht bekannt ist, werde ich hier vermutlich die nicht unterstützten Funktionen simulieren müssen. D.h. ich zeige mir die Daten ohne Benutzung zweifelhafter Funktionen an und lasse ein Delphiprogramm die Analyse des Recordsets durchführen. Geht garantiert, ist nur leider möglicherweise wesentlich langsamer. Das werden Erfahrungen zeigen.

      <font color=olive>&gt;OLE DB: Aktuelles Fundament von ADO</font>

      Sic est , ich hatte nur die (unbegründete) Hoffnung, es gäbe vielleicht einen zu ADO alternativen Überbau, der auch OLE DB benutzt...

      mfg Ale

      Comment


      • #4
        Hallo,

        &gt;..daß der Anwender beliebige ODBC-Datenquellen einsetzen kann..

        der BDE-Alias setzt nur auf die vom ODBC-Manager (Systemsteuerung) vorgenommene DSN-Konfiguration auf, so dass man bei gleichem BDE-Aliasnamen auch unterschiedliche Treiber unterschieben könnte. Aber wie bereits gesagt, bleiben SQL-Datenbanken nach offizieller Lesart außen vor.

        &gt; ...aber da der Funktionsumfang vorher nicht bekannt ist...

        In der Tat hilft hier nur das Prinzip des kleinsten gemeinsamen Nenners weiter :-(

        Das neue ADO.NET geht nicht ohne Grund den völlig entgegengesetzten Weg, indem je Datenbank separate (hochspezialisierte) Zugriffsklassen genutzt werden, damit ADO.NET sich nicht dem Prinzip des kleinsten gemeinsamen Nenners unterwerfen muss. Es ist dann der Job dieser Spezialisten (DataAdapter und CommandBuilder), das "universelle" DataSet an die jeweilige Datenbank anzupassen

        Comment

        Working...
        X