Datensatz über DataSet zu Access-DB hinzufügen - Unperformant?

  • VB.NET

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

    Datensatz über DataSet zu Access-DB hinzufügen - Unperformant?

    Hallo Leute,

    wenn ich momentan einen Datensatz via ADO.Net und einem OleDB-Adapter + DataSet zu einer Access-Datenbank hinzufüge, lade ich über den OleDB-Adapter zunächst alle Datensätze in das Dataset, füge diesem einen Datensatz hinzu und schreibe das gesamte DataSet wieder in die Datenbank.

    Irgendwie kommt mir das ganze etwas "unperformant" vor -
    Gibt es unter ADO.Net keine andere Möglichkeit, einen Datensatz zur DB hinzuzufügen, ohne zuerst alle Datensätze ins Programm zu laden?

    Kann man nicht einen neuen Datensatz zu einem leeren DataSet hinzufügen und dieses DataSet dann zur Datenbank hinzufügen?

    Schon mal vielen Dank im Voraus,
    JoRu1407 ;)
    erst eine Tabelle komplett zu laden ist natürlich Crap.
    Jedenfalls, wenn einziger Zweck sein soll, einen Datensatz zuzufügen und rückzuspeichern.

    Falls es sich um eine DataTable handelt, die keinen anneren DataTables untergeordnet ist, reichts natürlich, der leeren DataTable einen Datensatz zuzufügen, und dann mw. das gesamte Dataset rückzuspeichern.
    Das nette am Dataset ist ja das Change-Tracking, also dasses selbst weiß, welche Datensätze geändert/zugefügt/gelöscht wurden, und die TableAdapter schreiben nur diese Änderungen in die DB zurück.

    In DBExtensions mache ich das zum Prinzip: Dort gibts nur eine einzige Save-Funktion, und die schreibt alle Änderungen aller DataTables in die DB - gibts keine Änderungen, wird halt nix geschrieben :D
    Falls es sich um eine DataTable handelt, die keinen anneren DataTables untergeordnet ist, reichts natürlich, der leeren DataTable einen Datensatz zuzufügen, und dann mw. das gesamte Dataset rückzuspeichern.

    Hallo ErfinderDesRades, vielen Dank für die rasche Antwort!

    Ich habe dich leider noch nicht so ganz verstanden - Momentan füge ich den Datensatz folgendermaßen hinzu (Ist jetzt C# Code / in VB.Net aber ja beinahe gleich):

    VB.NET-Quellcode

    1. OleDbConnection conn = new OleDbConnection();
    2. conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Resources\Vokabeln.mdb;Persist Security Info=False;";
    3. DataSet ds = new DataSet();
    4. OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Vokabeln", conn);
    5. OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
    6. da.InsertCommand = cb.GetInsertCommand();
    7. da.Fill(ds, "Vokabeln");
    8. DataRow neueVokabel = ds.Tables["Vokabeln"].NewRow();
    9. neueVokabel["Fach"] = cmbFach.Text;
    10. neueVokabel["Lektion"] = cmbLektion.Text;
    11. neueVokabel["Frage"] = txtFrage.Text;
    12. neueVokabel["Antwort"] = txtAntwort.Text;
    13. neueVokabel["Stand"] = 0;
    14. neueVokabel["Termin"] = datum.ToString("dd.MM.yyyy");
    15. neueVokabel["Ausgewaehlt"] = false;
    16. ds.Tables["Vokabeln"].Rows.Add(neueVokabel);
    17. da.Update(ds, "Vokabeln");


    Wie kann ich denn jetzt in einer "DataTable" einen Datensatz hinzufügen und und dann das gesamte DataSet zurückspeichern?
    >> Dafür müsste ich doch wieder alle Datensätze aus der Datenbank in das DataSet laden, oder?

    Ich habe mit ADO.Net leider noch nicht viel Erfahrung, da ich mich erst vor Kurzem durchgerungen habe, darauf umzusteigen...
    vergiss erstmal die Datenbank.
    Entwickel deine Anwendung DatasetOnly.
    gugge "DatasetOnly" auf Movie-Tuts, DB-Programmierung ohne Datenbank

    mit deim Ansatz - untypisiertes Dataset - mag ich mich net befassen, das ergibt nur Greulichkeiten und ermöglicht keinen Aufbau eines der vier Views
    Danke, das ist eigentlich eine sehr gute Lösung, weil ich die Access-DB sowieso nicht unbedingt benötige.

    Allerdings habe ich zum reinen Arbeiten mit typisierten DataSets eine Frage:

    Wenn ich nun meine Daten aus einer XML in ein DataSet lade,
    habe ich in meinem Fall in der Spalte "Fach" z.T. doppelte Einträge.

    Wie kann ich nun mit den Datensätzen aus dem typisierten DataSet eine Bedingung wie "GROUP BY Fach" anwenden und mit den daraus resultierenden Datensätzen arbeiten?
    Okay, ich habe nun eine weitere Tabelle "Fächer" hinzugefügt und eine Beziehung hergestellt.
    Mein Problem ist aber: Wie kann ich generell SQL-Bedingungen auf Datensätze in DataSets/DataTables anwenden (Wenn ich z.B. nur Datensätze mit der ID 1 in der Spalte Fach haben möchte)?
    du kannst ein DGV an die Tabelle Fächer binden, und ein anderes DGV an eine untergeordnete BindingSource, die alle Datensätze des angewählten Faches bereitstellt.

    Guck dir den ParentChildview auf DB-Programmierung ohne Datenbank an.

    statt des Fächer-DGVs kannste ebenso eine Combo da anbinden - ist zur Auswahl vlt. angemessener.

    gugge auch vier Views - da sind auch Combos verdrahtet.
    Okay, noch ein anderes Szenario:

    Ich habe folgende beiden Datenbanken, wobei zwischen der ID der Tabelle Fach und der FachID der Tabelle Vokabeln eine Beziehung besteht:

    Spoiler anzeigen
    ---Vokabeln---
    ID
    FachID
    Frage
    Antwort
    Termin

    ---Fach---
    ID
    Fach


    Jetzt möchte ich gerne ausgeben, aus wie vielen verschiedenen Fächern es Vokabeln gibt, deren Wert in der Spalte Termin dem heutigen Datum entspricht.
    Hier finde ich einfach keine andere Möglichkeit, als das ganze mit einer Abfrage zu machen...Oder ich bin in meiner Sichweise viel zu beschränkt auf Datenbanken :D

    Ich meine:
    Es muss doch möglich sein, Abfragen auf Datensätze inenrhalb einer DataTable / eiens DataSets zu machen?
    Es kann doch nicht sein, dass ich Abfragen nur in Verbindung mit Datenbanken machen kann?

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

    Sorry - nicht genau genug gelesen

    JoRu1407 schrieb:

    Jetzt möchte ich gerne ausgeben, aus wie vielen verschiedenen Fächern es Vokabeln gibt, deren Wert in der Spalte Termin dem heutigen Datum entspricht.
    Jo, das würde ich mit Linq abfragen, das hat ja die Gruppierungs-Option.
    Linq ist überbewertet (wie sql auch). Mit glaub 2 Schleifen hat man das Prob aus post#14 auch gelöst.


    Also ich muss mich jetzt nicht unbedingt mit LINQ beschäftigen :D ,
    nur fehlt mir im Moment die Idee, das anders zu lösen...

    Ich versuche halt immer noch, das Ganze Datenbank-Ähnlich zu lösen, weil ich das gewohnt bin.
    Wie könnte ich denn obiges Problem in einer Schleife lösen?

    Ich bin fast soweit, dass ich wieder anfange, mit ADO und Recordsets zu arbeiten :S

    JoRu1407 schrieb:

    Ich bin fast soweit, dass ich wieder anfange, mit ADO und Recordsets zu arbeiten :S
    Jo, merkich, wie du mehr nach Einwänden gegen typDataset suchst, als das du anfängst, mal iwas damit zu probieren.

    JoRu1407 schrieb:

    Wie könnte ich denn obiges Problem in einer Schleife lösen?

    VB.NET-Quellcode

    1. dim count = 0: dim dt=Date.Today
    2. for each rwFach in Dataset.Fach
    3. if rwFach.GetVokabelRows.Any(function(rwv)rwv.Datum >= dt) then count+=1
    4. next
    Hallo ErfinderDesRades,

    vielen Dank für deine Schleife - Das funktioniert!
    Ich werde das ganze Programm jetzt mal auf typisierte DataSets umstellen,
    da ich jetzt zumindest im Ansatz weiß, wie ich das Ganze angehen muss...

    Jo, merkich, wie du mehr nach Einwänden gegen typDataset suchst, als das du anfängst, mal iwas damit zu probieren.

    So solte das eigentlich nicht rüberkommen, denn: Wenn ich lieber mit den "alten" Mitteln arbeiten wöllte, würde ich das Thema ja gar nicht angehen :P

    Naja, auch jeden Fall schon mal vielen Dank!