Seite 1 von 1

Flexibilität für Erweiterungen je SQL-Dialekt

BeitragVerfasst: Mi 14. Mär 2012, 10:07
von Josef Pötzl
Hallo!

Aktueller Aufbau:
Code: Alles auswählen
SqlString = SqlTools.SqlGenerator.From("TableA") _
                        .Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
                        .GroupBy("F1", "F2") _
                        .Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
                        .OrderBy("F2", "F1") _
                        .ToDaoString()   <------------------- hier wird Dao.SqlConverter genutzt


Wenn man nun weitere SQL-Dialekte einbauen will, müsste man die Klasse SqlGenerator um eine Methode aufstocken.
Kann man das von "außen" machen?

Oder sollten wir auf so einen Aufbau wechseln:
Code: Alles auswählen
SqlString = ToDaoString.Generator.From("TableA") _
                        .Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
                        .GroupBy("F1", "F2") _
                        .Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
                        .OrderBy("F2", "F1")

bzw.
Code: Alles auswählen
SqlString = DaoGenerator.From("TableA") _
                        .Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
                        .GroupBy("F1", "F2") _
                        .Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
                        .OrderBy("F2", "F1").ToString()

=> Mit diesen Varianten könnte je weiterem Dialekt eine eigene dll verwendet werden, die die "Basisdll" mit dem SqlGenerator nutzt.

Grundaufbau: SqlConverter des jeweiligen Dialkete nutzt SqlGenerator. (Aktuell nutzt der SqlGenerator die SqlConverter.)


Weitere Möglichkeit:
Man übergibt beim Instanzieren des SqlGenerator eine Converter-Instanz.
Beispiel-Code in VBA:
Code: Alles auswählen
Private m_DaoSqlGenerator As ACLibSqlTools.SqlGenerator
Private m_TsqlSqlGenerator As ACLibSqlTools.SqlGenerator

Public Property Get DaoGenerator() As ACLibSqlTools.SqlGenerator
   If m_DaoSqlGenerator Is Nothing Then
      Set m_DaoSqlGenerator = SqlTools.SqlGenerator(Libs.DaoSqlTools.CreateObject("DaoSqlConverter"))
   End If
   Set DaoGenerator = m_DaoSqlGenerator
End Property

Public Property Get TsqlGenerator() As ACLibSqlTools.SqlGenerator
   If m_TsqlSqlGenerator Is Nothing Then
      Set m_TsqlSqlGenerator = SqlTools.SqlGenerator(Libs.TsqlSqlTools.CreateObject("TsqlSqlConverter"))
   End If
   Set TsqlGenerator = m_TsqlSqlGenerator
End Property


Ein Aufruf würde folgendermaßen aussehen:
Code: Alles auswählen
SqlString = DaoGenerator.From("TableA") _
                        .Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
                        .GroupBy("F1", "F2") _
                        .Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
                        .OrderBy("F2", "F1").ToString()

bzw.
Code: Alles auswählen
SqlString = TsqlGenerator.From("TableA") _
                        .Where("F3", RelationalOperators.RelationalOperators_Equal, 5) _
                        .GroupBy("F1", "F2") _
                        .Select("F1", "F2").SelectField("Count(*)", "", "Cnt") _
                        .OrderBy("F2", "F1").ToString()


Diese Variante halte ich derzeit am sinnvollsten.

LG
Josef

Re: Flexibilität für Erweiterungen je SQL-Dialekt

BeitragVerfasst: Mi 14. Mär 2012, 10:29
von FireWalkerHH
Klingt gut! Es würde die Bindung der beiden Teile weiter trennen und damit wesentlich flexibler machen.

Gruß,
Thomas

Re: Flexibilität für Erweiterungen je SQL-Dialekt

BeitragVerfasst: Mi 14. Mär 2012, 12:26
von Josef Pötzl
In der neuen Version (Ab SVN-Rev 60) ist das nun so gestaltet.

Die "Standard-DBMS" würde ich trotzdem in der SqlTools-COM-dll einbauen. Es ist aber nun möglich mit Hilfe einer weiteren dll SqlConverter für nicht enthaltene DBMS einzubinden.

mfg
Josef