Flexibilität für Erweiterungen je SQL-Dialekt

Hilfsmittel zum Erstellen von SQL-Anweisungen

Flexibilität für Erweiterungen je SQL-Dialekt

Beitragvon Josef Pötzl » Mi 14. Mär 2012, 10:07

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
Josef Pötzl
Moderator
 
Beiträge: 743
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

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

Beitragvon FireWalkerHH » Mi 14. Mär 2012, 10:29

Klingt gut! Es würde die Bindung der beiden Teile weiter trennen und damit wesentlich flexibler machen.

Gruß,
Thomas
Thomas Franzek

Diese Signatur wurde mit 100% chlorfrei gebleichten, glücklichen Elektronen erzeugt.
Diese entstammen keiner Lagerelektronenhaltung und werden nicht zu ihrer Arbeit gezwungen
FireWalkerHH
Entwickler
 
Beiträge: 57
Registriert: Mo 18. Okt 2010, 12:13

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

Beitragvon Josef Pötzl » Mi 14. Mär 2012, 12:26

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
Josef Pötzl
Moderator
 
Beiträge: 743
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)


Zurück zu SqlTools

cron