Wie Dataset, Tableadapter usw. sauber entfernen?

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von rickomanio.

    Wie Dataset, Tableadapter usw. sauber entfernen?

    Hallo zusammen! :)

    Ich bin Neuling in Visual Basic und möchte gerne ein kleines Programm basteln, mit dem ich auf eine lokale SQL Datenbank zugreifen kann. Das Ganze würde ich gern mithilfe des DataSets machen, habe da aber einige Probleme..

    Ich habe mir testweise eine lokale SQL Datenbank über Visual Studio erstellt und mit einer Tabelle befüllt. Dann habe ich eine Datenquelle in Form eines DataSets hinzugefügt. Nun kann ich ja einfach die Tabelle aus dem Datenquellenfenster in meine leere Form ziehen und habe automatisch den BindingNavigator und die Tabellenfelder oder das DatagridView. Nehmen wir an, ich hätte vorher schon die Felder der Tabelle in der Datenbank gefüllt, dann würde ich die Daten nun auch sehen, wenn ich mein Programm ausführe (über "Starten" in Visual Studio. Nun mein erstes Problem: Ändere ich Werte in dem Formular und speichere Sie ab, werden Sie anscheinend nicht in die Datenbank übertragen. Starte ich das Programm neu, sind die eingetragenen Werte meist auch wieder weg. Wenn ich das Programm ausserhalb von Visual Studio starte, als z. B. in dem Debug Ordner, dann werden Datenänderungen auch in der dortigen Datenbank gespeichert. Wieso ist das so?

    Zweites Problem: Wie entferne ich sauber ein DataSet mitsamt den TableAdaptern usw.? Wenn ich das DataSet einfach nur aus dem Projekt Explorer lösche und später ein neues hinzufüge und mir das DataSet wieder in die Form ziehe, bekomme ich immer den Fehler "Der Typ Test.DAtabase1DataSetTableAdapters.TableAdapterManager+UpdateOrderOption ist im Zielframework nicht verfügbar".

    Ich finde das DataSet wirklich praktisch, wenn man relativ einfach mal die Daten aus der Datenbank in der Form anzeigen lassen will, aber das bringt mir nichts, wenn ich meine ganze Form löschen muss, wenn ich das DataSet ändern muss. ?(

    Ich hoffe jemand kann mir helfen und mir das erklären ^^

    Grüße

    Erik
    ich empfehle ja immer, ohne Datenbank zu entwickeln.

    Eine DB kann man noch hinterlegen, wenn die Anwendung fertig ist.

    rickomanio schrieb:

    aber das bringt mir nichts, wenn ich meine ganze Form löschen muss, wenn ich das DataSet ändern muss.
    Naja, wenn du das Dataset auffn Kopf stellst, ja, dann musste natürlich auch das davon abhängige Form komplett neu machen.
    Übrigens, mit einer DB im Hintergrund kannst du nicht einfach das Dataset ändern - nixda!
    Da musste die Db ändern, dann das Dataset neu generieren, dann das Form neu machen.

    Hier ein klein Komplett-Programm zur Entwicklung von Datenverarbeitungen:
    codeproject.com/Articles/1030969/Relational-Datamodel
    Es sind 3 aufeinander aufbauende Artikel.

    Das sollteste alles drauf haben, und imo machts vorher nur wenig Sinn, sich eine Db ans Bein zu binden. Eine Db macht zunächst mal alles nur um ein Vielfaches komplizierter. Wirklichen Nutzen bringt die erst, wenn du Multi-User-Anwendungen entwickelst (was bei uns Hobby-Programmierern so gut wie nie der Fall ist ;) ).
    Wo speichert die Anwendung dann die Daten, wenn nicht in einer Datenbank?
    Es soll ja schon so sein, das die Anwendung auf mehreren Rechnern (nicht in einem Netzwerk) läuft und die dort gesammelten Daten dann in irgendeiner Form zu mir geschickt werden. Aber das könnte ich ja auch mit einem XMl oder CSV Export realisieren..wenn ich das dann irgendwann mal drauf habe :D

    Ich kann also ein DataSet ohne Datenbank erstellen und dort auch richtig Daten speichern? Das klingt ja nicht schlecht, ich lese mir den link mal durch, Danke!
    Na so schlimm ist's ja auch nicht wenn man noch was an der Datenbank ändern muss. Man kann doch einfach die Tableadapter löschen und wieder neu hinzufügen. Natürlich muss man dann im Formular die Bindinsources etc. auch wieder aktualisieren. Aber prinzipiell ist es doch nicht so schlimm wenn sich nicht gerade die komplette Db-Struktur ändert (aber da würde es ja wohl auch keinen Sinn machen die Formulare etc. zu behalten). Allerdings sollte man m.E. nicht versuchen das komplette DAtaset zu löschen und neu einzufügen sondern die einzelnen TableAdapter. So hat das bei mir mit hinzugefügten Feldern u.ä. ganz akzeptabel funktioniert.
    Dann verstehst du entweder richtig was davon, oder hattest vlt. auch einfach nur Glück.
    Weil je nach dem, was geändert wird, ists mal unproblematisch mal höchst problematisch.

    Btw verwendest du den generierten TableAdapterManager?
    Nach meiner Erfahrung zumindest ist das der Ober-WackelKandidat, wenn man an den typ TableAdaptern rumgefummelt hat. Der fängt anschließend eiglich immer das Spinnen an.

    Aber egal, was ich eiglich loswerden wollte: Wenn die Dataset-Struktur geändert wird - wie gesagt: je nachdem was gemacht wurde - dann passiert überaus leicht, dass anschließend das davon abhängige Form im Eimer ist.
    Also "hinterher das Form anpassen" ist nicht, denn der Designer kann das Form garnimmer anzeigen.
    Weil er stürzt ab beim Versuch, Bindings an Tabellenspalten zu konfigurieren, die garnimmer mehr da sind, oder anders heißen (was für den Designer ja dasselbe ist).

    Also 3 nützliche Ratschläge:
    1. Machen Sie Sicherheitskopien!
    2. Machen Sie Sicherheitskopien!
    3. Machen Sie Sicherheitskopien!
    Entweder mit einem Zipping-Tool, wie etwa SolutionExplorer - OpenSource eines ist, oder eben gleich mit einem Versionskontroll-System - das erfordert aber etwas mehr Einarbeitung.

    Und die Backups auch ausprobieren, ob die wirklich lauffähige Soluttions restaurieren.
    Da kannste nämlich fein Backup machen, änderst die Datenbank, und das Restaurierte stürzt dann trotzdem ab, weil die Db halt nicht mit-gebackupt ist.
    (Was übrigens ein weiterer Grund ist, ohne Db zu entwickeln, denn eine Xml-Datei als Datensenke mitzuzippen ist ja kein Thema, während bei serverbasierten Datensenken wie MySql wüsste ich garnet, wie man da überhaupt backuppen können sollte)

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

    Der Anwendungsfall sieht doch stark nach zentraler Datenbank aus.
    Wie sollen denn sonst die Daten bei allen Gleich gehalten werden?

    Sourcecodeverwaltung ist auf jeden Fall ratsam. Gut, SVN oder Visual Studio Online ( Ich glaub der neue Name ist Team Services) ist aber eher zu empfehlen.

    Und einen MySQL oder MS SQL Server zu sichern ist auch einfach.
    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:

    Und einen MySQL oder MS SQL Server zu sichern ist auch einfach.
    Kannst du vlt. noch Hinweise geben, wie im Einzelnen da vorzugehen ist?

    Und ich sehe ja auch das Problem, dass das SourceCode-Backup mit dem Datenbank-Backup verknüpft sein muss, also wenn man restauriert, muss ja beides genau zueinander passend restauriert sein.
    Bin da jetzt eher so der MS SQL Mensch, aber
    msdn.microsoft.com/de-de/library/ms187510(v=sql.120).aspx
    Geht auch inkrementell.
    Man kann sich auch ein Skript erstellen lassen welches das DB Schema beinhaltet.
    MySQL bietet da auch Tools.

    Bei dem was ich als Aufgabenstellung oben verstanden habe, wird auch zuerst die Datenbank mit allen ihren Prozeduren und Ansichten erstellt. Danach nur noch der Client.
    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.
    Hey Leute,

    erstmal danke für eure Tipps! Ich habe die SQL Datenbank nun erstmal weggelassen und speichere die Daten in ein Dataset. Das klappt auch alles wirklich gut. Nun hab ich aber noch eine Frage zu den Bindingsource Positionen:

    Ich habe im Dataset eine Tabelle Rehamittel und Bewohner. Bewohner ist die parent, Rehamittel die child. In der Form gibts die Tabs Rehamittel und Bewohner. Im Tab Rehamittel habe ich ein DGV für die Rehamittel. Dieses läuft über die Bindingsource BsRehamittel. Im Tab Bewohner gibts Felder, die die Bewohnerdaten anzeigen und dazu noch ein DGV, welches die Rehamittel der Bewohner anzeigt. Das DGV dort hat als Bindingsource die Rehamitteltabelle, allerdings über den Fremdschlüssel der Bewohnertabelle (heißt noch FKBewohnerRehamittelBindingSource).
    Nun soll er beim Doppelklick auf ein Rehamittel in dem DGV im Tab Bewohner automatisch in den Tab Rehamittel springen und dort das entsprechende Rehamittel anzeigen. Mein Problem ist eben, dass der Rowindex der DGV im Tab Bewohner nicht mit dem BsRehamittel übereinstimmt. Ich kann das zwar lösen, indem ich mir die ID der Zeile nehme und die BsRehamittel danach filtere, dann habe ich aber diesen Filter drin und man kann dort keine weiteren Rehamittel sehen.

    Habt ihr eine Idee?

    Grüße

    Erik
    nein, vom FW vorgegeben ist da zwar was, aber nichts brauchbares.
    Filtern ist schon nicht verkehrt gedacht, aber tatsächlich willst du den Datensatz doch aufsuchen (Also du willst BindingSource.Positon setzen).
    Und da hilft halt nichts, man muss alle BindingSource-Item durchgehen, bis man es gefunden hat.
    Ich hab mir dafür eine kleine Extension geschrieben:

    VB.NET-Quellcode

    1. '''' <summary> stellt die angegebene DataRow ein </summary>
    2. <Extension()> _
    3. Public Function MoveToRow(bs As BindingSource, row As DataRow) As Boolean
    4. If row Is DirectCast (bs.CurrentItem, DataRowView).Row Then Return True
    5. If bs.IsBindingSuspended Then Return False
    6. Dim dv = DirectCast(bs.List, DataView)
    7. For i As Integer = 0 To bs.Count - 1
    8. If dv(i).Row Is row Then
    9. bs.CancelEdit() 'ansonsten setzter u.U. beim Moven die vorherige Row auf Rowstate.Changed
    10. bs.Position = i
    11. Return True
    12. End If
    13. Next
    14. Return False
    15. End Function
    Wie gesagt: Es gibt zwar eine BindingSource.Find() - Funktion, die baut aber Mist, wenn du in einer untergeordneten BindingSource suchst.
    In deim Fall suchst du zwar in einer unabhängigen BS, aber um dir spätere Überraschungen zu ersparen, gewöhn dich erst garnet an die buggy-Function.

    Achso, falls du Extensions garnet kennst: Extensions und mehr.

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

    Okay, das probier ich mal aus.

    Würde es vllt. auch funktionieren, nach dem Sprung ins gefilterte Rehamittel, dieses automatisch zu selektieren und dann die Position abzufragen, in eine Variable zu speichern, den filter zu entfernen und die Position an das Bs zu übergeben?
    nein, denn inne gefilterten BS ist die Position anders als im ungefilterten.

    (Also wenn ich dich recht verstanden habe, weil in wirklichkeit gibt deine Frage keinen rechten Sinn - was bedeutet "Sprung ins gefilterte Rehamittel"? und welche BS ist gemeint mit "Bs"? - hier im Thread werden bereits 3 BS erwähnt)
    Ich meinte die BsRehamittel, aber wenn die Positionen im gefilterten eh anders sind, als im ungefiltertem BS, dann hat sich das erledigt. ^^

    Ein Rehamittel ist übrigens wirklich nur einem Bewohner zugeordnet. Ob die sich in Wirklichkeit dann ein Pflegebett teilen, soll mir ja egal sein. :D

    ErfinderDesRades schrieb:


    VB.NET-Quellcode

    1. '''' <summary> stellt die angegebene DataRow ein </summary>
    2. <Extension()> _
    3. Public Function MoveToRow(bs As BindingSource, row As DataRow) As Boolean
    4. If row Is DirectCast (bs.CurrentItem, DataRowView).Row Then Return True
    5. If bs.IsBindingSuspended Then Return False
    6. Dim dv = DirectCast(bs.List, DataView)
    7. For i As Integer = 0 To bs.Count - 1
    8. If dv(i).Row Is row Then
    9. bs.CancelEdit() 'ansonsten setzter u.U. beim Moven die vorherige Row auf Rowstate.Changed
    10. bs.Position = i
    11. Return True
    12. End If
    13. Next
    14. Return False
    15. End Function



    Kannst du mir vllt. noch sagen, was ich der extension nun eigentlich als Argument übermitteln muss? Die Extension sieht für mich noch bisschen kompliziert aus 8|

    Muss das dann so aussehen?:

    FKBewohnerRehamittelBindingSource.SpringezuZeile(FKBewohnerRehamittelBindingSource.Current)

    ..dann bekomme ich aber einen Fehler, dass ich den Typ datarowview nicht in datarow umwandeln kann.

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

    rickomanio schrieb:

    Nun mein erstes Problem: Ändere ich Werte in dem Formular und speichere Sie ab, werden Sie anscheinend nicht in die Datenbank übertragen. Starte ich das Programm neu, sind die eingetragenen Werte meist auch wieder weg. Wenn ich das Programm ausserhalb von Visual Studio starte, als z. B. in dem Debug Ordner, dann werden Datenänderungen auch in der dortigen Datenbank gespeichert. Wieso ist das so?


    weil du die änderungen nicht an die database übermittelt hast sondern nur ans dataset bzw table adapter. mit der update funktion des tableadapters wären die daten auch an die db übermittelt. desweiteren musst du deine db auf "nur kopieren wenn neu" einstellen.
    Hier könnte meine Signatur stehen.

    rickomanio schrieb:

    Muss das dann so aussehen?:
    es muss so aussehen:

    VB.NET-Quellcode

    1. FKBewohnerRehamittelBindingSource.MoveToRow(DirectCast(FKBewohnerRehamittelBindingSource.Current,DataRowView).Row)
    Das ist bisserl umständlich, DataRows aus einer BindingSource zu puhlen, auch dafür habich Extensions geschrieben. Aber nimm erstmal den Aufruf wie hier gezeigt.
    Dann kommt nur alles darauf an, dass du die Extension richtig in ein Modul packst, aber dafür habichja das Extension-Tut verlinkt.
    (Jedenfalls kein Wunder, dass dir die Extension selbst umständlich vorkommt, deswegen schreibt man ja Extensions: Damit Umständlichkeiten ein für allemal erledigt sind, und die Aufrufe dann einfach.)


    Zur Umständlichkeit mitte Bindingsources und vieles mehr habich auch tuts, also bei Interesse...
    ja, aber hast du mit meinem Snippet denn nun was funzendes hingekriegt?

    also diesem und folgenden post liegt Code bei, wo Extensions in einem HelpersProjekt genutzt werden: Daten laden, speichern, verarbeiten - einfachste Variante
    vlt. ist auch das ganze Tut von interesse, aber ist halt viel, und enthält nichts neues zum englischen tut.
    ach das englische überhaupt: Ist dir aufgefallen, dass das Sample zumindest des 3. Artikels auch eine Helpers-Bibliothek enthält?

    Hier nochmal ein Visueller Rundumschlag (viele Videos) zu DatasetOnlies Möglichkeiten: vier Views-Videos
    Im Prinzip der Stoff aus dem englischen Tut, optisch netter, aber erreicht nicht die Systematik des englischen.

    Hier der gesamte Lernstoff, wenn man eine Datenverarbeitung hinkriegen will: Datenverarbeitungs-Vorraussetzungen
    Man denkt vlt, man könne was auslassen davon, aber das holt einen immer ein (bzw wenn nicht, dann umso schlimmer).


    jdfs. meine Helpers-Projekte enthalten meist eine BindingSourceX.vb - Datei mit allen Extension-Methods, mit denen ich mir die Arbeit mit BindingSources erleichtere.
    Setzt halt vorraus, dass man Helpers-Projekte überhaupt einbinden kann, aber dass man viel mehr Grundlagen braucht, als ein Anfänger denkt, wird ja in Datenverarbeitungs-Vorraussetzungen glaub so leidlich deutlich.
    Und die Grundlagen werden da ja nicht nur aufgezählt, sondern zu Tutorials und Büchern ist ja ganz praktisch verlinkt.

    Wolle noch ein Tut zum Thema Extensions? Extensions und mehr.

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