myAdapter.Fill(_DataSet) nur wenn alle Felder der Tabelle richtig ausgefüllt sind

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    myAdapter.Fill(_DataSet) nur wenn alle Felder der Tabelle richtig ausgefüllt sind

    Hallo zusammen,

    wenn ich in der Daten Tabelle auf dem MySql Server nicht alle Felder(Datum) ausfülle,
    kommt es zu einem Fehler in MySqlDataAdapter.Fill().

    Die Tabelle sieht wie folgt aus

    Name
    Vorname
    Geburtstag
    Anrede

    Wenn ich nur den Vorname und Name in die Tabelle schreibe, lasse das Geburtsdatum weg, (ich kenne ja nicht alle Geburtstage)
    kommt es beim auslesen zu einem Fehler.

    Die Fehlermeldung
    Unable to convert MySQL date/time value to System.DateTime

    Wie geht man damit um ?
    Gebe ich absichtlich beim ausfüllen ein Pseudo Datum mit ? wat en quatsch.
    Oder gibt es eine Möglichkeit beim auslesen, solche leeren Felder zu Ignorieren ?

    lieben dank
    bernd
    ein nicht gesetzter Wert in einer DB erhält den Wert DBNull.
    In einer DataTable kann man auf IsDBNull testen, ohne den Wert abfragen zu müssen.
    Muß aber in der DB so angelegt sein, dass Nullwerte zulässig sind.

    Andernfalls - so kennichdas, kann man gar keinen Datensatz abspeichern, der ein ungesetztes Feld enthält.
    Ok ich habe irgendetwas von dir gefunden das steht ADO DataSet usw...

    Ich suche mal unter den Begriffen weiter.
    Weil es muss doch möglich sein, sich mit einem DataSet zu unterhalten bzw. das das DataSet erstmal die Daten annimmt.


    Nochmals das Problem:
    in der Tabelle ist ein Feld -> Datum.
    Wird beim einspeisen von Daten, kein Wert in das Feld Datum verwendet, schreibt MySql in das Feld
    0000-00-00

    Ist ja erstmal korrekt.
    Nur beim auslesen kracht es dann.
    wie gesagt: ich kenns nur mit Access und SqlServer und typisiertem Dataset.
    Da stellt man in der DB AllowDBNull.True ein für die Datum-Spalte, und dann generiert der inne DataTable zusätzlich zur DatumSpalte eine Methode .IsDatumDBNull() mit der man vorher testen kann, ob der Wert ungesetzt ist, bevor man ihn abfragt.

    Das generierte Zeugs gibts auch untypisiert, diese typisierten Dinger sind ja nur Wrapper um untypisiertes.

    Ah, ja: DataRow.IsNull() - gugge im ObjectBrowser.
    Finde im Objekt Browser unter MySql folgenden Eintrag

    Public ReadOnly Property IsNull() As Boolean
    Member von MySql.Data.Types.MySqlDateTime

    Wenn ich nun in der DatenBank Tabelle das ding auf Nul stelle und den Wert auch Nul anklicke,
    kommt tatsächlich die richtige Information zurück.

    Sende ich aber einen DatenSatz
    Name -> Bernd
    Nachname -> Schl
    Geburtstag -> "" ' also String.Empty

    dann setzt MySql ganz frech 0000-00-00
    ein.

    was dann wiederum zum fehler führt.

    Wie wird denn Bei Microsoft.Sql oder Access eune Nul weiter gegeben ?


    danke dir, bist spitze
    einfach DataRow nochmal im Objektbrowser angucken.

    Oh - falsch: Nothing ist die Objektorientierte Entsprechung von DBNull.

    Oder man kann DBNull auch zuweisen - bei typisierten Datasets hat man halt damit nich so viel zu tun.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ok ich habe etwas gefunden

    1.) gleich beim hochladen eines Datensatz

    VB.NET-Quellcode

    1. cmd.CommandText = "INSERT INTO Adressen(Name, Vorname, Geburtstag, Anrede_ID) VALUES ('" & TextBox1.Text & "', '" & TextBox2.Text & "','" & TextBox3.Text & "', '" & TextBox4.Text & "')" 'Der Befehl für die DB
    2. If TextBox3.Text = "" Then
    3. cmd.CommandText = Replace(cmd.CommandText, "''", "NULL")
    4. End If

    Sorry die Zeichen ' und " werfen den TAG durcheinander.
    Also gleich Prüfen ob der String "" (leer oder Nothing) ist. Wenn ja DBNul setzen.

    2.) Beim runterladen eines Datensatz
    Der DataSet von VB kommt mit DBNul nicht zurecht. Also einen Konstruktor dazwischen bauen

    VB.NET-Quellcode

    1. Do While .DataReader_.Read()
    2. Dim myTime As Date
    3. If Not .DataReader_.IsDBNull(.DataReader_.GetOrdinal("Geburtstag")) Then
    4. myTime = .DataReader_.GetDateTime(.DataReader_.GetOrdinal("Geburtstag"))
    5. Else
    6. myTime = DateTime.MinValue
    7. End If
    8. DataGridView1.Rows.Add(.DataReader_("ID"), _
    9. .DataReader_("Name"), _
    10. .DataReader_("Vorname"), _
    11. myTime, _
    12. .DataReader_("Anrede_ID"))


    Jetzt bleibt nur noch eine Frage offen.

    Warum kommt der DataAdapter nciht mit DBNul zurecht ?

    VB.NET-Quellcode

    1. _DataAdapter.Fill(_DataSet)


    Der läuft weiterhin auf Error.

    Danke dir EDR

    Bernd

    Edit:
    Sollte ein Fehler beim Fill() des DataAdatpter auftreten, kann man den auch abfangen:

    VB.NET-Quellcode

    1. ' Error Handling
    2. _DataAdapter.MissingMappingAction = MissingMappingAction.Error
    3. AddHandler _DataAdapter.FillError, AddressOf Fehler
    4. _DataAdapter.Fill(_DataSet)
    5. End Sub
    6. Sub Fehler(ByVal sender As Object, ByVal ev As FillErrorEventArgs)
    7. Console.WriteLine(ev.Errors.Message)
    8. ev.Continue = True
    9. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bernd“ ()

    merkst du, was das für ein Gewurstel ist?
    Willst du wirklich für jeden Pups so anfällige Sql-Zugriffe proggen?
    Auch sollteman keine Daten in die CommandTexte einfrickeln, sondern DBParameter benutzen. das löst Konvertierungsprobleme (auf die du im weiteren noch sicherlich stoßen wirst), Und schließt eine Sicherheitslücke, genannt "SQL-Injection".

    Aber schon dein Ansatz ist falsch, oder zumindest fragwürdig, oder kennt zumindest nicht die bereitstehenden Möglichkeiten: Man inserted nicht einzelne Datensätze, sondern fügt zunächstmal einfach Datensätze dem Dataset hinzu, ohne DB-Zugriff. Das kann zB per gebundenem DGV gehen, ohne eine einzige Zeile Code.
    Dann benutzt man konfigurierte DataAdapter, die mit einem einzigen Befehl selbsttätig alle zwischenzeitlich gemachten Änderungen in die DB speichern.

    Ich würd empfehlen: steig auf Access oder SQLServer oder SQLCe um, und lass die triviale, aber sehr sensible Code-Arbeit die vorgesehenen Designer machen.
    Oder sieh dich nach zusätzlichen Dlls um, die DesignerUnterstützung auch für MySql bereitstellen.

    Alternativ kann man auch händisch typisierte Datasetse basteln, DataAdapter codeseits konfigurieren, dass sie korrekt auf das Dataset mappen. Stichwort CommandBuilder.
    Dazu braucht man aber recht viel Erfahrung, die du halt erst sammeln mußt, und mit MySql ist das (Erfahrungen sammeln) bei deiner Konfiguration scheints nicht möglich.

    Effekt wird sein, dass du dich niemals in typisierte Datasetse einarbeitest, und folglich immer untypisierte DB-Programmierung betreiben wirst, ohne die Features nutzen zu können (gugge Was können typisiertes Dataset und DatagridView?), ohne Databinding, ohne Trennung von Gui und Daten, also ohne tragfähige AnwendungsArchitektur überhaupt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hi,

    du ich lese gerade drei Bücher parallel. Gallileo 2 stück und eins von mir (Microsoft Press).
    Das ganze ist so viel und verwirrend.....

    Dort bin ich nun auf typisiertes DataSet, ADO, ..... gestoßen.
    Nu weist du als (DatenBank) einsteiger nicht, was nun das Beste ist.
    Bis ich aber die 1100 Seite durch habe... puhhhhh

    DatenBank und DGV sind meine ersten Ziele.
    - Daten ins DGV einlesen
    - Manipulieren / Neue / Löschen
    - Zurück an Daten Bank

    mehr eigentlich noch garnicht.

    Bei der suche findest du zu viele Informationen.
    Ich schaue mir jetzt mal dein (gugge Was können typisiertes Dataset und DatagridView?) an.

    Mal sehen ob ich durch dein "Fachlatein" durchblicke.

    danke dir
    Bernd

    Edit:
    steig auf Access oder SQLServer oder SQLCe um,
    ich brauche da eine kostenlose sache.

    Bernd schrieb:

    Mal sehen ob ich durch dein "Fachlatein" durchblicke.

    Allerlei Praktische Beispiele zum Fachlatein finden sich auf Movie-Tuts
    evtl. das wichtigste ist das Main.Doc, was bisserl erläutert, was Modellierung im relationalen Datenmodell bedeutet.
    tut mir ja leid - es ist eine Technologie, dazu designed, bestimmte Probleme sauber zu lösen. Aber ohne Fachlatein ist das halt garnet kommunizierbar.
    Wir könntenmal eine WorteSammlung machen, um einen Überblick zu erhalten (soo viel ist das garnet):

    Datenmodell
    • relationales Datenmodell
    • Datenmodell überhaupt
    • Relation / DataRelation / Beziehung
    • RedundanzVerbot
    • 1:n - Relation
    • m:n - relation
    • Primärschlüssel
    • Fremdschlüssel
    • serverseitige / clientSeitige Primkey-Generierung
    Views
    • Parent-Child-View
    • JoiningView
    • Einzelblatt-View

    Und dazu eben die Weisheit, dass das typisierte Dataset ein OOP-Abbild des DB-Datenmodells ist, was also zum relationalen Datenmodell gesagt wird, gilt gewissermaßen immer doppelt: einmal inne DB, zum annern im Dataset.

    Fehlen dir da noch begriffe?
    Hi,
    ich habe seit gestern Nacht mal Microsoft SQL Server gelesen.
    Da sind jede Menge Infos im Netz und ich habe ein Buch von Microsoft Press Verlag.
    Nun bin ich mal ein "wenig" auf dem Stand der Dinge.

    Dein Tut "Daten Bank in 10 Minuten" bzw. "typisiertes DataSet" habe ich auch schon durch.
    Das typisierte DataSet ist ja eigentlich nichts anderes als mit Daten Banken, halt nur mit DataSet.
    Übrigens sehr schön gemacht, gut verständlich, sehr übersichtlich ohne viel schnik schnak.

    So nu frage ich mich, warum hast du mir SQL Server empfohlen ?

    ErfinderDesRades schrieb:

    Ich würd empfehlen: steig auf Access oder SQLServer oder SQLCe um, und lass die triviale, aber sehr sensible Code-Arbeit die vorgesehenen Designer machen.


    Auf fast jeder HP, habe ich hier gelernt, ist MySql installiert.
    Mit VB kann ich Daten, direkt aus MySql, in ein DataSet einlesen.
    Dann müsste es doch auch Möglichkeiten geben, diese mit einer BindingSource zu verknüpfen und an ein DGV weiter zu geben.
    Und rückwärts auch, also DGV , BindingSource DataSet. Und zurück ins Netz.

    Aber warum jetzt SQL Server und nicht MySql ?

    Mich verwirt es ein wenig.


    Die von dir zusammengestellten Begriffe,
    arbeite ich jetzt mal stück für stück durch.
    Aber wie gesagt, dass Buch was hier liegt hat über 1100 Seiten.
    Das dauert halt ein wenig.

    ich danke dir vielmals und aufrichtig.
    Bernd

    Bernd schrieb:

    Aber warum jetzt SQL Server und nicht MySql ?

    weils für SqlServer Assistenten gibt, die dir direkt aus der DB ein passendes typisiertes Dataset generieren, inklusive TableAdapter.

    Ich glaubeja, für MySql gibts sowas mittlerweile auch, nur weißichnich, wo downloaden.

    Zum Lernen also ist Access/SqlServer einfacher, dassmanmalgesehen hat, was geht.

    Grad dieses

    Bernd schrieb:

    Mit VB kann ich Daten, direkt aus MySql, in ein DataSet einlesen.
    wird nämlich ein Riesen-Murks, wie gesagt: ohne Databinding ohne typensicheres Datenmodell, ohne Trennung von Gui und Daten.

    Ohne die Assistenten kann man sich natürlich auch ein passendes Dataset basteln - ich hab sogar einen DataSetAdapter für Access gebastelt, der DataAdapter anhand der Struktur des Datasets konfiguriert, sodassich auf Assistenten-generierte TableAdapter verzichten kann.

    Aber erstmal tätich empfehlen, sowas die Assistenten machen zu lassen, die machens nämlich richtig.
    Selbst wenn sich für MySql keine Assistenten finden, isses immernoch vmtl. sehr lehrreich, nachzugugge, wie die Assis das zB für Access generieren.

    Ach da fällt mir ein: Wennich eine DB-Anwendung entwickeln täte (ich komm jameist ohne DB aus - gugge DB-Programmierung ohne Datenbank)
    würde ich erstmal ohne DB entwickeln, und erst, wenn das Datenmodell wirklich ausgereift ist, die DB aufsetzen.
    Hi Bernd,
    liege ich falsch wenn ich sage Du willst das hier:
    VALUES ('" & TextBox1.Text & "', '" & TextBox2.Text & "','" & TextBox3.Text & "', '" & TextBox4.Text & "')" 'Der Befehl für die DB
    in MySQl speichern und später wieder abfragen, also im Form wieder anzeigen?

    Und das feld für Datum steht auf 'Null' erlaubt?
    Dann würde ICH das tetxfeld für Datum auslesen ob was hat oder nicht und entprechend den SQL-String zuweisen
    Du brauchst für das INSERT keinen Adapter auch kein Dataset. ComanndObject.ExcuteNonquery reicht.


    Meine Signatur
    ich finde nichts so forenabträglich, wie, den Leuten um die Ohren hauen was sie alles nicht wissen.
    Hallo Edwardschn,

    entweder lese ich zuviel oder ich verstehe nicht!
    Seit Tagen versuche ich einen einzigen Datensatz in die DatenBank zu bekommen.
    Gelesen habe ich DataSet, DataTable, TableAdapter usw.......
    Gallileo, MSDN, Google, Microsoft Press Buch.
    Alle Beispiel die ich finde sind etweder mit ADO, SQL oder.........

    Ich finde kein einziges Beispiel für MySql.

    kann doch nicht so schwer sein !


    danke für deinen Hinweis.

    Bernd

    Edwardschn schrieb:

    VALUES ('" & TextBox1.Text & "', '" & TextBox2.Text & "','" & TextBox3.Text & "', '" & TextBox4.Text & "')"
    Dassis genau der Stil, von demich abrate: Keine Typisierung, kein Databinding, keine Unterstützung vom FormDesigner, keine Trennung von Gui und Daten.
    So ganz nebenbei Angriffen vom Typ Sql-Injection Tür und Tor geöffnet:
    Ein böser Bube kann da die lustigsten Sachen in Textbox1 eingeben: Sql-Statements, dien bischen was anneres ausführen, als du vlt. gedacht hast, und auf diese Weise weiß der Kuckuck was mit der DB anstellen.

    Bernd schrieb:

    Seit Tagen versuche ich einen einzigen Datensatz in die DatenBank zu bekommen.
    Schon mit dieser Vorstellung begibst du dich auf einen Weg, der alles, was ADO dir anbietet, in den Wind schlägt (sodass du später dann das Rad neu erfinden mußt, wenn dir aufgeht, dass du die Sachen brauchst).
    Es ist einfach unnötig kurz gedacht "einen Datensatz in die DB bringen", wenn man mit demselben Aufwand auch einen DataAdapter konfigurieren kann, der ganze Tabellen synchronisiert, also neue Datensätze in die DB bringt, gelöschte entfernt, Änderungen updated, und natürlich auslesen (CRUD).

    Hier ein Ansatz, wie man einen DataAdapter konfigurieren kann, mittm CommandBuilder: CommandBuilderSample.
    Damit hast du schoma CRUD, aber noch kein typisiertes Dataset, also Keine Typisierung, kein Databinding, keine Unterstützung vom FormDesigner, keine Trennung von Gui und Daten.
    Zitat
    "Also das speichert jetzt ein Dataset mit 2 verknüpften Tabellen.

    Im beiliegendem Gui kannst du die Tabellen nach Belieben editieren."

    Ich suche ein Beispiel für "einen" einfachen Datensatz.
    Wenn ich das verstanden habe, kümmere ich mich um den nächsten schritt.

    Aber trotzdem danke für die Links. Wenn ich dann soweit bin, das ich DB verstanden habe,
    mache ich genau da weiter.


    danke
    Bernd
    schmeiß einfach eine Tabelle raus aus dem Dataset, kompiliere, und repariere alle entstehenden Fehler (was heißt, dass auch der eine DataAdapter rausfliegt).

    müsste eiglich nicht so schwer sein.

    Nee - im form anfangen: ArtikelGrid rauswerfen, und dann die ArtikelBindingsource.

    Danach erst die ArtikelDataTable weghauen und Zeugs.

    Jo - ist in 30Sekunden zu schaffen ;)