Feldname eines Arrays (structure) während der Laufzeit aus einer Variable nehmen (kanns nicht beschreiben)

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Feldname eines Arrays (structure) während der Laufzeit aus einer Variable nehmen (kanns nicht beschreiben)

    Hallo Freunde!

    Für meine spezielle Art der Erstellung und dem Schreiben und Lesen von Access-Datenbanken brauche ich wieder Hilfe.
    Ich erstelle eine neue Access-Datenbank aus den Infos einer Structure:

    VB.NET-Quellcode

    1. Public Structure BedienerStructure
    2. Dim Benutzer_ID As Integer
    3. Dim Name As String
    4. Dim BildschirmName As String
    5. Dim AnmeldeCode1 As String
    6. ...
    7. Dim LetzteAenderung As DateTime
    8. Dim FreiFeld_memo As String
    9. End Structure
    10. Public Bediener(MaxBedienerAnzahlEver) As BedienerStructure


    Das funktioniert soweit auch einwandfrei.
    Nun möchte ich einen Datensatz in der Datenbank updaten und möchte dafür auch wieder alle Datensätze anhand der infos aus der "structure" verwenden.
    Folgender Code funktioniert schon einmal, wenn ich als Werte (testweise) Zahlen oder Strings einsetze.
    Aufgabenstellung die ich noch nicht hinbekommen habe:

    Ich bauche z.b. die Information aus der Variable TempStruct1.BildschirmName.
    .BildschirmName ist jedoch als Elementname in einer Variable (TempFieldName ) abgelegt.
    Nun müsste ich den Ausdruck also in der Art wie TempStruct1.NameAusVariableTempFieldName umwandeln.
    Geht das irgendwie eine Variable als "Programmierausdruck" zu verwenden?

    Sollte ich mich unverständlich ausgedrückt haben, bitte nachfragen.

    VB.NET-Quellcode

    1. Public Sub SchreibeBedienerDatenbank(ZuAktualisierenderBediener As Integer, DatenBankPasswort As String, DatenStruktur As Object)
    2. 'Hier den aktuellen Bediener in die Datenbank schreiben
    3. If ZuAktualisierenderBediener = 0 Then Exit Sub
    4. Dim sql As String
    5. Dim cmd As OleDbCommand
    6. Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & FlexX_Datenverzeichnis + "user.mdb" & "; Jet OLEDB:Database Password=" & "" & ";")
    7. conn.Open()
    8. Dim TempStruct1 As New BedienerStructure
    9. TempStruct1 = Bediener(ZuAktualisierenderBediener)
    10. Dim TempFieldType As String
    11. Dim TempFieldName As String
    12. sql = "Update Bediener Set"
    13. For Each fi_1 As System.Reflection.FieldInfo In DatenStruktur.GetType().GetFields
    14. TempFieldType = fi_1.FieldType.ToString
    15. TempFieldName = fi_1.Name 'Feldname (z.B. "BildschirmName")
    16. Select Case TempFieldType
    17. Case "System.String"
    18. sql += " " + TempFieldName + "='" + TempStruct1.BildschirmName + "'," 'hier weis ich nicht, wie ich .Bildschirmname durch den Wert von fi_1.name ersetzen kann
    19. Case "System.Boolean"
    20. sql += " " + TempFieldName + "=" + "FALSE,"
    21. Case "System.Int32"
    22. sql += " " + TempFieldName + "=" + "1,"
    23. Case "System.Double"
    24. sql += " " + TempFieldName + "=" + "2,"
    25. Case "System.DateTime"
    26. sql += " " + TempFieldName + "='" + CStr(Now()) + "',"
    27. End Select
    28. Next
    29. sql = Left$(sql, Len(sql) - 1) + " Where ID=" + CStr(ZuAktualisierenderBediener)
    30. MsgBox(sql)
    31. 'sql = "Update Bediener Set " + _
    32. ' "Name='" + Bediener(ZuAktualisierenderBediener).Name + "', " + _
    33. ' "BildschirmName='" + Bediener(ZuAktualisierenderBediener).BildschirmName + "', " + _
    34. ' "AnmeldeCode1='" + Bediener(ZuAktualisierenderBediener).AnmeldeCode1 + "', " + _
    35. ' "AnmeldeCode2='" + Bediener(ZuAktualisierenderBediener).AnmeldeCode2 + "', " + _
    36. ' "AnmeldeCode3='" + Bediener(ZuAktualisierenderBediener).AnmeldeCode3 + "', " + _
    37. ' "ManagerRecht=" + CStr(Bediener(ZuAktualisierenderBediener).ManagerRecht) + " Where ID=" + CStr(ZuAktualisierenderBediener)
    38. cmd = New OleDbCommand(sql, conn)
    39. cmd.ExecuteNonQuery()
    40. conn.Close()
    41. End Sub
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hallo dive26,

    Sieh' dir mal den System.Reflection-Namespace an. Damit kannst du Daten zu Klassen o.Ä. abrufen. Und schau' dir auch mal die "GetType()"-Funktion an, mit der müsstest du dein Select-Case-Statement realisieren können.

    Grüsse

    Higlav
    Danke Higlav,

    System Reflections hört sich gut an. War auch der Meinung das das mit dem gehen sollte. Jedoch sind meine Kenntnisse dahin noch eher bescheiden.

    Folgende drei Zeilen habe ich ausprobiert, jedoch brigt jede einen Fehler:


    VB.NET-Quellcode

    1. ...
    2. DatenStruktur = Bediener(ZuAktualisierenderBediener) 'neu hinzugefügt
    3. ...
    4. sql += " " + TempFieldName + "='" + fi_1.GetValue(TempFieldName).ToString + "',"
    5. sql += " " + TempFieldName + "='" + DatenStruktur(TempFieldName).GetFields.GetValue(TempFieldName).ToString + "',"
    6. sql += " " + TempFieldName + "='" + DatenStruktur(TempFieldName).GetValue.ToString + "',"


    Ich komm nicht drauf.

    PS: Die Select Case Funktion funktioniert ja schon einwandfrei. Je nach FieldType schreibe ich Text, Boolean, Integer, Double oder DateTime in die Datenbank. Jedoch den Member der Struct über Ihre Namen (als Variable) ansprechen geht nicht.

    Das hier hat auch nicht geholfen: YourType.GetType.GetField("Name").GetValue()
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Habe die Lösung gefunden. Nun brauche ich nur noch die Stucture selbst zu ändern und das Erstellen, Schreiben und Lesen aus der Datenbank geht automatisiert ohne dort nach jeder Änderung in der Structure herumfummeln zu müssen.

    VB.NET-Quellcode

    1. Public Sub SchreibeBedienerDatenbank(ZuAktualisierenderBediener As Integer, DatenBankPasswort As String, DatenStruktur As Object)
    2. 'Hier den aktuellen Bediener in die Datenbank schreiben
    3. If ZuAktualisierenderBediener = 0 Then Exit Sub
    4. Dim sql As String
    5. Dim TempFieldType As String
    6. Dim TempFieldName As String
    7. Dim cmd As OleDbCommand
    8. Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & FlexX_Datenverzeichnis + "user.mdb" & "; Jet OLEDB:Database Password=" & "" & ";")
    9. conn.Open()
    10. DatenStruktur = Bediener(ZuAktualisierenderBediener) 'aktuellen Werte aus dem Array der Struktur übergeben
    11. sql = "Update Bediener Set"
    12. For Each fi_1 As System.Reflection.FieldInfo In DatenStruktur.GetType().GetFields
    13. TempFieldType = fi_1.FieldType.ToString
    14. TempFieldName = fi_1.Name
    15. Select Case TempFieldType
    16. Case "System.String"
    17. sql += " " + TempFieldName + "='" + CStr(fi_1.GetValue(DatenStruktur)) + "',"
    18. Case "System.Boolean"
    19. sql += " " + TempFieldName + "=" + CStr(fi_1.GetValue(DatenStruktur)) + ","
    20. Case "System.Int32"
    21. sql += " " + TempFieldName + "=" + CStr(fi_1.GetValue(DatenStruktur)) + ","
    22. Case "System.Double"
    23. sql += " " + TempFieldName + "=" + CStr(fi_1.GetValue(DatenStruktur)) + ","
    24. Case "System.DateTime"
    25. sql += " " + TempFieldName + "='" + CStr(Now()) + "',"
    26. End Select
    27. Next
    28. sql = Left$(sql, Len(sql) - 1) + " Where ID=" + CStr(ZuAktualisierenderBediener) 'letztes Komma weg und WHERE Statement
    29. cmd = New OleDbCommand(sql, conn)
    30. cmd.ExecuteNonQuery()
    31. conn.Close()
    32. End Sub




    Ergebnis SQL String:
    Update Bediener Set Benutzer_ID=2, Name='Fr. Andrea Schwarz', BildschirmName='Fr. Schwarz', AnmeldeCode1='360000168EDF9401', AnmeldeCode2='111', AnmeldeCode3='', BenutzerBild_memo='', Finger1_memo='', Finger2_memo='', Finger3_memo='', ManagerRecht=False, Stornorecht=True, AbschlussRecht=False, UmsatzanzeigeRecht=True, ArbeitsZeitAngemeldet=False, gesperrt=False, Wert_double=0, LetzteAenderung='04.11.2013 14:58:51', FreiFeld_memo='', Tuedldue=0 Where ID=2
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at