Zum Inhalt springen

MySQL Date Problem bei DataBindings


Empfohlene Beiträge

Geschrieben

Hallo,

ich habe folgenden Code:


Dim dt_antragsteller As DataTable

Dim da_antragsteller As MySqlDataAdapter

Dim cb_antragsteller As MySqlCommandBuilder

Dim bs_antragsteller As New BindingSource


dt_antragsteller = New DataTable

da_antragsteller = New MySqlDataAdapter("SELECT * FROM [...]", conn)

da_antragsteller.Fill(dt_antragsteller)

cb_antragsteller = New MySqlCommandBuilder(da_antragsteller)

bs_antragsteller.DataSource = dt_antragsteller


My.Forms.Formular.PLZ.DataBindings.Add(New Binding("Text", bs_antragsteller, "PLZ"))

My.Forms.Formular.Geb.DataBindings.Add(New Binding("Text", bs_antragsteller, "Geburtsdatum"))

Problem ist folgendes: Ich rufe die Daten in die BS und sie werden auch im Formular angezeigt. Versuche ich jedoch das Geburtsdatum im Formular zu ändern, schreibt er beim verlassen des Textfeldes wieder das alte Datum rein. Das passiert mir aber NUR in Feldern die in der MySQL-DB als 'Date' deklariert sind. Text und Zahlen gehen einwandfrei. Komisch ist, dass es direkt beim verlassen des Feldes passiert. Ich kann ausschließen, dass ein Handle dieses Ereignis verursacht. Ich weiß grad nicht weiter.

Mögliche Werte für BS sin ja: "Text" oder "SelectedValue". Ich habe auch schon Masked Textboxes oder normale versucht.

Mit Hoffnung auf Hilfe!

Dank KriZa

Geschrieben

Ich vermute das du sowas wie 12.01.2007 eingibst, er aber sowas wie 2007-01-01 12:00:00 erwartet. Beim Databinding gibt es dann eine Exception. Versuch mal den String aus der Textbox zu einem Datetime Objekt zu casten und dann in die Spalte zu schreiben, wenn es dann geht musst du mal gucken wie man die Konvertierung in das Databinding hängt.

Geschrieben

ich habe schon versucht über

dt_antragsteller.Rows(0)("Geburtsdatum") = "1990-08-22"

oder

dt_antragsteller.Rows(0)("Geburtsdatum") = "1990-08-22 00:00:00"

was anderes direkt in den datatable zu schreiben, aber da meckert er auch. Fehlermeldung: Der Typ des Werts stimmt nicht mit dem Spaltentyp überein<1990-08-22> konnte nicht in der Geburtsdatum-Spalte gespeichert werden. Erwarteter Typ: MySqlDateTime. wie aber weise ich einem string den MySQLDateTime Typ zu. den gibt es ja nun mal nicht in VB. CType(x, MySQLDateTime) ist ja falsch, da MySQLDateTime nicht als gültiger Typ erkannt wird. auch folgendes geht nicht:
Dim x As Date = "1990-08-05 00:00:00"

dt_antragsteller.Rows(0)("Geburtsdatum") = x

geht auch nicht...

die Frage ist dein "sowas wie"... aber was genau?

Geschrieben

Klingt jetzt vielleicht blöde, aber ich lasse dies gleich weg, benutze in keiner DB das Date- feld. Sondern ein 10stelliges "VARCHAR" feld. Damit hab ich bisher niee Probleme gehabt. Ist zwar auch nicht die "saubere Englische Art" aber es funktioniert :-)

Und wennst es dann auch noch umdrehst Also YYYY-MM-TT dann ist auch die Sortierung per SQL kein Problem mehr.

Gruß Hans-Jörg

Geschrieben

Kommt drauf an ob du ein Kalenderelement hernimmst oder nicht. Auch hier nehme ich gerade beim Geburtsdatum KEIN Kalenderfeld. Ein Kalenderfeld beim Geburtsdatum halte ich persönlich auch nicht für sinnvoll. Da musste mehr klicken als wennst es gleich richtig reinschreibst. Du kannst ja beim verlassen des feldes dir eine eigene Funktion schreiben, die prüft, ob nun ein Datum eingetragen wurde oder nur unsinn.

Muss aber auch zugeben, dass ich nie mit gebundenen Feldern arbeite.

Geschrieben

Hab mir das gestern nochmal durch den Kopf gehen lassen!

Ursache des Problems ist ja das 'Allow Zero DateTime' im Connection String.

Schalte ich es auf True funktionieren die Abfragen, aber das DatumsBinding nicht.

Schalte ich auf False funktionieren die Abfragen nicht, weil ich auch nullwerte in der DB habe. Diese Nullwerte will ich zwingend nicht umgehen, da es ein Kundenbearbeitungsprogramm ist und, wenn Datumsangaben nicht gemacht sind ich kein 1.1.1901 lesen will.

Das Binding wäre mir einerseits schon wichtig, da es mir die UPDATE funktion erspart. weiterhin ist es einfach nur komfortabel (bis auf die Datumsangaben...).

@HJST1979: Die idee mit dem Varchar hat folgenden Nachteil: wenn ich ein Datagridview damit fülle sehe ich das 'Datum' in der YYYY-MM-DD Schreibweise. Das will ich aber nicht. Ich brauche das alte deutsche Format DD.MM.YYYY

Wie bekomme ich dann die Spalte in dieses Format? kann ich sie nach dem befüllen des Datagridview ändern? ich weiß, dass ich die datatable nicht verändern kann, nachdem ich werte befüllt habe.

ach das ist doch alles sinnlos. mir fehlt die eingebung.

ein verzweifelter...

Geschrieben

einzige Idee ist es jetzt, die Bindung aller Datumsfelder aufzuheben. Allerdings funktioniert ja die aktualisierung der datatable nicht. ich bekomme keine wete in die hinein! was mache ich da falsch?

dt_antragsteller.Rows(0)("Geburtsdatum") = "1990-08-22"

oder

dt_antragsteller.Rows(0)("Geburtsdatum") = "1990-08-22 00:00:00"

geben ja fehler aus

Geschrieben

@HJST1979: Die idee mit dem Varchar hat folgenden Nachteil: wenn ich ein Datagridview damit fülle sehe ich das 'Datum' in der YYYY-MM-DD Schreibweise. Das will ich aber nicht. Ich brauche das alte deutsche Format DD.MM.YYYY

Wie bekomme ich dann die Spalte in dieses Format? kann ich sie nach dem befüllen des Datagridview ändern? ich weiß, dass ich die datatable nicht verändern kann, nachdem ich werte befüllt habe.

ach das ist doch alles sinnlos. mir fehlt die eingebung.

ein verzweifelter...

Du kannst auch per SQL- Befehl einen String in dein Datum umwandeln, oder du kannst das Datum in 2 Felder speichern, einmal normal und einmal im Format yyyy-mm-tt aber nur wenn du wirklich danach sortieren musst :-)

Geschrieben

Das bringt mir aber wieder nichts, denn wenn ich ein textfeld per CAST() in ein Date feld umwandle, stehe ich wieder vor dem gleichen problem mit der bindung. das ändert somit leider nichts. er denkt ja wieder das ist ein datefeld und verhindert das update.

mhh...

mal ehrlich - wo hat hier microsoft nur das problem? warum schränken die ihr programme so ein?

Geschrieben

Lösung - juhu!!!

MySQL Spalte vom Typ Date

connection string: allow zero datetime = false

maskierte textfelder anstatt datetimepicker

abfangen des 'leave' Trigger der textbox and änderung der datatable mit folgendem code:

wenn textbox leer, dann:

dt_antragsteller.Rows(0)("Geburtstag") = DBNull.Value

achtung bei Datumsmaskierten textboxen sieht leer nicht "" aus, sondern je nach maskierung zB so " . ." für das format "DD.MM.YYYY"

die letzten leerzeichen werden abgeschnitten! Maskierung hier: "__.__.____"

Problem gelöst!

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...