Benutzer mit den meisten Antworten
Datumabfrage in SQLquery für Access UND SQLServer

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.
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]- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 27. Juli 2017 12:33
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 3. August 2017 09:41
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] -
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.
-
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] -
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
-
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]- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 27. Juli 2017 12:33
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 3. August 2017 09:41
-
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