Problem bei verschachtelter Datenbankabfrage (for each)

  • VB.NET

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

    Problem bei verschachtelter Datenbankabfrage (for each)

    Hallo liebes Forum...und natürlich alle DB-Experten,

    habe mal wieder ein Problem. :rolleyes:

    Ich möchte gerne eine DataTable aus dem Dataset(was temporär vorhanden ist) mit einer Tabelle aus der Datenbank(MS SQL) vergleichen.

    Hier mal mein Quellcode:

    VB.NET-Quellcode

    1. Private Sub checkKtoIsAvailable()
    2. DsCC1.KONTOAUSZUG_TEMP.Clear()
    3. DsCC1.KONTO_ANLEGEN.Clear()
    4. btxDatei.Value = fileName
    5. ' Erst die Tabellendaten abfragen
    6. ' LINQ2SQL
    7. Dim dataContext As New CC1DataContext()
    8. Dim kontoDB = (From k In dataContext.KONTO _
    9. Select k)
    10. 'LINQ2DataSet mit Variablen
    11. Dim kontoDS = (From k2 In DsCC1.KONTOAUSZUG _
    12. Select k2)
    13. Dim drw1 As DataRow
    14. Dim drw2 As DataRow
    15. For Each koDS In kontoDS
    16. For Each koDB In kontoDB
    17. If koDB.NameKonto = koDS.BankNameKontrahent And _
    18. koDB.Kontonummer = koDS.KtoKontrahent And _
    19. koDB.BLZ = koDS.BLZKontrahent Then
    20. ' Anzeige in Auszüge
    21. drw1 = DsCC1.KONTOAUSZUG_TEMP.NewRow
    22. drw1("idKontoAuszug") = Guid.NewGuid
    23. drw1("BankNameKontrahent") = koDB.NameKonto
    24. drw1("KtoKontrahent") = koDB.Kontonummer
    25. drw1("BLZKontrahent") = koDB.BLZ
    26. DsCC1.KONTOAUSZUG_TEMP.Rows.Add(drw1)
    27. Else
    28. 'Anzeige in Anlegen
    29. drw2 = DsCC1.KONTO_ANLEGEN.NewRow
    30. drw2("idBankKonto") = Guid.NewGuid
    31. drw2("Bank") = koDS.BankNameKontrahent
    32. drw2("KontoName") = koDS.KtoKontrahent
    33. drw2("BLZ") = koDS.BLZKontrahent
    34. DsCC1.KONTO_ANLEGEN.Rows.Add(drw2)
    35. End If
    36. Next
    37. Next
    38. bdgAuszug.SetDataBinding(DsCC1, "KONTOAUSZUG_TEMP", True)
    39. bdgKontoAnlegen.SetDataBinding(DsCC1, "KONTO_ANLEGEN", True)
    40. End Sub


    Leider werden in dem Grid "bdgKontoAnlegen" die Datensätze doppelt angezeigt.
    Er springt auch doppelt so oft in die if-Unterscheidung wie er soll.
    Habe mit dem Debugger "kontoDB" und "kontoDS" getestet, und der Inhalt stimmt auch soweit.
    Also kann es nur an der Schleife liegen, oder?

    Wie stelle ich die richtig an? Irgendwie fehlt mir da die Erfahrung... :whistling:

    Viele Grüße
    Trigoor
    Wie ich das sehe versuchst du die daten aus kontoDS nach kontoDB zu transferieren.
    Aber bei mehrmaligem durchlauf, vielleicht weil du etwas neues in kontoDS geschrieben hast wird auch automatisch das vorhandene mitgenommen.
    Du musst überprüfen ob das vorhandene, also das in kontoDB auch schon in kontoDS ist, und auch prüfen, ob es so ist, wie es sein soll. (laaanger Satz :whistling:)
    Wenn es noch nicht drin ist, dann erst einen Eintrag hinzufügen. :]
    Hallo BeefyX,

    Danke für die schnelle Antwort. :thumbsup:

    Nun ja, in kontoDS wird erst mal vorher nix geschrieben. Habe am Anfang der Prozedur ja auch das hier eingefügt:

    VB.NET-Quellcode

    1. DsCC1.KONTOAUSZUG_TEMP.Clear()
    2. DsCC1.KONTO_ANLEGEN.Clear()


    Also dürfte das Problem dort nicht liegen.
    Aber ich ahne Etwas. Das Problem lieg wo anders. Es wird ein sta-File eingelesen...und in verschiedenen Tabellen in der DB gespeichert...usw.

    Das Ganze ist recht komplex und kryptisch. Habe mal das Grid aus "KONTOAUSZUG" gefüllt, also ohne meine checkDingens...
    Und da wurden alle Einträge auch doppelt angezeigt. Und der Code ist nicht von mir... :whistling:

    Oje, das wird eine Menge Arbeit...und ich werde mir den Kopf zerbrechen wo der Fehler liegt... X(

    Viele Grüße
    Trigoor

    Trigoor schrieb:

    Ich möchte gerne eine DataTable aus dem Dataset(was temporär vorhanden ist) mit einer Tabelle aus der Datenbank(MS SQL) vergleichen.

    Mir scheint, du schmeißt da 2 konkurrierende Daten-Zugriffs-Strategien zusammen.

    Also entweder du arbeitest mit Linq2Sql (DataContext, Entities) oder mit Dataset, aber mit beidem in derselben Anwendung wirds zu Mega-Chaos.
    Hallo..,

    nun ja. Ich glaube es liegt an der Schleife. Habe das mit den sta's noch mal getest, und es klappt.

    @Erfinder des Rades:
    Nun ja...,mit LINQ2SQL kann man die Tabellen im O/R-Designer(also da wo eine DataContext erstellt wird) leicht erstellen. Und Abfragen (LINQ2SQL) funktionieren prima. Halt die volle IntelliSense-Unterstützung.

    Warum ich dann noch mit DataSets arbeite. Nun ja...der Code ist schon mal so programmiert worden, dass es ein DataSet gibt, und man kann die Grids einfach mit "SetDataBinding" an die Tabelle der DB(über das DataSet) binden.

    Wie macht man denn das so einfach mit LINQ2SQL? :?: ?( :?:


    Viele Grüße
    Trigoor

    P.S
    Ist die Schleife jetzt richtig, oder nicht? ?(
    Aus den L2S-Klassen ObjectDataSources erstellen.

    msdn.microsoft.com/en-us/vbasic/ff718217

    Das eigliche erstellen einer ObjecDatasource geht erst inne Mitte vom 1. Video los.

    Das davor ist leidlich interessant, brauchst du aber nicht, denn L2S generiert solche Klassen wie state und city, und zwar besser als beth massys implementation.
    Hi...,

    habe eine Lösung gefunden.
    Siehe hier:

    VB.NET-Quellcode

    1. Private Sub checkKontoIsAvailable()
    2. btxDatei.Value = fileName
    3. ' Erst die Tabellendaten abfragen
    4. ' LINQ2SQL
    5. Dim dataContext As New CCDataContext()
    6. Dim kontoDB = (From k In dataContext.KONTO _
    7. Select k)
    8. 'LINQ2DataSet mit Variablen
    9. Dim kontoAuszugDS = (From k2 In DsCC1.KONTOAUSZUG _
    10. Select k2)
    11. Dim drw1 As DataRow
    12. Dim drw2 As DataRow
    13. For Each koDB In kontoDB
    14. Dim counter As Integer
    15. For Each koAuszug_DS In kontoAuszugDS
    16. If koDB.NameKonto = koAuszug_DS.BankNameKontrahent AndAlso _
    17. koDB.Kontonummer = koAuszug_DS.KtoKontrahent AndAlso _
    18. koDB.BLZ = koAuszug_DS.BLZKontrahent Then
    19. ' Anzeige in Auszüge
    20. drw1 = DsCC1.KONTOAUSZUG_TEMP.NewRow
    21. drw1("idKontoAuszug") = Guid.NewGuid
    22. drw1("BankNameKontrahent") = koDB.NameKonto
    23. drw1("KtoKontrahent") = koDB.Kontonummer
    24. drw1("BLZKontrahent") = koDB.BLZ
    25. DsCC1.KONTOAUSZUG_TEMP.Rows.Add(drw1)
    26. Else
    27. 'Anzeige in Anlegen
    28. drw2 = DsCashController1.KONTO_ANLEGEN.NewRow
    29. drw2("idBankKonto") = Guid.NewGuid
    30. drw2("Bank") = koAuszug_DS.BankNameKontrahent
    31. drw2("Kontonummer") = koAuszug_DS.KtoKontrahent
    32. drw2("BLZ") = koAuszug_DS.BLZKontrahent
    33. Dim kontoDBTemp = (From k In dataContext.KONTO _
    34. Select k)
    35. Dim kotNako As String
    36. Dim kotTBLZ As String
    37. Dim kotKtoNr As String
    38. For Each koT In kontoDBTemp
    39. kotNako = koT.NameKonto
    40. kotTBLZ = koT.BLZ
    41. kotKtoNr = koT.Kontonummer
    42. Next
    43. If counter = 0 Then
    44. counter = -1
    45. If kotNako = koAuszug_DS.BankNameKontrahent AndAlso kotTBLZ _
    46. = koAuszug_DS.BLZKontrahent AndAlso kotKtoNr _
    47. = koAuszug_DS.KtoKontrahent Then
    48. counter = 0
    49. Else
    50. DsCC1.KONTO_ANLEGEN.Rows.Add(drw2)
    51. End If
    52. Else
    53. counter = 0
    54. End If
    55. End If
    56. Next koAuszug_DS
    57. Next koDB
    58. bdgKontoAnlegen.SetDataBinding(DsCC1, "KONTO_ANLEGEN", True)
    59. bdgAuszug.SetDataBinding(DsCC1, "KONTOAUSZUG_TEMP", True)
    60. End Sub


    Aber es könnte doch eleganter gehen, oder? Z.B ohne den Counter?

    @ErfinderDesRades
    Danke für den Link. Werde mich mal bei ein bisschen Leerlauf damit beschäftigen. Aber LINQ2OBJECT, oder wie es auch heißt...LINQ2ENTITIES (ist doch dasselbe, oder?), habe ich gelesen soll etwas schwieriger sein als LINQ2DATASET.
    Nun ja, mal schauen. ;)

    Habe aber ein neues Problem. Aber dazu gibt es gleich den nächsten Thread. :D

    Viele Grüße
    Trigoor

    Trigoor schrieb:

    Aber LINQ2OBJECT, oder wie es auch heißt...LINQ2ENTITIES (ist doch dasselbe, oder?), habe ich gelesen soll etwas schwieriger sein als LINQ2DATASET.

    Oh, bei dem Thema musste mitte Begriffe genau umgehen.
    es gibt 3 relationale Datenmodelle, davon sind 2 OR-Mapper, nämlich Linq2Sql und EntityFramework. Diese OR-Mapper verwenden als Auflistungsklassen sog. EntitySets

    Das 3. relationale Datenmodell ist das typisierte Dataset, und das verwendet DataTables, um die Datensätze aufzulisten.

    Linq2Dataset ist kein Datenmodell, sondern das bezeichnet ein paar schnucklige Lambda-Expressions, mit denen man auf Datasetse losgehen kann.

    von daher ergibt deine Frage keinen Sinn, weils die Dinge nicht gibt, ausser Linq2Dataset, aber das ist ja garkein Datenmodell.