Auf den Inhalt einer DataTable zugreifen

  • VB.NET

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

    Auf den Inhalt einer DataTable zugreifen

    Hallo!

    ich komme aus der Access-Ecke und habe mein erstes großes Problem mit dem Zugriff auf eine DataTable.
    Gemäß meinem Lehrbuch referenziert man eine DataTable in der Art: Dim dt As DataTable = MyDataSet.Tables("MyTable").
    Das löst aber einen Fehler aus.

    Wie referenziert man eine DataTable, um auf den Inhalt von MyTable zuzugreifen?

    Gruß
    gerfix
    wenn du es gscheit anstellst, dann geht

    VB.NET-Quellcode

    1. dim dt = MyDataSet.MyTable

    Das ist der typisierte Zugriff auf eine Tabelle eines typisierten Datasets. Statt iwelche Stringschlüssel auswendig hinschreiben zu müssen schlägt Intellisense die verfügbaren Tabellen vor.

    Von untypisiertem Dataset (wie aus deim Lehrbuch) täte ich dringend abraten.

    Leider ist das typDataset den meisten Lehrbuch-Schreibern unbekannt - die machen also immer so vor, wie man es besser nicht machen sollte.



    So, das war jetzt das Grundsätzliche.
    Kommen wir zum Detail, nämlich deine Frage.
    Äh - Wie lautet denn der Fehler?

    Und kann man mal die ganze Methode sehen, wo dieser Fehler auftritt?

    Und bitte stelle den Code so ein, dass man ihn auch lesen kann - Anleitung dazu:
    also der Code lautet wie folgt:

    Quellcode

    1. Module Functions
    2. Function GetHoliday(dDate As Date) As String
    3. Dim dt = BackendDataSet.tblFeiertageDataTable
    4. Debug.Print(dt.Rows.Count)
    5. Dim aHolidays(dt.Rows.Count * 15 - 1, 1) As String
    6. i = 0
    7. For j = 0 To dt.Rows.Count - 1
    8. For b = 1 To 15
    9. aHolidays(i, 0) = dt.Rows(j).Item(b).ToString
    10. aHolidays(i, 1) = dt.Columns(b).ColumnName
    11. Debug.Print(aHolidays(i, 0))
    12. i += 1
    13. Next
    14. Next
    15. Return "test"
    16. 'Function GetHoliday(dDate As Date) As String
    17. 'Set r = CurrentDb.OpenRecordset("tblFeiertage")
    18. 'r.MoveLast : r.MoveFirst
    19. 'Dim aHolidays(r.RecordCount * 15 - 1, 1) As String
    20. 'Do Until r.EOF
    21. ' For j = 1 To 15
    22. ' aHolidays(i, 0) = r(j) '1.Spalte enthält Feiertagsdatum
    23. ' aHolidays(i, 1) = r(j).Name '2.Spalte enthält Feiertagsbezeichnung
    24. ' i = i + 1
    25. ' Next
    26. ' r.MoveNext
    27. 'Loop
    28. 'For j = 0 To UBound(aHolidays)
    29. ' If dDate = aHolidays(j, 0) Then
    30. ' GetHoliday = aHolidays(j, 1)
    31. ' Exit For
    32. ' Else
    33. ' Select Case Weekday(dDate, vbMonday)
    34. ' Case 6 : GetHoliday = "Samstag"
    35. ' Case 7 : GetHoliday = "Sonntag"
    36. ' Case Else : GetHoliday = ""
    37. ' End Select
    38. ' End If
    39. 'Next
    40. 'End Function
    41. End Function
    42. End Module


    Der als Kommentar markierte Code beschreibt die Funktion in einem Access-Modul, die ich hier in vb.net nachbauen möchte.
    Leider scheitere ich schon an Zeile 5. Fehler BC30109 "BackendDataSet.tblFeiertageDataTable" ist ein Klassentyp und kann nicht als Ausdruck verwendet werden. ASOBOX C:\Dev\VB\ASOBOX\Functions.vb 5 Aktiv

    Was mache ich falsch?

    Gruß
    gerfix

    gerfix schrieb:

    "BackendDataSet.tblFeiertageDataTable" ist ein Klassentyp und kann nicht als Ausdruck verwendet werden.
    Das ist eigich eine sehr gute Fehlermeldung.
    Um sie zu verstehen muss man den Unterschied von Datentyp und Objekt verstehen.

    dt ist eine Variable, und der muss man ein Objekt zuweisen. Bzw, es kann auch ein "Ausdruck" sein, der ein Objekt ergibt, um genau zu sein.

    BackendDataSet.tblFeiertageDataTable ist aber kein Objekt, sondern ist ein Datentyp.
    Ein Datentyp ist der Bauplan eines Objekts. Also man kann damit ein Objekt (oder auch viele) erstellen - mit dem Schlüsselwort New.
    Das ist fundamentale Grundlage der Programmiersprache.



    Hier ist das nohmal erklärt, und paar andere fundamentale Sachen auch: Grundlagen: Fachbegriffe

    Aber du wirst dir wohl ein FachBuch runterladen müssen, von Löffelmann gibts ein gutes, und Kühnel/Leibhard ist auch gut - sei gewarnt vor Theiss - der macht eiglich alles falsch vor, was man überhaupt falsch machen kann.

    Einen Haufen Tips zum Lernen habich auch hier zusammengestellt: Datenverarbeitungs-Vorraussetzungen
    Glaub es oder lass es: wenn du deine Anwendung irgendwann fertig hast, wirst du all das gelernt haben müssen.



    Achso - nochmal konkret: Du musst der Methode ein BackendDataSet.tblFeiertageDataTable-Objekt übergeben, von da aus, wo du sie aufrufst, also sowas musses werden:

    VB.NET-Quellcode

    1. Module Functions
    2. Function GetHoliday(dDate As Date, dt As BackendDataSet.tblFeiertageDataTable) As String
    3. Debug.Print(dt.Rows.Count)
    4. Dim aHolidays(dt.Rows.Count * 15 - 1, 1) As String
    5. '...

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

    ja, du musst das mit Klasse und Objekt vollständig verstehen. Es ist eiglich einfach, aber VBA und VB6 verstossen konsequent gegen diese Logik, und dann ists schwer umzulernen.
    Also:

    New ist englisch und bedeutet: "Neu".
    Mit New BackendDataSet.tblFeiertageDataTable hast du also ein neues tblFeiertageDataTable-Objekt geschaffen.
    Kann sein, dass irgendwo in deiner Anwendung weitere solche Objekte herumfahren (bestimmt sogar, du kannst es ja anzeigen, und hast es gesehen).
    Und kann auch sein, dass diese anderen tblFeiertageDataTable-Objekte mehrere DS enthalten.
    Dieses jedenfalls, was du grad geschaffen hast, mit New - enthält aber mit Sicherheit keinen DS - denn es ist ja ganz neu.

    Wie gesagt: Du musst der Methode ein tblFeiertageDataTable-Objekt übergeben.
    Und zwar genau dasjenige, wo die DS auch drinne sind.

    Tja, so ist OOP: Von jedem Datentyp (Bauplan) kann es beliebig viele Objekte geben. So wie es viele Autos gibt vom Typ VW-Golf.
    Beim Coden muss mans hinkriegen, immer mit dem richtigen Objekt zu hantieren.

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