SQLiteDataAdapter

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von The_Saint.

    SQLiteDataAdapter

    Edit by ErfinderDesRades: (Thema verschoben) Bitte richtiges UnterForum wählen!


    Hallo Zusammen,

    ich habe mal folgende Frage:

    ich habe eine Combobox gefüllt.

    hierzu nutze ich folgende Befehle:
    ds = New DataSet()
    dataadapter1 = New SQLiteDataAdapter(selStr, SQLconnect)
    dataadapter1.fill(ds,"Kategorie")

    Hierzu habe ich folgende Frage:

    wie kann ich die Combobox neu füllen lassen?
    gibt es hierzu einen Befehl?
    wenn ich dataadapter1.fill... mehrmals aufrufe, dann verdoppeln sich die Listeinträge.

    könnte mir jemand behilflich sein und mir zeigen wie man die combobox neu füllt?

    viele dank für eure hilfe

    viele grüße

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

    The_Saint schrieb:

    könnte mir jemand behilflich sein und mir zeigen wie man die combobox neu füllt?
    bei einer Datengebundenen Combo füllt man die Combo nicht, sondern man füllt die DataTable, an die sie gebunden ist.
    Dein Code kann aber nicht stimmen, denn an die dortige DataTable wird nirgends gebunden.

    ausserdem: Bitte VB-Tag benutzen - aber richtig
    wenn ich dataadapter1.fill... mehrmals aufrufe, dann verdoppeln sich die Listeinträge.
    Das liegt wohl an der Tatsache, dass du keinen Primary Key spezifiziert hast .
    Die Beschreibung von DataAdapter.Fill sagt aus:
    You can use the Fill method multiple times on the same DataTable. If a primary key exists, incoming rows are merged with matching rows that already exist. If no primary key exists, incoming rows are appended to the DataTable.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    ErfinderDesRades schrieb:

    bei einer Datengebundenen Combo füllt man die Combo nicht, sondern man füllt die DataTable, an die sie gebunden ist.
    Dein Code kann aber nicht stimmen, denn an die dortige DataTable wird nirgends gebunden
    hallo erfinderdesrades,

    VB.NET-Quellcode

    1. SQLconnect = New SQLiteConnection("Data Source=" + DB + ";")
    2. daKateg = New SQLiteDataAdapter(selStrKateg, SQLconnect)
    3. Dim cb As New SQLiteCommandBuilder(daKateg)
    4. ds = New DataSet()
    5. SQLconnect.Open()
    6. daKateg.Fill(ds, "Kategorie")
    7. SQLconnect.Close()
    8. BindingSourceKateg.DataSource = ds.Tables("Kategorie")
    9. ComboBox1.DataSource = BindingSourceKateg
    10. ComboBox1.DisplayMember = "Kategoriename"
    11. ComboBox1.ValueMember = "KategorieNr"


    Verzeihung. Habe mich wohl nicht korrekt mit dem füllen ausgedrückt.
    So fülle ich die DataTable.

    hallo petaod,
    ein Primary Key ist spezifiziert. Daran liegt es wohl nicht.


    Leider komme ich einfach nicht über den Berg um das Problem zu lösen ??

    Gibt es noch eine andere Möglichkeit??

    Viele Grüße
    dann eben

    VB.NET-Quellcode

    1. ds.Tables("Kategorie").Clear
    Aber ist so oder so Crap, bei jeder Befüllung das ganze Dataset auszutauschen.

    Aber dein Code kann immer noch nicht stimmen.
    Denn nach dem Code hast du jetzt die Combo an eine taufrische und frisch befüllte DataTAble gebunden.
    Darin können keinesfalls doppelte Werte vorkommen.

    ErfinderDesRades schrieb:

    Aber dein Code kann immer noch nicht stimmen.
    Denn nach dem Code hast du jetzt die Combo an eine taufrische und frisch befüllte DataTAble gebunden.
    Darin können keinesfalls doppelte Werte vorkommen.
    hallo erfinderdesrades,

    hm, also beim eintippen der ersten buchstaben in die combobox überprüfe ich ob diese kategorie schon existiert. wenn sie nicht existiert, öffne ich eine weitere form, in der ich eine neue kategorie anlegen kann. nach dem schließen der weiteren form springe ich zurück zur combobox und da die fill methode immer die liste verdoppelte, suchte ich die möglichkeit die combobox neu zu füllen (auch mit der neu erfassten kategorie).

    viele grüße
    ah - formübergreifende Databinding.

    Es ist natürlich auch Unfug, bei jedem neuen Form, was dasselbe Dataset bearbeiten soll, immer ein neues Dataset neu zu befüllen.
    Du musst was unternehmen, dasss alle Forms mit derselben Dataset-Instanz arbeiten.

    Kurzngut: Du musst überhaupt den Umgang mit typisiertem Dataset, und Databinding erlernen.
    Guggemol vier Views-Videos - da werden ungefähr die meisten Grundlagen abgehandelt.
    Einen formübergreifend gebundenen Edit/AddNew-Dialog zu coden ist in [VB.NET] Daten laden, speichern, verarbeiten - einfachste Variante gezeigt.

    VB1963 schrieb:

    @The Saint:
    Ups, ich habe das mit dem TableAdapter.ClearBeforeFill gemeint...
    Aber das ist, wie @ErfinderDesRades: schon schrieb...
    hallo vb1963,
    vielen dank. es hat funktioniert :)

    ErfinderDesRades schrieb:

    Es ist natürlich auch Unfug, bei jedem neuen Form, was dasselbe Dataset bearbeiten soll, immer ein neues Dataset neu zu befüllen.
    Du musst was unternehmen, dasss alle Forms mit derselben Dataset-Instanz arbeiten.
    hallo erfinderdesrades,
    jetzt hat es funktioniert. super vielen dank.
    ja habe mir die videos schon letzte woche angesehen. nur habe ich die datasets manuell erstellt.
    du nutzt die in visual studio vorhandenen hilfsmittel. was ich demnächst auch machen werde.

    ErfinderDesRades schrieb:

    Kurzngut: Du musst überhaupt den Umgang mit typisiertem Dataset, und Databinding erlernen.
    Guggemol vier Views-Videos - da werden ungefähr die meisten Grundlagen abgehandelt.
    Einen formübergreifend gebundenen Edit/AddNew-Dialog zu coden ist in [VB.NET] Daten laden, speichern, verarbeiten - einfachste Variante gezeigt.
    wie oben schon geschrieben, habe ich mir deine tuts angesehen und finde sie verdammt super gelungen.
    vielen dank für die viele mühe.

    viele grüße

    ErfinderDesRades schrieb:

    ah - formübergreifende Databinding.

    ErfinderDesRades schrieb:

    Kurzngut: Du musst überhaupt den Umgang mit typisiertem Dataset, und Databinding erlernen.
    Guggemol vier Views-Videos - da werden ungefähr die meisten Grundlagen abgehandelt.
    Einen formübergreifend gebundenen Edit/AddNew-Dialog zu coden ist in [VB.NET] Daten laden, speichern, verarbeiten - einfachste Variante gezeigt.
    hallo erfinderdesrades,

    nachdem ich mir alle videos von dir angesehen habe, raucht mir der kopf und ich komme nicht mehr weiter.
    ich greife auf eine sqlite datenbank zu. diese datenbank enthält verschiedene tabellen:
    z.b. kategorien, artikel, lieferanten.

    in einer eigenen form lege ich einen artikel an. jeder artikel erhält eine kategorie (combobox mit dem
    inhalt bereits vorhandener kategorien).
    jetzt kommt mein problem:
    wenn die kategorie nicht existiert möchte ich eine neue form öffnen, die kategorie wird neu
    angelegt / erfasst, gespeichert und die form geschlossen. die form in dem ich den artikel anlege
    soll jetzt in der combobox die neue kategorie direkt übernehmen.

    das neuanlegen der kategorie klappt, aber die übernahme in die bereits bestehende form für
    das anlegen des neuen artikels klappt nicht. kriege es einfach nicht hin.

    auch wenn ich die combobox (datatable..) neu befülle mit den werten aus der tabelle. kriege
    ich immer die meldung die kategorie existiert nicht, obwohl sie eindeutig in der sqlite datenbank
    vorhanden ist.

    wäre echt klasse wenn du mir hier hilfestellung geben könntest.

    vielen dank ...

    viele grüße
    noch einmal: dein Problem heißt formübergreifendes Databinding.

    Die Sqlite-DB hat nix damit zu tun, denn gebunden wird an DataTables - nicht an Datenbank-Tabellen.

    Das Problem beim formübergreifenden Databinding ist, dass auf jedem Form ein eigenes Dataset liegt.
    Wenn du also in Form2 eine Kategorie hinzufügst, dann ist sie dem Dataset in Form2 zugefügt - das Dataset in Form1 weiß nichts davon.

    Vermutlich gehst du nun hin, und schreibst das in Form2 liegende Dataset in die DB, und anschließend in Form1 befüllst du das dortige Dataset erneut aus der DB.
    Das ist aber Clusterfuck, aus verschiedenen Datasetsen dieselbe DB zu befüllen -
    • unnötiger DB-Traffic
    • wirft DB-Concurrency-Probleme auf - das sind Probleme, die normalerweise nur bei Mehrbenutzer-DBs auftreten, und sind die schwierigsten DB-Probleme überhaupt
    • unnötiger Speicher-Verbrauch, denn dieselben Daten liegen mehrfach vor
    • Beim Reload in Form1 gehen die aktuellen Positionen verloren, also was vorher angewählt war ist nach dem Reload nicht mehr ohne weiteres bestimmbar.
    Lösung: naja - wird in 4-Views ja gezeigt, wie man ein Dataset registriert, wenn man meine Helpers-Projekte eingebunden hat.
    Das ist eine Zeile Code, (von der dir der Kopf raucht)
    Wenn meine Helpers ein Dataset registrieren, dann tauschen sie alle Vorkommnisse dieses Datasets aus durch ein einziges.
    Damit sind auf einen Schlag alle diese Probleme gelöst, also wenn du in einem registrierten Dataset in Form2 eine Kategorie zufügst, dann gibts auch in Form1 auf einmal eine Kategorie mehr, denn: Es ist ja nun dasselbe Dataset :D

    ErfinderDesRades schrieb:

    noch einmal: dein Problem heißt formübergreifendes Databinding.

    Damit sind auf einen Schlag alle diese Probleme gelöst, also wenn du in einem registrierten Dataset in Form2 eine Kategorie zufügst, dann gibts auch in Form1 auf einmal eine Kategorie mehr, denn: Es ist ja nun dasselbe Dataset :D
    hallo erfinderdesrades,

    danke für deine geduld mit mir.
    du hast recht und mein problem erkannt.

    hm, werde versuchen es so zu machen wie du es vorgeschlagen hast.

    nochmals vielen dank.

    kannst du mir noch einen tipp geben, wie ich folgendes lösen kann?
    bei der erfassung der kategorie überprüfe ich die erfassten buchstaben und schlage sofort
    einen treffer vor. z.b. wird der buchstabe "a" in der combobox gedrückt und ich schlage dann
    die gefundene kategorie "allgemein" vor.

    wie kann ich es programmieren, dass bei keiner übereinstimmung die form für das erfassen
    einer neuen kategorie aufgerufen wird?

    vielen dank

    viele grüße
    das würde ich hintanstellen.
    Löse erstmal deine grundlegenden Probleme, bevor du dich an so super-intelligente Steuerelemente machst.
    Ist ja noch nichtmal auskonzipiert: Etwa vertippt man sich da, und bing! poppt nervtötend ein neues Form auf, mit dem man eiglich nix zu tun haben wollte - also wäre dieses Feature ühaupt wünschenswert?

    Ich hatte ähnliches mal gelöst, indem ich (scheinbar) im DropDown einen Button "neu" angezeigt hatte.

    Aber Combobox ist in dieser Hinsicht eh noch erweiterungsbedürftig: ich würde mir auch einen Button "kein" wünschen, den man klicksen kann, um anzugeben, dass man keine der angebotenen Optionen wählt.

    Dataview bzw. Datatable Problem

    Hallo Zusammen,
    hallo ErfinderDesRades,

    leider grüble ich über ein Problem, finde nicht so richtig etwas im Internet... oder suche evtl. falsch:
    Folgendes Problem habe ich:

    Ich habe folgende Tabellen:
    Artikel und Kategorien
    Tabelle Artikel: ArtikelNr, Artikelname, KategorieNr
    Tabelle Kategorie: KategorieNr, KategorieName

    Folgenden Code benutze ich:

    VB.NET-Quellcode

    1. Dim dv As New DataView
    2. Dim dt As New DataTable
    3. dv = New DataView(ErfArtikeldts.tblArtikel)
    4. dv.RowFilter = "ArtikelName Like '" & Me.ArtikelNameTextBox.Text & "*'"
    5. dv.Sort = "ArtikelName ASC"
    6. dt = dv.ToTable(True, "ArtikelName")
    7. DataGridView1.DataSource = dt


    Jetzt möchte ich im Datagridview anstelle der KategorieNr den KategorieNamen anzeigen zu lassen.

    VB.NET-Quellcode

    1. dt = dv.toTable(True, "ArtikelName", "KategorieNr")


    Dies funktioniert. Aber ich kriege es nicht hin, dass er den Namen anzeigt. Ich weis nicht wo ich im
    Moment ansetzen muss damit ich dies hinkriege.

    Es kommt hierbei zu folgender, wohl verständlicher Fehlermeldung, wenn ich folgenden Code verwende:

    VB.NET-Quellcode

    1. dt = dv.toTable(True, "ArtikelName", "KategorieName")


    Zusätzliche Informationen: Die Spalte 'KategorieName' gehört nicht zur zugrunde liegenden Tabelle 'tblArtikel'

    Wäre toll wenn mir hier jemand Hilfestellung geben könnte. Oder muss ich das ganz anders anfangen??

    Schon mal vielen Dank.

    Viele Grüße

    The_Saint schrieb:

    Jetzt möchte ich im Datagridview anstelle der KategorieNr den KategorieNamen anzeigen zu lassen.
    das geht mit einer DatagridViewComboboxColumn.
    Aber das geht nicht, wenn man ständig zur Laufzeit die DataSources ändert.
    Databinding-getriebene Oberflächen-Entwicklung konfiguriert die Databindings einmal im Form-Designer, und dann funzt das.

    gugge vier Views-Videos - ach - hab ich dir doch schon empfohlen, also guck da nach, wies geht.

    ErfinderDesRades schrieb:


    gugge vier Views-Videos - ach - hab ich dir doch schon empfohlen, also guck da nach, wies geht.
    Hallo ErfinderDesRades,

    hm, habe mir die vier Views angesehen. Vielen Dank. Die sind echt hilfreich.
    Habe auch das weitest gehend so umgestellt, wie es dort gezeigt wird, bzw. so wie ich es verstanden habe.

    Das hat auch alles super geklappt. Ich befinde mich jetzt nur bei der Neuerfassung eines Artikels.
    Dort wird vom nutzer ein Artikelname erfasst und nach der Eingabe von 5 Zeichen, sucht er die vorhandenen
    Artikel heraus und gibt sie in einem gesonderten Datagridview aus. In dem DataGridView soll unter anderem
    der Artikelname und der Kategoriename angezeigt werden.
    Weis nicht ob das vorhin im vorhergehenden Beitrag so rüber kam.

    Vorher hatte ich das so gelöst:

    VB.NET-Quellcode

    1. Dim dt As New DataTable
    2. Dim selStrFBSuche As String
    3. Dim bs As New BindingSource
    4. selStrFBSuche = "SELECT tblArtikel.ArtikelName,tblKategorie.KategorieName " & _
    5. "FROM tblArtikel INNER JOIN tblKategorie ON tblArtikel.KategorieNr = tblKategorie.KategorieNr " & _
    6. "where tblArtikel.ArtikelName like " + "'" + Me.TextBox1.Text + "%'" & _
    7. "order by tblArtikel.ArtikelName;"
    8. daFBSuche = New SQLiteDataAdapter(selStrFBSuche, SQLconnect)
    9. ds.Tables.Add(dt)
    10. daFBSuche.Fill(dt)
    11. bs.DataSource = dt
    12. Me.DataGridView1.DataSource = bs


    Also so hab ich das ohne Probleme hinbekommen.
    Der Nutzer gibt in der Textbox Buchstaben ein und ich suche nach den vorhandenen Artikelnamen...
    Nur durch die von Dir vorgeschlagenen Änderungen. Krieg ich es nicht hin.

    Stehe gerade total auf den Schlauch.

    Hm, muss ich wohl noch mal drüber Grübeln....

    Vielen Dank für Deine Geduld

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