Laden...

SQL Abfrage Problem mit Datum Formatierung

Erstellt von Pacher vor 3 Jahren Letzter Beitrag vor 3 Jahren 570 Views
P
Pacher Themenstarter:in
18 Beiträge seit 2015
vor 3 Jahren
SQL Abfrage Problem mit Datum Formatierung

Hallo!
Beisse mir hier an einem simplen Beispielprogramm schon seit Stunden die Zähne und finde einfach den Fehler nicht!
Habe schon zig Format Varianten durchprobiert, aber scheitere immer wieder an Datentypenkonflikten...
Vieleicht mag jemand mal kurz drüber schauen bzw. mir den entscheidenden Tipp geben und... bitte nicht prügeln, befinde mich noch im Anfängerstadium!
Wie auch aus dem Sourcecode erkennbar - C# und Access Database!
(Ja es gibt eine Unmenge an Videos und Tipps im Web, aber all diese sind mit unserem "Deutschen" System nicht lauffähig.)

Vorab schon Mal eine kleines Dankeschön!
LG

T
2.219 Beiträge seit 2008
vor 3 Jahren

Man schreibt die Werte nicht direkt in die SQL Anweisungen.
Dafür gibt es SqlParameter.
Damit sicherst du deine Anweisungen nicht nur gegen SQL Injection ab sondern musst dich auch nicht um die richtige Formatierung der Werte kümmern.

[Artikelserie] SQL: Parameter von Befehlen

Zusätzlich solltest du keine DB Anbindung nicht in der UI umsetzen.
Das wird sowohl unwartbar als auch untestbar auf dauer.

[Artikel] Drei-Schichten-Architektur

Ebenfalls ist Access keine für C# empfohlene Datenbank bzw. ist es im .NET Bereich keine Lösung.
Wenn du eine Anwendungslokale Datenbank brauchst, dann nimm eine Embedded Datenbank wie Sqlite.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 3 Jahren

Man schreibt das Datum nicht als String in die Datenbank, sondern als Datumswert. Dann kann es auch niemals zu Zeitzonen- oder Regionproblemen wie irgendwelchen Datumsformaten und Systemeinstellungen kommen.
In MSSQL sollte man dafür den datetimeoffset(7) Typ verwenden und auf .NET Seite DateTimeOffSet verwenden.

In Access speichert man die Zeitwerte als FileTime und liest sie auch wieder als FileTime, da DateTime nicht direkt von Access unterstützt wird.
Die passenden Methode ist DateTimeOffset.FromFileTime(Int64) Methode (System)

Alles dazu auch in [FAQ] DateTime vs. DateTimeOffset und der Umgang mit Zeiten in .NET

PS: Access ist keine Datenbank.
Wenn Du lokal Daten speichern willst, dann nimm wenn möglich LocalDB oder Sqlite - aber nicht den Access-Quatsch aus der Bronzezeit.

P
Pacher Themenstarter:in
18 Beiträge seit 2015
vor 3 Jahren

Hallo und ein herzliches Dankeschön euch beiden für die profesionellen Antworten.
Wie gesagt ich befinde mich noch im Anfängerstadium und muss mich erst von unten nach oben arbeiten um alles zu verstehen.
Der Hinweis auf SqlParameter war für mich schon mal ein zielführender Hinweis, alles andere ist für mich noch mit Kanonen auf Spatzen schießen bzw.
muss ich mich erst heranarbeiten. Von Drei-Schichten-Architektur bin ich noch weit entfernt und muss man auch mal erst verstehen....

Beschäftige mich derzeit noch mit kleineren Anwendungen (Adress-, Vereinsverwaltung etc.) da finde ich, ist eine Access "Datenbank" vollkommen ausreichend und
im Privatbereich möchte sich nicht gleich jeder mit Server und deren Konfiguration beschäftigen!
Hier hab ich eine '.exe und eine *.accdb und gut iss es.
Es ging mir darum, eine Lösung zu finden dieses Beispiel auch im deutschsprachigen Raum unkompliziert und ohne viel Aufwand lauffähig zu bekommen.
Und ja viele Wege führen nach Rom...

Mittlerweile hab ich eine Lösung gefunden, auch wenn ich den SQL String ziemlich "vergewaltigen" musste. Finde das DateTimePicker.Value als das eigentliche Problem, mit wenig Aufwand umgeschrieben, funtioniert es auch tadellos.
Alles weitere wie mit dem SQL Injection muss ich mich noch hineinarbeiten!

Hier meine kurzfristige Lösung:

var dtp1 = this.DateTimePickerFrom.Value;
var dtp2 = this.DateTimePickerTo.Value;
sql = "Select * from tblUser where EntryDate ≥ #" + dtp1.Year + "/" + dtp1.Month + "/" + dtp1.Day + "# and EntryDate ≤ #" + dtp2.Year + "/" + dtp2.Month + "/" + dtp2.Day + "#";

Aber nochmals vielen Dank für die Hinweise, werde mich damit beschäftigen!
LG Pacher

T
2.219 Beiträge seit 2008
vor 3 Jahren

Nutzt doch bitte die Hinweise und Artikel, die wir dir geben.
Jetzt ignorierst du meinen Hinweis auf Sqlite und SqlParameter.
Damit gehst du direkt am Anfang in die völlig falsche Richtung.

Das du weiter auf Access setzen willst, mag dein Geschmack sein, im .NET Umfeld wirst du dann aber auf viele Probleme stoßen.
Die Verteilung deiner Anwendung wird dann ein ordentlicher Albtraum.
Gerade hier sind Embedded Datenbanken im Vorteil, da diese eben alles nötige über ihre Library mitbringen.
Bei Access musst du nicht nur den richtigen Treiber für die richtige Version mitliefern.
Ebenfalls muss jeder Anwender diesen auch vorab installieren, da sonst die Zugriffe auf deine Access Datei knallen.
Tools zum bearbeiten der Embedded Datenbanken gibt es wie Sand am Meer und können auch mehr als du mit Access tun kannst.
Gerade im App Bereich wird auf Sqlite gesetzt, du arbeitest also mit einer robusten Datenbank.

Das du mit der Drei Schichten Architektur noch nicht anfangen willst, ist hingegen verständlich.
Ist schon etwas gehobener Stoff, den man nach den Grundlagen wie OOP angehen sollte.
Aber bitte tue es auch, damit wird dein Code zukünftig erst wart- und auch testbar.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

P
Pacher Themenstarter:in
18 Beiträge seit 2015
vor 3 Jahren

Hallo @T-Virus!
Da hast mich falsch verstanden, bin über jeden Hinweis dankbar und hab das Beispiel auch mit den SQParameter nachgebaut, läuft natürlich auch bestens.
Vordringlich war mir aber einen Lösungsansatz bzgl. dem SQLString/Formatierung zu finden.... geb da bei einem Problem nicht so schnell auf!

Hab mich auch heute schon mit dem SQLite Thema beschäftigt, dass ich so nicht kannte - der erste Eindruck gefällt mir wirklich gut, da es meinen Anforderung
an möglichst Portabel und keine "Server" Konfiguration, dem einer Access Datenbank entspricht. Syntax ist ja eh sehr ähnlich.

Bzgl. Access hatte ich bisher kaum Probleme, vorausgesetzt das "Microsoft Access Database Engine 2010 Redistributable" wurde beim Anwender installiert!
Finde die Tabellenerstellung schon wesentlich einfacher, aber wie man es eben gelernt oder gewöhnt ist!
Schön jetzt eine ev. bessere Alternative zu kennen, bin eh für "open your mind"...

Also besten Dank
LG

T
2.219 Beiträge seit 2008
vor 3 Jahren

@Pacher
Dann hatte ich dies falsch verstanden.
Der Lösungsansatz ist dann zwar ganz nett, hat aber auch noch Folgeprobleme.
Das ganze ist ohne SqlParameter dann auch nur schwer portierbar bzw. müsste man manuell das Format an allen Stellen einbauen.
Das nimmt die SqlParameter hier komplett ab bzw. macht es sogar überflüssig.

Tools für Sqlite gibt es wie Sand am Meer.
Z.b. gibt es DBeaver für mehrere Datenbanken oder spezifisch auch Sqlite Studio.
Mit letzterem arbeite ich aktuell noch am meisten, da es eine sehr kompakte Anwendung ist und die wichtigsten Funktionen mitbringt, die ich brauche.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 3 Jahren

Bzgl. Access hatte ich bisher kaum Probleme, vorausgesetzt das "Microsoft Access Database Engine 2010 Redistributable" wurde beim Anwender installiert!

Nur weil 'Du' keine Probleme hast heisst das ja nicht, dass das Werkzeug stimmt. Access ist dafür nicht gemacht und niemals gedacht gewesen.
Hier Access zu missbrauchen ist einfach der falsche Weg.

Access macht extrem viele Probleme bei der Verwendung als lokale Datenbank.
Nutze einfach mal die Forensuche hier um zu sehen, wie viel Leute Problem (und welche) haben und die Devise ist immer: Finger weg von Access.

Mittlerweile hab ich eine Lösung gefunden, auch wenn ich den SQL String ziemlich "vergewaltigen" musste.

Also anders als vergewaltigen kann man das auch nicht nennen, weil Du machst ausnahmslos genau das, was man absolut nicht tun sollte.
Auf der anderen Seite leben natürlich viele Entwickler/Berater davon, solche groben Handwerksfehler auf professionelle Art und Weise gerade zu ziehen, die irgendwann mal hin gepfuscht wurden 🙂

P
Pacher Themenstarter:in
18 Beiträge seit 2015
vor 3 Jahren

@Abt
Tut mir wirklich leid und entschuldige mich auch dafür, nicht gleich mit dem Wissen wie du hast, auf die Welt gekommen zu sein...

War das jetzt wirklich notwendig?
Genau diese Postings vermiesen es einem Anfänger, hier "dumme" Fragen zu stellen bzw. auf ein wenig Hilfestellung zu hoffen!!

16.806 Beiträge seit 2008
vor 3 Jahren

Du fragst in einem Forum nach Hilfe: dann musst Du damit rechnen, dass Du Antworten bekommst, die Dir helfen sollen.
Entsprechend hast Du Links bekommen, die Dir die Grundlagen von dem beibringen sollen, was Du erreichen willst; denn das, was Du hier konzeptionell tust ist in vielen Fällen für Datenlecks verantwortlich.
Daher haben entsprechend die Beiträge den Sinn, dass Du direkt die richtigen Grundlagen lernst.

Wenn Dir das "egal" ist, und Du es "irgendwie" machen willst, die Hilfe ignorieren magst: dann musst das einfach sagen.
So hat ein Forum nunmal den Sinn, dass Du in die richtige Richtung geschubst wirst. Und genau das haben wir getan.