none
Datumabfrage in SQLquery für Access UND SQLServer RRS feed

  • Frage

  • Hallo,

    habe eine MS Access 2003 Datenbank zum SQLServer 2016 migriert. Muss jetzt allerdings aus dem Code wahlweise auf die MDB Datei als auch den SQLServer zugreifen. (Das Programm muss wahlweise den SQLServer oder dieMDB ansteuern - Connection für beide über OLEDB mit geändertem Connection string). Wollte dazu meine bisherigen (im Code generierten) queries nutzen. Bei Datumsabfragen gibt es aber wohl das Formatproblem.

    Beispiel: Select Vorname, VonDatum from Adresstabelle where Vondatum = #12-31-2016#;

    Ich befürchte dass ich für den SQLServerzugriff separate Queries bilden muss. Oder gibt es hier eine elegante Lösung?

    PS: das Problem für meine Datasets mit Datum ist ähnlich :-(

    Any Tip? Danke für Rückmeldung.

    Donnerstag, 20. Juli 2017 12:40

Antworten

  • Wenn das dataset vom SQLServer 2016 geladen wurde funktioniert die Datumabfrage so überhaupt nicht

    Hallo Klaus,

    da hast Du ganz nebenbei schon geschrieben, das es mit dem SQL Server nichts zu tun hat. Die Linq Abfrage läuft eben nicht gegen den SQL Server, sondern gegen das geladene DataTable.

    dim Datum as string="31.12.2016"

    Ein Datumswert als String? Kann es sein, das Du das Datumsfeld in der SQL Server Tabelle auch als varchar definiert hast? Das würde es erklären.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 21. Juli 2017 06:09

Alle Antworten

  • Hallo Klaus,

    das Datumsformat ist sehr MS Access spezifisch, ich habe noch keine andere RDMS gesehen, die das Format unterstützt.

    Das sieht so aus, als wäre das SQL Statement dynamisch als String erstellt? Da ist (sowieso) die beste Lösung mit OleDbParameter zu arbeitet, dann musst Du Dich um das Format der Werte in SQL gar nicht mehr kümmern.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 20. Juli 2017 13:58
  • Danke Dir Olaf, was mich allerdings (noch) wundert ist, dass das Datum im Dataset anders ausgewertet wird. Meine bisherigen LINQs funktionieren nicht - auch hier ein Problem des Datumformates nehme ich an. Kennst Du das Problem oder liegt es eventuell am SQLServer Setup? Gruss, klaus

    PS: habe mit OleDBParametern noch nicht gearbeitet. Müsste die aber auch dynamisch erzeugen da vorher nicht bekannt ist welche Felder geladen/gespeichert werden müssen. Bisher erfolgt die Speicherung über dynamisch erstellte SQL Stringketten (funktioniert hochperformant). Hast Du eventuell ein Beispiel über 'on the fly' erzeugte Parameter (konnte bisher im Netz nicht wirklich was passendes finden - war alles gecoded,, was bei mir nicht geht). Danke Dir.

    Donnerstag, 20. Juli 2017 15:12
  • dass das Datum im Dataset anders ausgewertet wird.

    Das ist eine recht wage Angabe; was heisst das konkret?

    Bei meinen Test waren parametrisierte Abfragen gegen den SQL Server um 30% schneller als dynamisches SQL, da hier einmalig ein Execution Plan für die Abfrage generiert und dann immer wieder verwendet wird; bei MS Access sieht das anders aus.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 20. Juli 2017 15:28
  • Hallo Olaf,

    Zu Linq hier mein Beispiel - via ein Dataset aus MS Access heraus

    dim Datum as string="31.12.2016"
    Dim dtEx As DataTable = dsLoanEx.Tables("Loan_ex")
            Dim query = From p In dtEx.AsEnumerable() Where p.Field(Of Int16)("art") = 2 _
                        And p.Field(Of Int32)("Loan_lfdNr") = lLoanID _
                        And p.Field(Of Date)("bis") <= Convert.ToDateTime(Datum) Order By p.Field(Of Date)("bis") Descending Select p

    Wenn das dataset vom SQLServer 2016 geladen wurde funktioniert die Datumabfrage so überhaupt nicht und der Code müsste wohl angepasst werden.

    Zur Performance (komme aus der DAO Welt): Wenn ich zusammengesetzte SQL Strings verwende ist die Performance wesentlich besser als über DAO (trotz begin/commit trans). Hier ein Beispiel:

    dim SQLstm as string="Update [FX_Waehrungen] Set  [FX_Name] = 'Dänische Kronen' ,  [FX_Kurzname] = 'DKK' ,  [FX_Memo] = ' ' ,  [FX_Waehrung1] = 0.2635 ,  [DeleteFlag] = False where  FX_counter = 3;"
    Dim command As OleDbCommand
    command = OLDB_DBConnect.CreateCommand()
    
    command.CommandText = SQLstm
    
    

    Der SQL string wird per Code zusammengestellt und könnte u.a. auch so sein:

    Dim SQLstm as string ="Update [FX_Waehrungen] Set  [FX_Waehrung1] = 0.2635 ,  [DeleteFlag] = False where  FX_counter = 3;"

    Da die SQLstm Erstellung gekapselt ist müsste bei der Umstellung auf OLEdbParameter die Funktion erkennen welche Felder geändert werden (kann es) und nur dafür OLEdbParameter generieren. 

    Hoffe Du verstehst was ich meine. 

    Gruss, klaus


    • Bearbeitet Stefan FalzModerator Freitag, 21. Juli 2017 07:12 Code zur besseren Lesbarkeit formatiert
    Donnerstag, 20. Juli 2017 16:30
  • Wenn das dataset vom SQLServer 2016 geladen wurde funktioniert die Datumabfrage so überhaupt nicht

    Hallo Klaus,

    da hast Du ganz nebenbei schon geschrieben, das es mit dem SQL Server nichts zu tun hat. Die Linq Abfrage läuft eben nicht gegen den SQL Server, sondern gegen das geladene DataTable.

    dim Datum as string="31.12.2016"

    Ein Datumswert als String? Kann es sein, das Du das Datumsfeld in der SQL Server Tabelle auch als varchar definiert hast? Das würde es erklären.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 21. Juli 2017 06:09
  • Hi Olaf,

    danke für die Rückmeldung. Klar läuft der Code gegen das datatable. Das wird aber bei meinem Code wahlweise durch den SQLServer oder die MDB gespeist. Und das Datumsformat im dataset/datatable kommt wohl über die MDB anders an als über den SQLServer. War aber ein guter Tip das Datumsfeld im Server näher zu untersuchen.

    Bin jetzt ein paar Tage unterwegs, melde mich aber nochmals mit Feedback.

    Viele Grüße

    klaus

    Freitag, 21. Juli 2017 21:08
  • wahlweise durch den SQLServer oder die MDB gespeist


    Das meinte ich ja, es wird geladen und hat danach keinen direkten Bezug zur Quelle und ist davon völlig unabhängig.

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Samstag, 22. Juli 2017 06:10
  • Hallo Olaf,

    Danke für Deine Tips. Hat mir geholfen - Code ist jetzt auf Parameter (die dynamisch erstellt werden) umgestellt. All Fine.

    Danke

    Montag, 14. August 2017 12:37