Fragen zu Dataset->Db

  • VB.NET

Es gibt 51 Antworten in diesem Thema. Der letzte Beitrag () ist von OliverSte.

    Wenn man es im Singular mag. Wie viele Termine hält denn die Tabelle Termin? Oder wie viele Kunden in Tabelle Kunde?
    Mehr als einen Datensatz?

    Im SQL kann man Aliase vergeben wenn man es befremdlich findet bei genau einem Datensatz Termine.Datum anzurufen.

    Es mag zwar die Best Practice des EdR sein mit der Benennung, aber die ist nicht allgemein gültig.
    Dürfte wohl so umstritten sein wie Tab oder Leerstellen als Einzug.

    Für mich umstritten ist das Dataset der falsche Weg. Entity Framework im Model First erspart dir Probleme
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.

    MrTrebron schrieb:

    Es mag zwar die Best Practice des EdR sein mit der Benennung, aber die ist nicht allgemein gültig.
    Aber in allen mir bekannten Naming Conventions steht es so drin.
    So ganz außer der Reihe scheint EdR also nicht zu sein.

    Aber ich weiß, dass es darüber tausend Diskussionen im Netz gibt.
    Meinetwegen mache es jeder wie es ihm beliebt.
    Ich für meinen Teil bleibe beim Singular.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    naja, vlt. sollte ich noch eine Besonderheit "meiner" BestPractice erwähnen, nämlich, dass ich sie auch begründe:
    Im Code hat man stark überwiegend mit dem einzelnen Datensatz zu tun, und wenn des Namen pluralisiert ist, ist das eine falsche Benamung, denn es ist ein Einzelner.
    Also ich empfehle "meine" BestPractice nicht, weil das überall steht, sondern weil ich sie (anders als vielleicht "überall") begründe.

    MrTrebron schrieb:

    Für mich umstritten ist das Dataset der falsche Weg. Entity Framework im Model First erspart dir Probleme


    Ich denke, du meintest "unumstritten". Ich habe von EF schon gehört, mich aber damit nicht beschäftigt, weil "schon wieder was Neues, bevor ich das alte kann".
    Hast du da mal einen geeigneten Einstiegspunkt für mich? Die Tuts vom EDR mit Beispielsolution sind ja meist sehr anschaulich und verständlich. Gibt es sowas in der Art auch zu EF? Ich bin geneigt da mal reinzuschnuppern.
    Danke.
    Obwohl das Ganze fast Offtopic ist, geb ich auch noch Ketchup und Senf dazu: Ich hatte mich zu Singular/Plural auch mal geäußert (ich bin für Plural, MIT Begründung!), eine Reaktion kam nie.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    naschön.
    Wie gesagt, häufiger ist das Arbeiten mit einem Datensatz - seltener mit Tables. Also

    VB.NET-Quellcode

    1. For Each rwAuftrag In MyDataset.Auftrag
    2. '…
    3. Next
    kommt zwar vor, aber deutlich seltener als etwa

    VB.NET-Quellcode

    1. dim rwAuftrag = DirectCast(DirectCast(bsAuftrag.Current, DataRowView).Row, AuftragRow)
    2. 'oder
    3. dim rwAuftrag = ds.AddAuftragRow("hi","ha", "hu")
    4. 'oder
    5. dim rwKategorie = rwAuftrag.KategorieRow
    etc.

    Die pluralisierte Entsprechung wäre:

    VB.NET-Quellcode

    1. dim rwAuftraege = DirectCast(DirectCast(bsAuftraege.Current, DataRowView).Row, AuftraegeRow)
    2. 'oder
    3. dim rwAuftraege = ds.AddAuftraegeRow("hi","ha", "hu")
    4. 'oder
    5. dim rwKategorien = rwAuftraege.KategorienRow


    Also es ist ein Dilemma: Eine für alle Fälle korrekte Benamung kann nicht gefunden werden - ich bevorzuge die, bei der ich mit weniger "falsch" benamten Code zu tun habe.

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

    8| Ich glaube nicht, dass ich davon geschrieben habe, alles im Plural zu benennen, sondern die DataTables.
    Natürlich ist eine DataTableRow im Singular:

    VB.NET-Quellcode

    1. Dim Auftrag = DirectCast(DirectCast(bsAuftraege.Current, DataRowView).Row, AuftraegeRow)
    2. Dim NeuerAuftrag = ds.AddAuftraegeRow("hi","ha", "hu")
    Denn es ist eben 1 Auftrag. Da die Table aber viele Aufträge enthält, sollte sie m.E. im Plural benannt werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    aber glatt wird es dadurch immer noch nicht

    VB.NET-Quellcode

    1. Dim Auftrag As AuftraegeRow
    2. Dim NeuerAuftrag = ds.AddAuftraegeRow("hi","ha", "hu")
    auch unschön, einen Singular plural zu deklarieren, oder einem Singular einen Plural zuzuweisen.

    Wie gesagt:

    VB.NET-Quellcode

    1. dim rwAuftrag As AuftragRow
    2. dim rwAuftrag = ds.AddAuftragRow("hi","ha", "hu")
    3. dim rwKategorie = rwAuftrag.KategorieRow
    sieht mir am sinnigsten aus, und am einheitlichsten.

    Aber ich denke, reicht jetzt - mir zumindest.
    Bin nun genug drauf eingegangen.
    Ein großer Punkt entspricht doch dem gehampel mit Dataset und Rows.
    Obwohl auch da ja eben nachvollziehbar ist, eine Tabelle ist eine Sammlung von einzelnen was auch immer. Ist ein Datensatz ein Kunde, dann sind in der Tabelle viele Kunden.

    Arbeitet man mit Objekten, also z. B. Kunde, dann wird man sich ganz schnell sagen, wenn ich mehrere gleiche Kunden zusammen fassen will ist es eine Collection oder eine Liste<of>.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Der Exkurs zur Benennung von Entitäten ist mal wieder ergebnislos verlaufen, denn da hat ja ein jeder seine Meinung. Leider wurde mein schöner "Fragen zu Dataset->DB"-Thread dadurch ein wenig unübersichtlich, aber darum kümmert sich vielleicht ein Admin (löschen) oder auch nicht.

    Nun gehe ich mal weiter zum Thema.
    Ich habe mich mit DGV und Comboboxen a la VierViews von @ErfinderDesRades beschäftigt. Klappt soweit wunderbar, ich bekomme über die Combobox die ParentRow angezeigt.
    Doch sobald ich das Programm beende, also einfach das Fenster schließe, dann knallt's. Also nicht hörbar, sondern es werden mehrere Exceptions gefeuert.
    Die Fehlermeldung ist DataGridViewComboBoxCell-Wert ist ungültig. und kommt mehrfach. Nach jedem Wegklicken ändert sich das DGV, die Felder werden geleert. Guckt doch bitte mal eben in die Dateianhänge.

    Dasselbe passiert, wenn ich das Dataset in die DB speichere, also _Persistance.Save() aufrufe. Tatsächlich werden neue Datensätze aber übernommen.

    Ich bitte um ein wenig Hilfe. Das erste Problem wird mit meiner Dummheit zusammenhängen und bestimmt einfach zu lösen sein.
    Bilder
    • DataGridViewComboBoxCell-Wert ist ungültig.jpg

      19,26 kB, 341×209, 42 mal angesehen
    • DGV 1.jpg

      17,92 kB, 377×152, 31 mal angesehen
    • DGV 2.jpg

      16,77 kB, 408×131, 31 mal angesehen
    • DGV 3.jpg

      16,51 kB, 421×124, 28 mal angesehen
    • DGV 4.jpg

      16,25 kB, 386×127, 25 mal angesehen
    • DGV 5.jpg

      18,56 kB, 518×156, 33 mal angesehen
    • Update fehlgeschlagen 1.jpg

      66,16 kB, 552×567, 35 mal angesehen

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

    Was passiert, wenn Du beim Beenden (FormClosing-EventHandler) den DGVs die DataSource wegnimmst (auf Nothing setzt), ggf. auch den BindingSources die DataSource wegnimmst?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja dann geht das ohne Knirschen. Ich habe das für 2 von 4 DGVs gemacht (Mitarbeiter und untere Termine).
    Aber jetzt pass auf. Der EDR hat da in einem Tut mal was von Wiederverwendbarem Code in Regions geschrieben. Da steht im FormClosed sowas:

    VB.NET-Quellcode

    1. Me.Validate() 'DGV kriegt beim Disposen einen ZeilenIndex-Fehler, wenn sich die AnfügeZeile im Edit-Modus befindet
    2. Me.SuspendLayout()
    3. With Me.Controls
    4. 'Controls können sich auch gegenseitig disposen, über Events. Dieses hier disposed ganz sicher immer das letzte Element was noch da ist
    5. While .Count > 0 : .Item(.Count - 1).Dispose() : End While
    6. End With


    Dann geht es auch ohne Wegziehen der BindingSources. :/

    Ach Gott, die WinFormHelpers. Da isses ja drin enthalten. Man muss die nur einbinden und in StartShown() das Dataset registrieren. Start heißt mein Form.
    (In der c# Solution gibt es den Fehler beim Beenden nicht ?( Ich hab die Helpers trotzdem mal eingebunden ...)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „OliverSte“ ()

    WinFormHelpers machen Probleme

    Ein Problem ist gelöst, steht auch schon das nächste an.
    Ich habe die WinFormHelpers von @ErfinderDesRades eingebunden und das DataSet registriert. So gibt es keine Fehler mehr bezgl. der BindingSources.
    Wenn ich einen Mitarbeiter, der nicht mal Termine hat, lösche, kommt nun diese Fehlermeldung.
    Das passiert nur mit den WinFormHelpers. Es ist egal, welche Fremdschlüsseleinschränkung eingestellt ist, (NONE oder CASCADE).
    Bilder
    • Zustand der DB.jpg

      56,52 kB, 537×619, 37 mal angesehen
    • Datensatz gelöscht (Cascade).jpg

      101,51 kB, 631×639, 39 mal angesehen

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

    Ja gern.
    Das Solution Backup habe ich mit deinem SolutionExplorer erstellt. Das Main-Projekt ist MysqlTest.
    Zunächst die beiden defekten Verweise im Subprojekt MySqlHelpers reparieren:
    per NuGet MySql.Data v6.10.9 installieren
    beide Verweise (Mysql.Data und MiniHelpers) neu erstellen (löschen, neu anlegen)
    Dann kompiliert das.

    Starten - [Verbinden] klicken - Mitarbeiter "Asia" löschen - Bämmm!

    Ach noch was. Die Zugangsdaten zu meinem MySQL-Server sind in den Einstellungen gespeichert. Über die Form "Telefonbuch" können auch andere eingegeben werden.
    Der MySQL Server darf gern zum Testen benutzt werden. Das Datenmodell entspricht dem Dataset "TermineDts".

    Danke für die Hilfe.
    Dateien
    • MysqlTest00.zip

      (164,49 kB, 45 mal heruntergeladen, zuletzt: )
    tja, weiss auch nicht, warum das sonst immer funztete. Bei dir jetzt jedenfalls ist der DatasetAttach uninitialisiert.
    folgender Fix behebt das:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' registers all datasets of this type and all bindingsources of the form, to improve performance and to avoid data-redundance
    3. ''' </summary>
    4. <Extension()> _
    5. Public Function Register(Of T As DataSet)(dts As T, frm As Form, handleFormClosing As Boolean) As T
    6. [...]
    7. Register.Attach ' Initialisiere DatasetAttach <- diese Zeile zufügen
    8. End Function

    Da sag ich mal ganz artig "Dankeschön" :D
    Das hat in der Tat geholfen.
    Schon tut sich das nächste Problemchen auf. Ich lege einen neuen Mitarbeiter an (ID=-1) und einen neuen Termin mit diesem Mitarbeiter.
    Beim Speichern kommt die Ausnahme "Der DataGridViewComboBoxCell-Wert ist ungültig.". Mit Erscheinen der Fehlermeldung ist die Mitarbeiter.ID getauscht (in MitarbeiterDGV). Nach dem ersten Wegdrücken ist der Mitarbeiter.Name (in TerminDGV) weg, nach dem zweiten Wegdrücken ist alles schick, dann wurde wohl auch in Termine die temporäre ID gegen die tatsächliche ausgetauscht.
    Wenn man nach dem Anlegen eines neuen Mitarbeiters zunächst speichert, passiert das natürlich nicht.

    OliverSte schrieb:

    Wenn man nach dem Anlegen eines neuen Mitarbeiters zunächst speichert, passiert das natürlich nicht.


    Jo, würd ich auch immer so machen. Ich hatte immer das Problem, dass nach Löschen von Datensätzen die Probleme bei z.B. einer anschließenden Neuanlage oder einem Edit kamen.
    Wenn ich jetzt nach dem Löschen speichere (bzw. eigentlich immer direkt speichere) dann hab ich keine Probleme mehr.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Na ja, ne, wenn ich dem DGV die DataSource vorm Speichern wegnehme, klappt es ja problemlos.
    Das aber sollte doch von den WinFormHelpers gemacht werden, so dachte ich jedenfalls. Dort scheint es ein Problem zu geben oder @ErfinderDesRades?