Frage zu Dataset und Join

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von MemoAnMichSelbst.

    Frage zu Dataset und Join

    Hi,

    also im Normalfall arbeite ich ja direkt auf einer Datenbank und nicht mit den in VS gegebenen Mitteln.
    Nun habe ich aber eine Problemstellung anhand derer ich gerne ein wenig mit Datasets arbeiten würde.

    Bislang arbeite ich mit Datasets wenn ich mir bestimmte Daten in ein Datagrid lade, sodass ein Anwender in diesem Änderungen tätigen kann.
    Hier arbeite ich aber immer nur auf EINER Datenbanktabelle...

    Dort gehe ich wie folgt vor:

    Im Kopf die Definition:

    VB.NET-Quellcode

    1. Dim myDA As OleDbDataAdapter
    2. Dim myDataSet As DataSet

    Zum laden:

    VB.NET-Quellcode

    1. Dim con As OleDbConnection = New OleDbConnection(ConStrSQL)
    2. Dim cmd As OleDbCommand = New OleDbCommand("SELECT ID, (LTrim(RTrim(StrackNorm1)) + LTrim(RTrim(StrackNorm2))) As [Strack Norm], LTrim(RTrim(StrackNorm1)) AS [Strack Norm1], LTrim(RTrim(StrackNorm2)) AS [Strack Norm2], Benennung, AufgenommenAm AS [Aufgenommen am], GesperrtAm AS [Gesperrt am], Bemerkung, Ansprechpartner FROM Pa_GeloeschteArtikel ORDER BY StrackNorm2", con)
    3. con.Open()
    4. myDA = New OleDbDataAdapter(cmd) builder As OleDbCommandBuilder = New OleDbCommandBuilder(myDA)
    5. myDataSet = New DataSet()
    6. myDataSet.CaseSensitive = False
    7. myDA.Fill(myDataSet, "MyTable")
    8. GeloeschteArtikelDataGridView.DataSource = myDataSet.Tables("MyTable").DefaultView
    9. GeloeschteArtikelDataGridView.Columns(0).Visible = False
    10. GeloeschteArtikelDataGridView.Columns(1).ReadOnly = True
    11. con.Close()
    12. con = Nothing

    Zum speichern:

    VB.NET-Quellcode

    1. If Me.myDataSet.HasChanges Then
    2. If MessageBox.Show("Wollen Sie die Änderungen speichern?", "Speichern", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
    3. Me.Validate()
    4. Try
    5. Me.myDA.Update(Me.myDataSet.Tables("MyTable"))
    6. Catch ex As Exception
    7. MessageBox.Show(ex.ToString)
    8. End Try
    9. Me.myDataSet.AcceptChanges()
    10. End If
    11. End If


    Nun habe ich aber in meiner Problemstellung ein etwas anderes Bild.
    Ich habe die Datenbank (Access 2013) in VS als Datenquelle eingetragen (sie aber nicht dem Programm hinzugefügt, sondern sie liegt noch immer in nem Netzwerkordner).
    Dadurch hat mir VS ja nen DataSet erstellt.
    Das ganze sieht dann so aus:

    Wenn sich jetzt jemand fragt, warum dort ID steht und was die PKs sind... Es handelt sich hierbei um ein Dump einer Progress-Datenbank in eine CSV, welche in Access importiert wurde. Hier werden nicht alle Felder benötigt, aber die kompletten CSVs importiert.
    In Access kann ich mir die Daten die ich benötige mittels:

    SQL-Abfrage

    1. SELECT Verbrauch_FueEle_2017_2013.Teil, Verbrauch_FueEle_2017_2013.Suchbegriff, Verbrauch_FueEle_2017_2013.TGr, Verbrauch_FueEle_2017_2013.TA, Verbrauch_FueEle_2017_2013.Meldebestand, Verbrauch_FueEle_2017_2013.MeldNeu, Verbrauch_FueEle_2017_2013.[Gesamtsumme von Verbrauch], Verbrauch_FueEle_2017_2013.Verbrauch_durchschnitt, Verbrauch_FueEle_2017_2013.DiffMeldVerbrauch, Verbrauch_FueEle_2017_2013.HptlLief,
    2. E_ArtLiefStaffel_Prod_20130909.gueltig_ab, E_ArtLiefStaffel_Prod_20130909.gueltig_bis, E_ArtLiefStaffel_Prod_20130909.abMng, E_ArtLiefStaffel_Prod_20130909.Preis, E_ArtLiefStaffel_Prod_20130909.Aktiv, E_ArtLiefStaffel_Prod_20130909.Staffel, E_ArtLiefStaffel_Prod_20130909.Inaktiv
    3. FROM Verbrauch_FueEle_2017_2013
    4. LEFT JOIN E_ArtLiefStaffel_Prod_20130909
    5. ON (Verbrauch_FueEle_2017_2013.HptlLief = E_ArtLiefStaffel_Prod_20130909.LiefNr)
    6. AND (Verbrauch_FueEle_2017_2013.Teil = E_ArtLiefStaffel_Prod_20130909.Teil)
    7. WHERE (((E_ArtLiefStaffel_Prod_20130909.Inaktiv)=False))
    8. ORDER BY Verbrauch_FueEle_2017_2013.Teil, E_ArtLiefStaffel_Prod_20130909.abMng;

    so zusammenfügen wie ich es möchte.

    Wie kann ich sowas in VB umsetzen (Programmgesteuert. Nicht im Designer)?
    Ich habe das Problem, dass der Commandbuilder auf Select-Abfragen mit einem Join keine Update-Routinen erstellen kann.
    Ich möchte bestimmte Änderungen im Code (sprich in nem Lauf) ändern lassen, was mir so mit einer SQL Abfrage nicht möglich ist.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    Na, wie E_ArtLief:
    Hier setzt sich der Main (PK) aus
    zusammen.

    Diese Daten werden aus der Datenbank heraus gedumpt und sind somit also komplett logikfrei! Sie werden ebenso ohne Logik in Access importiert.
    Daran ist erst einmal nichts zu ändern.

    Nun muss in VS irgendwie mit den vorhandenen Mitteln zurecht gekommen werden.
    Wenn es nötig ist ne Relation zu hinterlegen, muss das im Code erfolgen. Ich bin da aber bisl überfordert, muss ich gestehen.
    Zudem gibt es noch mehrere Indizes welche zur Verknüpfung verwendet werden. Insgesamt verfügt allein diese Tabelle über 9 verschiedene Indizes welche immer aus mehreren Spalten der Tabelle bestehen, über die andere Tabellen verknüpft werden. Diese Logik ist rein in der Datenbank, wird aber nicht mit heraus gedumpt.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    Ahoi,

    also du willst jetzt aus den DataSets die Daten Abfragen ?
    Hast du es schon mit LINQ versucht ?
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Mein Problem ist, ich will nicht nur abfragen...
    Ich möchte dort Daten drin ändern und in die Access-DB zurückschreiben.

    Es muss ja irgendwie möglich sein, in nem Dataset ne Art Abfrage zu generieren welche Daten aus mehreren Tabellen entählt, diese zu ändern und zu speichern.

    Kann ja nicht sein, dass man hierfür weiterhin mit Recordsets arbeiten muss, welche das Ganze spielend können aber aus Zeiten von VB6 stammen.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Also deine Daten im Dataset Updaten solltest LINQ drauf haben. Join über die Tables im DS sollten eigentlich auch kein Problem sein.
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Bevor du in diese Tabellen was schreibst, stelle bitte die Logikregeln wieder her.
    Die zugehörigen SQl-Befehle lauten etwa so: Alter Table ADD Constraint,... Add Index, Drop Index usw. ( ohne irgendwo nachgeschaut zu haben)
    bei Schreiben kannnst du mit SQl typischerweise nur einzelne Zeilen hinzufügen INSERT. Es gibt noch BULK INSERT ist aber schwer
    du kannst prinzipiell problemlos die erforderlichen Relationen deim typDataset zufügen, und hast im weiteren alle Optionen, wie in vier Views-Videos gezeigt.

    Nur beim Abspeichern in die DB? Csv? whatever? musst du u.U. sehr sorgfältig vorgehen, dass du da keine Inkonsistenzen erzeugst.
    Dataset verfügt ja über eine Änderungsverfolgung, also jede DataRow ist eindeutig markiert, ob sie gelöscht, neu zugefügt, geändert oder unverändert ist.
    Beim Speichern in eine richtige DB sind diese verschiedenartigen Änderungen in Abhängigkeit mit der hierarchischen Ordnung der Tabellen unterschiedlich zu behandeln.

    Aber du sagst ja, dass in deiner DB ühaupt keine Hierarchie vorliegt - dann ists. u.U. auch egal, und du kannst für jede Tabelle schlicht DataAdapter.Update() aufrufen und fertig.
    Also verstehe ich das richtig... Ich arbeite mit LINQ auf den Tabellen und kann damit einen Join bewerkstelligen...

    Bislang benutz ich LINQ meist nur wenn ich irgendwo mit ner List(of Class) arbeite, aber sollte ja recht leicht zu verstehen sein.

    Ja, du hast richtig verstanden, die Logiken in der Access Datenbank sind schlicht nicht vorhanden. Sie dient nur als "Zwischenspeicher" da ich mit VS nicht direkt auf die richtige Datenbank zugreifen kann, da der ODBC-Treiber Freitexte nicht unterstützt.

    Vielleicht wäre es sogar einfacher die CSV-Dateien nicht erst in Access zu importieren sondern direkt in nen Dataset zu laden?
    Gibt es denn ne gescheite Funktion, die Tabellen eines Datasets wieder als CSV zu exportieren?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Linq ist das managed Gegenstück zum Sql-Select-Command. Damit kann man also auch gejointe Tabellen erzeugen. Nur kann man gejointe Tabellen nicht rückspeichern, denn die gejointen Tabellen existieren nur im Client - nicht in der DB.
    Kurz gesagt: vlt. Linq2Dataset besser vergessen. gugge vier Views-Videos - das kann auch gejointe Views, und die kannste auch zurückspeichern.

    man kann DataAdapter mit OleDb auf csv anwenden, also csv kann ein echtes DB-System sein, sogar mit Relationen.
    Dassis aber unsicher, denn wenn auf einem anneren Rechner inne Registry ein annerer csv-SpaltenTrenner hinterlegt ist, ist alles im A....

    alternativ gugge CSV importieren,
    Aber zum Exportieren musste dann wieder fleissig Schleifen schreiben, Werte konvertieren, dabei die Kultur beachten und das Encoding.
    Erstmal vielen Dank.
    Ich hab nu erstmal was zum lesen und verstehen ;)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D