Einzelne Spalte einer Tabelle laden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von TS71M.

    Einzelne Spalte einer Tabelle laden

    Hallo Leute,

    ich habe zu meiner Artikel Tabelle eine ChildTable mit Bildern/Dokumenten, damit das laden nicht zu lange dauert und die Bilder erst beim click auf einen Artikel geladen werden. Das funktioniert auch alles.
    Ich würde nur gerne in der Artikel Tabelle anzeigen, ob ein Bild vorhanden ist oder nicht, ohne dafür die gesamte Bildertabelle zu laden, sondern nur die ID Spalte.
    Also so etwas

    SQL-Abfrage

    1. SELECT `ArtikelID` FROM `ArtikelLabel`


    Ich weiss nur nicht wo und wie ;) bitte um Hilfe
    Hast du einen Fremdschlüssel zur Tabelle?
    Kannst du zeigen wie die beiden Tabellen ausschauen (Spalten,..)?
    Normalerweise kannst du sowas mit einen Join oder einer Unter-Abfrage machen (im Where).
    Ist in der Tabelle wo die Bilder sind, nur Bilder oder auch andere Werte?
    Wenn es nur Bilder sind, und du sehen möchtest ob zu den Artikel Bilder vorhanden sind, kannst du das mit Count machen, wenn Count = 0, sind also keine Bilder in der Tabelle.
    Da gibt es eine typ. Methode, die dir die Childrows in Abhängigkeit der ID zurückgibt...

    VB.NET-Quellcode

    1. Dim rw = Me.DeinDataSet.DeineTabelle.FindByDeineID(DeineID)
    2. 'in deinem Fall wäre das...
    3. Dim rw = Me.DeinDataSet.ProduktLabel.FindByProduktID(...)
    DeinDataSet musst du halt an deinen DataSet-Namen anpassen...

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

    Ja, das ist schon klar...aber ich fülle die Tabelle nicht beim Start, da dies zu lange dauern würde alle Bilder herunterzuladen. Deswegen auch eine eigene Tabelle. Abfrage erst bei Click und nur für den ausgewählten Artikel.

    VB.NET-Quellcode

    1. Dim rwProduct = bsProduct.At(Of ProductRow)()
    2. rwProduct.FillChildTable(Web257_db2DataSet.ProductLabel, "WHERE ProductID = ?", rwProduct.ProductID)


    Somit wärte deine Abfrage immer 0.

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

    ErfinderDesRades schrieb:

    zB mit SqlServer kann man alles in dieselbe DB packen.
    Gedanken sollte man sich aber zum Datenmodell machen, etwa dass man Blobs in besondere Tabellen auslagert, auf die verwiesen wird.
    Dann kann man die Standard-Datensätze weiterhin in großen Portionen ratzfatz abrufen, und nachladen einzelner Bilder etc. dann halt in gesonderten Abfragen.
    Um den Traffic niedrig zu halten, und auch den Speicher-Verbrauch im Client.

    Ich bin mal mit einem zunächst paradox anmutendem Datenmodll gut gefahren:
    Nicht der Artikel-Datensatz verwies auf die Bild-Datei, sondern der BildDatei-Datensatz verwies auf den Artikel.
    Also die Relation (quasi falschrum):
    Artikel -> Bild
    Und programmgesteuert sorgte ich dafür, dass jedem Artikel nur ein Bild zugeordnet war.
    So konnte ich mit Leichtigkeit viele (in meinem Fall: alle) Artikel laden, und wenn einer angewählt wurde lud und präsentierte ich "alle" dessen Bilder nach (es war nur eines - oder keines)

    Aber wie gesagt: Bestimmte Provider - wie zB Access - kriegen so Riesen-Datenbestände nicht gebacken, für andere - SqlServer, MySql, Oracle,... - ist das kein Thema.


    Das ist genau das, was ich gemacht habe.
    Ich möchte nun aber bereits in der ProductForm anzeigen, ob ein Bild/Dokument hinterlegt ist.
    Und damit zurück zu Post #1 ;)
    Also es gibt ne Tabelle Product und eine ProductLabels.
    Meine Idee war, dass ich beim öffnen der ProductForm einen Abruf starte der mir zurückgibt welche IDs ein Bild haben.
    Irgendwie so:

    VB.NET-Quellcode

    1. ProductLabel.fill(SELECT `ProductID` FROM `ProductLabel`) '''was so aber natürlich nicht funktioniert ;)

    Wenn ich die reine SQL-Abfrage auf dem Server laufen lassen, bekomme ich genau 1 (anstatt 3) spalten zurück (ProductID). Nur wie baue ich diese in mein fill ein? ?(
    Damit könnte ich in der ProductForm bereits anzeigen, ob ein Bild/Dokument da ist oder nicht, ohne alle Bilder herunter zu laden.
    Bilder
    • Product.jpg

      34,82 kB, 510×244, 101 mal angesehen
    naja, du kannst eine DataTable nur mit Abfragen befüllen, die zu den Spalten der DataTable passen.
    Passt deine Abfrage nicht, musst du entweder die Abfrage ändern, oder die DataTable.

    Scheinbar gibts in deim Dataset keine Tabelle für diese Abfrage:

    SQL-Abfrage

    1. SELECT `ProductID` FROM `ProductLabel
    Spricht etwas dagegen, diese Tabelle dann eben anzulegen?
    Solange du sie nicht rückspeicherst scheint mir das vergleichsweise unproblematisch.
    was verstehst du unter "in vb .NET eine Abfrage stellen"?

    Kannst du überhaupt eine "Abfrage stellen", gemäß deinem Verständnis von "Abfrage stellen"?

    Falls ja, dann lautet die Antwort auf die Frage: "Wie kann ich in vb .NET diese Abfrage stellen?" wohl: Ebenso, wie du es bislang machst.

    Tut mir leid, mag dir vorkommen, als wolle ich dich nur veräppeln, aber unter "Abfrage stellen" kann man viel verstehen, und was ich darunter verstehe, da gibts wiederum zig Möglichkeiten, es umzusetzen.
    Aber ich kann jetzt nicht bei Adam und Eva anfangen, und dir erklären, wie man Daten von einer Datenbank abruft - zumal du dich da sicherlich bereits für eine der vielen Möglichkeiten entschieden hast.
    Puh...
    Also ich benutze deine Extensions und lade alle Tabellen so:

    VB.NET-Quellcode

    1. With Web257_db2DataSet
    2. .Fill(.Year, .Group, .Account,...
    3. End with


    Und manchmal auch so:

    VB.NET-Quellcode

    1. Dim rwProduct = bsProduct.At(Of ProductRow)()
    2. rwProduct.FillChildTable(Web257_db2DataSet.ProductLabel, "WHERE ProductID = ?", rwProduct.ProductID)


    Aber ich hab eben keine Ahnung, wo und wie ich diese verdammte

    SQL-Abfrage

    1. SELECT `ProductID` FROM `ProductLabel`

    in meine Fill-Abfrage einbauen kann und soll.
    ah - das ist doch mal eine Info!
    Hmm - weiß ich jetzt auch nicht... Also meine Extensions sind nicht dafür vorgesehen. Daher müssteste wohl die allgemeine Standard-Vorgehensweise anwenden, wo man ein Select-Command erstellt, und mit cmd.ExecuteReader sich die Datensätze holt.

    Aber kommt auch drauf an, was du damit machen willst.

    Wenn du etwa nur Artikel anzeigen willst, wo's Bilder zu gibt, einen solchen Join kann man schon bauen mit meine Extensions.
    Aber wenn du wie in post#11 gefragt und nicht beantwortet, eine Zusatz-Spalte brauchst, die anzeigt, ob Bildle verfügbar, dann wirds kniffliger.
    Aber sag erstmal, was du machen willst.
    also so kannste die BildleIDs in ein Hashset laden:

    VB.NET-Quellcode

    1. Dim BildleIDs = New HashSet(Of Integer)
    2. Using cmd = New OleDbCommand("Select ProductID from Bildles", con)
    3. Const ProductIDColumn As Integer = 0
    4. con.Open()
    5. Using rd = cmd.ExecuteReader
    6. While rd.Read
    7. BildleIDs.Add(rd.GetInt32(ProductIDColumn))
    8. End While
    9. End Using
    10. con.Close()
    11. End Using
    Als Connection nimmste die vom DbExtensions-DatasetAdapter.
    Dann kannste zB im DGV-Cellpainting die Zellen colorieren, deren Datensatz eine ID hat, die im Hashset vorkommt.

    Wäre das mit PHP einfacher?