SQL Insert ins Access mit Hilfe von Schleifen

  • VB.NET

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von rawneblade.

    rawneblade schrieb:

    Also werden sie erst auf den Klick eines Button erzeugt und zwar so oft wie Fragen in der DB stehen, somit keine direkte Namensvergabe.
    Der Punkt ist aber, dass die CEs nach der Erzeugung einen Namen haben! Und wenn es auch nur die vom Compiler generierten sind. Wie erwähnt: Wenn Du die Daten nicht sinnvoll zwischenspeicherst*, dann musst Du die Daten aus den TextBoxen etc. rauspuhlen. Das geht. Aber nur mit deren Namen. Dazu ginge es auch, wenn Du Dir auf Dein Form noch nen Button draufhaust, folgenden Code reinschreibst und dann zur Laufzeit anklickst:

    VB.NET-Quellcode

    1. Dim ListOfCEsInMyForm = Me.Controls
    2. Stop

    Dann bekommst Du z.B. sowas raus:


    Und damit können wir dann endlich weiterarbeiten. Denn im unteren Bildabschnitt sind die Details eines Buttons, den ich zur Laufzeit nur mit folgendem Code erstellt habe:

    VB.NET-Quellcode

    1. Me.Controls.Add(New Button)

    Und trotzdem kann ich dessen Namen herausbekommen, weil er automatisch vergeben wird.

    *In der Sub in Post#18 wäre der perfekte Zeitpunkt, um die Daten nicht nur in Deinen TextBoxen etc. anzeigen zu lassen, sondern sie auch in einer List(Of Irgendwas) abzuspeichern. Dann ist das Zurückschreiben in die DB ein Klacks!

    Und was ich jetzt beim erneuten Lesen sehe: In Post#18 verteilst Du Deine reader-Daten an immer dieselben CEs. Die 1. Antwort kommt immer in die TextBox namens Antwort1Neu. Das kann doch nicht gut gehen/funktionieren. Da werden die Daten doch immer wieder überschrieben, wenn ne neue Frage+Antwort eingelesen wird!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hi,

    danke für den Tipp mit den Stop Button. Ich habe das getan und leider sind die ganzen Namen für die neu erzeugten TextBoxen leer bzw. werden so angezeigt""
    Das ist komisch, denn die ganzen TextBoxen plus Inhalt werden ja erzeugt.

    Ich habe eine List (List of String) erzeugt mit den Namen Liste und lasse dort die Textbocen reinschreiben:

    VB.NET-Quellcode

    1. Liste.Add("Fragenummer")
    2. Liste.Add("Antwort1")
    3. Liste.Add("Antwort2")
    4. Liste.Add("Antwort3")
    5. Liste.Add("Antwort4")
    6. Liste.Add("C1")
    7. Liste.Add("C2")
    8. Liste.Add("C3")
    9. Liste.Add("C4")


    Wie kann ich die Liste in Access reinschreiben?
    Du sagst das ich auch immer wieder meine Daten über ANtwortNeu1 etc überschreibe, wie würde man es nicht mehr überschrieben, sondern neue Einträge erzeugen?
    Mein Buch "Einstieg in Visual Basic 2017" gibt mir da leider keine Hinweis.

    Danke dir für deine Hilfe

    rawneblade schrieb:

    Ich habe eine List (List of String) erzeugt mit den Namen Liste und lasse dort die Textbocen reinschreiben
    Du lässt was? Ne Textbox kann man nicht in eine Stringliste reinschreiben. Aber von einer TextBox kann man z.B. 2 Sachen reinschreiben: Deren Name (Antwort1.Name) und deren Text (Antwort1.Text): Du schreibst aber den Namen rein. Und den willst Du nicht. Sondern den Text. :S
    Machen wir es anders: Kannst Du mal bitte das Projekt bereinigt (außerdem ohne bin-, obj-, .vs- und .git-Ordner) und gezippt über [+ Erweiterte Antwort] hochladen? Vielleicht finden wir so (schnell(er)) eine Lösung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Nur bedingt, da die Solution-Datei sln fehlt. Aber wurscht.
    Auf welchem Form befinden wir uns? Ich kann nur sehen, dass Du ein DataSet (tDS) mit Anschluss an ne Access-Datei hast. Also dürfte doch alles Wesentliche in der Frage-Table landen. Packst Du denn alle Fragen da rein? Denn dafür ist sie da. Und das Hin- und Her zwischen tDS und Access-Datei erledigen doch m.E. die Table-Adapters, die an die Tables angeschlossen sind. Ach Moment. Das tDS ist zwar da. Aber Du nutzt es ja gar nicht. Warum?

    ##########

    Noch was: Ich habe gesehen, dass wir hier ewig aneinander vorbeigeredet haben, da Du von Post#16 an von "neu generierten TextBoxen" redest. Das ist dem von Dir hochgeladenen Projekt aber nicht zu entnehmen. Was Du machst, ist befüllen. Hier der Unterschied:

    Was Du machst, ist das Befüllen von TextBoxen, will heißen, Du holst Text aus der Datenbank und lässt den in die vorhandenen TextBoxen reinschreiben.
    Du redest aber die ganze Zeit von TextBoxen generieren, und das ist, dass Du zur Laufzeit, also während das Programm läuft, neue TextBoxen erstellst, wo vorher keine waren. Das ist ein himmelweiter Unterschied und führt die letzten gefühlten 10 Posts ad absurdum.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Die betreffende Form heisst "StudentPruefung". Hier sollen die Fragen mit den jeweils vier dazugehörigen vier Antworten, in TextBoxen aufgerufen werden.
    Die Fragen und Antworten werden aus der Tabelle "Frage" geholt (dort werden die Felder 'Fragen', 'Antwort1', 'Antwort2', 'Antwort3', 'Antwort4' gelesen).
    Das heisst zur Laufzeit sind die Fragen fest und nun soll man die Möglichkeit haben jeweils hinter jeder Antwort einen Haken (Checkboxen) zu machen.
    Hat man den Haken jeweils gesetzt soll genau das wieder zurück in die Tabelle "Frage" zu einen der vier Spalten 'C1', 'C2', 'C3', 'C4' geupdatet werden.

    Genau ich habe ein Dataset erzeugt mit Anschluss an die Datenbank. Du sagst das Erledigen die Table Adapter. Meinst du folgende Methoden?
    TableAdapter.Update
    TableAdapter.Insert
    TableAdapter.Fill
    TableAdapter.GetData
    TableAdapter.ClearBeforeFill

    Besten Dank für deine Geduld :)
    Diese Kandidaten sind dafür da, ja. Allerdings nutzt Du Deine Datenbankverknüpfungen, um direkt Daten in die TextBoxen zu laden. Das ist aber nicht Sinn der Sache, wenn Du ein tDS (DataSet) hast. Es geht darum, dass Du die Daten mithilfe der TableAdapter in die DataTables Deines tDS lädst und dann im Code nur noch mithilfe von tDS-Zugriffen auf Deine Daten zugreifst. In der DataTable stehen dann nämlich z.B. all Deine Fragen mit Antworten drin.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Bilder bitte als Grafik hochladen, Code extra posten.
    Ich nehm ein leeres Projekt, füge über das Datenquellenfenster die Access-Datei als Datenquelle hinzu und zieh dann die Tabelle als DGV auf's Formular. Und zur Laufzeit kommt:

    Bei Deinem Projekt funktioniert es nicht, aber das kann auch daran liegen, dass mir VS eine neue Projektmappe aus Deinen Einzeldateien erstellt hat.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich habe folgenden Table Adapter gebaut und der zeigt auch die Daten aus der Datenbank an, welche ich verwenden will:
    TableAdapter:



    Ausgeführte Abfrage zur Laufzeit:



    Der Speicher Button enthält folgenden Code, damit will ich Änderungen zurück in die Datenbank schreiben:

    VB.NET-Quellcode

    1. Imports System.IO
    2.  
    3. Public Class Pruefung
    4. Private Sub Pruefung_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. 'TODO: Diese Codezeile lädt Daten in die Tabelle "DatenbankDataSet.Frage1". Sie können sie bei Bedarf verschieben oder entfernen.
    6. Me.Frage1TableAdapter.Fill(Me.DatenbankDataSet.Frage1)
    7. End Sub
    8. Private Sub CmdSpeichern_Click(sender As Object, e As EventArgs) Handles CmdSpeichern.Click
    9. Try
    10. Me.Validate()
    11. Me.Frage1BindingSource.EndEdit()
    12. Me.Frage1TableAdapter.Update(Me.DatenbankDataSet)
    13. MessageBox.Show("Erfolgreich gespeichert")
    14. Catch ex As Exception
    15. MessageBox.Show(ex.Message)
    16. End Try
    17. End Sub
    18. End Class


    Leider klappt genau das nicht, es wird kein Fehler angezeigt, aber auch keine Änderung in der Datenbank durchgeführt.
    Bilder
    • TA.png

      12,26 kB, 273×378, 10 mal angesehen
    • 1.JPG

      67,86 kB, 1.188×433, 11 mal angesehen
    Bei mir klappt der Code. Es ist schon mal was wert, dass zumindest alle Fragen im DGV auftauchen. Aber warum der Code bei Dir nicht funktioniert? Da alles nach Default-Einstellungen aussieht, schwierig. Mach mal das try-catch weg. Und statt

    VB.NET-Quellcode

    1. Me.Frage1TableAdapter.Update(Me.DatenbankDataSet)

    VB.NET-Quellcode

    1. Me.Frage1TableAdapterManager.UpdateAll(Me.DatenbankDataSet)


    Sollte das nicht klappen, ggf. nochmal das aktuelle Projekt inkl. .sln-Datei hochladen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    anzumerken wäre noch, dass das Datenmodell vermurkst ist, und einer Komplett-Überarbeitung bedarf.

    Ich empfehle ja immer, erstmal ohne DB zu entwickeln, weil da kann man das Datenmodell besser modifizieren.
    Sich mit den Adaptern herumzuärgern ist noch genug Zeit, wenn alles annere soweit funktioniert.
    Den TableAdpapterManager erkennt das Programm heir nicht an, dadurch kann das UpdateAll auch nicht verwendet werden. Habe jetzt nochmal das Programm hier angehangen mit der sln.
    Anzumerken wäre noch das die Form "StudentPruefung" jetzt nicht die richtige ist, sondern die Form wo der Table Adapter drin ist heisst jetzt "Pruefung"

    Wenn das Datenmodell vermurkst sein soll, weiss ich jetzt leider nicht warum.
    Dateien
    • APP.zip

      (167,13 kB, 4 mal heruntergeladen, zuletzt: )
    Wenn ich nach dem Start auf [Student] klicke, dann Daten eingebe, sehe ich alle Prüfungsfragen. Dann ändere ich was, klicke auf [Speichern], beende das Programm, starte es erneut und die Änderungen sind wieder da. Wie gewollt. So what?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Bei mir passiert leider nichts, weder werden die Änderungen direkt nach Neustart des Programms wieder angezeigt noch in die Datenbank geschrieben. Da passierte einfach garnichts, nachdem ich Änderungen gemacht habe (FrageWort geändert, Haken bei den Checkboxen gesetzt etc.). Er sagt Erfolgreich gespeichert und das war es.
    Hast du evt. andere Konfigurationen in deinen Visual Studio?
    Ich habe bei meinen ersten Tests festgestellt, dass z.B. bei mir Änderungen nicht in der AccessDatei ankommen, wenn ich die AccessDatei über den Datenquellenassistenten einfüge und bestätige, dass die Datei ins Programm mit eingebunden werden soll.

    ##########

    Ich habe es mal bei Deinem Programm versucht. DataSet weg, AccessDatei aus dem Programm raus, ConnectionString aus den Settings raus. Dann die AccessDatei als Datenquelle hinzugefügt, abgelehnt, dass sie zum Projekt hinzugefügt wird, FrageTabelle als DGV auf's Form gezogen. Und siehe da, Änderungen werden nach dem Speichern akzeptiert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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