Autor Beitrag
Phillies1983
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Do 02.12.10 23:36 
Hallo zusammen,

bin ein Neuling in Sachen C# und entsprechender Datenbankprogrammierung. Erfahrung in PHP und SQL habe ich zwar, aber das reicht hier wohl offensichtlich nicht.

Ziel der Übung: Ein Benutzer gibt ein Datum und eine Uhrzeit ein und diese Daten sollen in eine Datenbank gespeichert und später wieder aus der Datenbank gelesen und auf der Maske zum ändern wieder angezeigt werden.

Soweit so gut. In der Datenbank ein DateTime-Feld angelegt, auf dem WindowsForm einen DateTimePicker in dem Format abgesetzt, welches ich dem Benutzer vorgebe (dd.MM.yyyy - hh:mm).

Nur wie bekomme ich das nun in ein für das DateTime-Feld der Datenbank entsprechendes Format. Und natürlich später zum Auslesen wieder umgekehrt.

"dd.MM.yyyy - hh:mm" muss ja irgendwie in "yyyy-MM-DD hh:mm:ss" umgewandelt werden können und umgekehrt?!

Danke schonmal für eure Hilfe.

Grüße, Phil


- Microsoft Visual C# 2010 Express
- SQLite-Datenbank
- Windows Forms-Anwendung


-----------------------------------------------------------------------------------

Lösung:
Belegen der Datenbank mit dem DateTimePicker:
ausblenden C#-Quelltext
1:
2:
3:
4:
string Cmd = "UPDATE db SET date_time = @date_time WHERE key = 1";
SQLiteCommand Query = new SQLiteCommand(Cmd, Connection);
Query.Parameters.Add(new SQLiteParameter("@date_time", datetimeDateTime.Value.ToString("yyyy-MM-dd HH:mm:ss")));
Query.ExecuteNonQuery();


Belegen des DateTimePicker aus der Datenbank:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
Query.CommandText = "SELECT date_time FROM db WHERE key = 1 LIMIT 1";
SQLiteDataReader Result = Query.ExecuteReader();

if (Result.Read())
{
   datetimeDateTime.Value = Result.GetDateTime(Result.GetOrdinal("date_time"));
}


Zuletzt bearbeitet von Phillies1983 am Mo 06.12.10 15:02, insgesamt 2-mal bearbeitet
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Fr 03.12.10 07:47 
Moin und :welcome:

ich sehe da eigentlich kein Problem. Denn die Properties des DateTimePickers (MinDate, MaxDate und Value) sind ja vom Typ DateTime. Du formatierst ja nur die Anzeige.

Also kannst Du beim speichern in die Datenbank den Value vom DateTimePicker so in das DateTime-Feld speichern wie er ist, oder beim laden Value den Wert aus der DB übergeben.

LG, Marko
Phillies1983 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 03.12.10 21:33 
Hallo,

danke erstmal für die Antwort. "Value"... oh man, das hätte ich eigentlich selber sehen sollen =/. Aber okay, zum speichern in der Datenbank reicht es aus. Aber die Datenbankvariable wieder in den DateTimePicker zu bekommen scheint nicht zu funktionieren.

Ich lese eine Zeile mit der Read-Methode von SQLite. Wenn ich nun den DateTimePicker.Value oder .Text mit dem Read-Ergebnis belegen will, bekomme ich die Fehlermeldung: Die Zeichenfolge wurde nicht als gültiges DateTime erkannt.

Also irgendwas klappt da noch nicht so wie ich es will =(.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 04.12.10 00:14 
Wenn du einen DbDataReader zum auslesen verwendest, dann kannst du die Methode 'GetDateTime' verwenden, um einen passenden Wert zu erhalten (du scheinst bisher das Datum als String (Text) auszulesen).

Ansonsten poste mal deinen Code.
Phillies1983 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 04.12.10 10:33 
Hallo,

heisst ich bekomme das Bindestrich-separierte Datum aus der Datenbank in ein Punkt-separiertes Datum für den DateTimePicker umgewandelt?

Ansonsten würde ich es jetzt mit Substring auseinanderfummeln.


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Query.CommandText = "SELECT date_time, pitch_number, contact, error_description, ticket_number FROM ticket WHERE id = " + txtId.Text + " LIMIT 1";
SQLiteDataReader Result = Query.ExecuteReader();

if (Result.Read())
{
   datetimeDateTime.Value = >>> XXXXX <<<;
   txtPitchNumber.Text = Result["pitch_number"].ToString();
   txtContact.Text = Result["contact"].ToString();
   rtxtErrorDescription.Text = Result["error_description"].ToString();
   txtTicketNumber.Text = Result["ticket_number"].ToString();
}
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 04.12.10 12:05 
Hallo,
user profile iconPhillies1983 hat folgendes geschrieben Zum zitierten Posting springen:
heisst ich bekomme das Bindestrich-separierte Datum aus der Datenbank in ein Punkt-separiertes Datum für den DateTimePicker umgewandelt?

Ja, das ist so. Denn es sind beide Werte vom Typ DateTime (ausser, Du wandelst den Wert aus der Datenbank in ein string um, so wie user profile iconTh69 denkt).

So müsste es also dann aussehen:
ausblenden C#-Quelltext
1:
datetimeDateTime.Value = Result.GetDateTime(Result.GetOrdinal("date_time"));					

Allerdings sollte auch noch die Prüfung auf isDBNull erfolgen, und vielleicht auch noch auf den Datentyp der Spalte.
LG
Phillies1983 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 04.12.10 14:06 
Also das Belegen aus der Datenbann funktioniert so einwandfrei. Danke dafür schonmal.

Habe ich denn auch zum Speichern in die Datenbank eine Möglichkeit den das Value des DateTimePickers in das da Format einer DateTime-Spalte der Datenbank zu bringen, ohne das der Fehler "kein gültiges DateTieme-Format" zu bekommen?
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 04.12.10 14:19 
Na wie speicherst Du denn die Daten in die Datenbank?
Ich meine, Du bekommst aus dem DateTimePicker ein DateTime, und den musst Du doch bloß so, wie er ist, in die Datenbank kloppen.

Zeige am besten mal den Code, mit den Du die Speicherung vornimmst.
Marko
Phillies1983 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 04.12.10 17:17 
ausblenden C#-Quelltext
1:
2:
Query.CommandText = "INSERT INTO ticket (date_time, ticket_number) VALUES ('" + datetimeDateTime.Value + "','" + txtTicketNumber.Text + "')";
Query.ExecuteNonQuery();


So schreibe ich die Daten in die Datenbank, aber dann kommt halt die besagte Fehlermeldung beim Auslesen über Result.GetDateTime(Result.GetOrdinal("date_time")).

Wenn ich einen Test mit getipptem Datum in den Query-Strng packe, tut's auch das Auslesen.

ausblenden C#-Quelltext
1:
2:
Query.CommandText = "INSERT INTO ticket (date_time, ticket_number) VALUES ('2010-12-05 16:14:10','" + txtTicketNumber.Text + "')";
Query.ExecuteNonQuery();
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 04.12.10 19:11 
Hallo,

habe mich echt gefragt, wie denn das Datum gespeichert werden kann, aber nicht mehr ausgelesen. Aber dann habe ich das gelesen:
Zitat:
Lieder ignoriert SQLite Verletzungen bei Foreign Key Constraints, also da muss man als Entwickler selber etwas drauf achten… Ebenso, dass die Spaltentypisierung wohl keine Typsicherheit erzwingt und gegebenenfalls Eingaben als Zeichenketten speichert.
Dewsegen gab es beim schreiben der Werte also keine Exception, sondern erst beim auslesen.

SQLite erwartet als DateTime so ein Format: 2010-12-31 20:55:31
Also muss man den DateTime-Wert aus dem DateTimePicker erst formatieren, bevor man ihn in der Datenbank speichern kann. Und das sieht dann so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
string cmd = "INSERT INTO ticket (date_time, ticket_number) VALUES (@dateTime, @ticketNumber);";
SQLiteCommand command = new SQLiteCommand(cmd, connection);
command.Parameters.Add(new SQLiteParameter("@ticketNumber"int.Parse(txtTicketNumber.Text)));
command.Parameters.Add(new SQLiteParameter("@dateTime", datetimeDateTime.Value.ToString("yyyy-MM-dd H:mm:ss")));

command.ExecuteNonQuery();

Gut, das wusste ich auch noch nicht, in anderen Datenbanksystemen ist es halt anders. Aber man lernt nie aus :wink:

LG, Marko
Phillies1983 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 05.12.10 14:01 
Fantastisch, so funktioniert alles =). Werde meinen ersten Post editieren und die Lösung anfügen.
Phillies1983 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 06.12.10 10:13 
Guten Morgen,

Unterscheidet sich die Tabellenanlage bei unterschiedlichen Betriebssystemen?

Unter Win7 funktioniert das Projekt, unter XP wird die bekannte Fehlermeldung (kein gütiges DateTime-Format) ausgegeben.

Oder kann dies evtl. an dem .Net-Framework liegen? Ist auf den XP-Rechner evtl. was nicht installiert... (3.5 Client Profile ist im Projekt aktiv)

Danke
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 06.12.10 14:00 
Hallo,

ist jetzt nur eine Vermutung, aber kann es sein, dass das Win7 ein 64-Bit-Betriebssystem ist, und WinXP ein 32-Bit?
Und dass Du in Dein Projekt die 64-Bit und die 32-Bit-Treiber für SQLite einbinden musst?
Anders kann ich mir das grad nicht erklären.

Oder Du versuchst mal, den Wert aus der Spalte als String auszulesen, und dann in ein DateTime zu konvertieren:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
string dateTime = Result["date_time"].ToString();
DateTime output;
if(DateTime.TryParse(dateTime, out output)
   //valid DateTime
else
   //not valid
Würde mich echt mal interessieren, was für ein Wert in der DB gespeichert wurde.

Aber alles andere in Verbindung mit der Datenbank funktioniert? Es hapert nur an dem DateTime?
Sicher, dass in der Datenbank nur valide Werte drin stehen?

Um das mal schnell zu prüfen gibt es auch den SQLite Manager als Firefox-PlugIn:
addons.mozilla.org/e.../firefox/addon/5817/
Marko
Phillies1983 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 06.12.10 15:00 
Beim Prüfen der Vorschläge habe ich festgestellt, dass der Überfall meiner 2 Katzen wohl doch was geändert hat. Wie auch immer, aber es fehlte ein H beim Umformatieren des DateTimePicker-Values... Somit stand Mist in der DB. Ist auf dem XP-Rechner aufgefallen weil ich es seitdem nicht mehr auf dem Win7-Rechner gestartet habe.

Aber danke für den Tipp mit dem Fuchs-PlugIn... Wäre wahrscheinlich immernoch auf der Suche.
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 06.12.10 23:10 
user profile iconPhillies1983 hat folgendes geschrieben Zum zitierten Posting springen:
Beim Prüfen der Vorschläge habe ich festgestellt, dass der Überfall meiner 2 Katzen wohl doch was geändert hat.
Sag ich auch immer, dass meine Katzen schuld sind :)

Schön, dass Du den Fehler gefunden hast.
Ja, aber um es nochmal zusammenzufassen: Ich finde es ehrlich gesagt ziemlich furchtbar, dass SQLite wirklich alles entgegennimmt, auch wenn der Datentyp nicht passt. Denn dadurch passieren ja erst so 'ne Fehler, wie er bei Dir passiert ist. Ich bin es von "normalen und vernünftigen" DBMS eigentlich gewohnt, dass sie nicht jeden Quatsch annehmen. Und auch nicht, dass ich einen DateTime-Typ erst in einen String formatieren muss, um ihn in der Datenbank zu speichern. Aber hat wohl alles seine Daseinsberechtigung.

LG, Marko
Phillies1983 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 06.12.10 23:12 
Von mySQL oder MSSQL bin ich das auch nicht gewohnt :D Aber SQLite ist nunmal klasse, wenn man nicht irgendwelche Server zur Programmlaufzeit laufen haben will =)

Und es waren echt die Katzen. Zumindest haben sie mich abgelenkt :D