spätes Binden

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

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Was soll man ohne Code zu sehen schon sagen, was du ändern musst?
    Sicher ist eines, late binding ist unsicher, daher sollte man es vermeiden. Durch "Option Strict On" nötigt sich der Entwickler eben selbst "sauber(er)" zu programmieren.
    Andere Sprachen wie C# erlauben late binding sowieso gar nicht erst, verhindert wird damit gar nichts.

    docs.microsoft.com/de-de/dotne…tures/early-late-binding/
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim npgConnString As String
    2. Dim npgConnection As New npgConnection
    3. npgConnString = "text"
    4. npgConnection.ConnectionString = npgConnString
    5. Dim dt1 As DataTable
    6. Dim bs1 as BindingSource
    7. dt1 = New DataTable()
    8. bs1 = New BindingSource()
    9. Using cmd = New NpgsqlCommand()
    10. cmd.Connection = npgConnection
    11. cmd.CommandText = "text"
    12. Using sda As New NpgsqlDataAdapter(cmd)
    13. sda.Fill(dt1) 'Hier wird die Datatable durch die Datenbank befüllt
    14. End Using
    15. End Using
    16. bs1.DataSource = dt1
    17. dgv1.DataSource = bs1
    18. dt1.Columns.Add(New DataColumn("Ke_Prüfnummer", GetType(Integer))) ' Das geht
    19. dt1.Rows(3).Item(4).Value = 1 ' Das nicht


    Was ist an spätem Binden denn unsicher?
    @Haudruferzappeltnoch Du musst der DataTable die entsprechenden Spalten deklarieren, dann kannst Du auch dort die Werte von korrekten Typ zuweisen.
    Entweder Du machst das im XDesigner
    oder
    Du schaust mal hier rein:
    Differenz in Prozent ausrechnen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sorry ich kapiers wohl nicht. Ich hab jetzt wie im Beispiel die Spalten deklariert und versuche die Werte aus der Datenbank Tabelle in die neue Tabelle umzuschaufeln, dafür muss ich nur einen Eintrag abrufen, aber selbst da sagt er spätes Binden.

    VB.NET-Quellcode

    1. Private Function Inittable() As DataTable
    2. Dim mytable = New DataTable("Name")
    3. mytable.Columns.Add(New DataColumn("col1", GetType(Integer)))
    4. mytable.Columns.Add(New DataColumn("col2", GetType(Integer)))
    5. mytable.Columns.Add(New DataColumn("col3", GetType(Integer)))
    6. mytable.Columns.Add(New DataColumn("Prüfnummer", GetType(Long)))
    7. mytable.Columns.Add(New DataColumn("KE_Prüfnummer", GetType(Long)))
    8. mytable.Columns.Add(New DataColumn("Reihenfolge", GetType(Integer)))
    9. Return mytable
    10. End Function
    11. Sub
    12. mytable = Inittable
    13. For i As Integer = 0 To dt1.Rows().Count - 2
    14. Dim newRow As DataRow = mytable.NewRow()
    15. newRow(5) = i
    16. newRow(4) = 0
    17. newRow(3) = CLng(dt1.Rows(i).Item(3).Value) 'hier
    18. mytable.Rows.Add(newRow)
    19. Next
    20. End Sub

    Ne die datatable dt1 ist die Tabelle die schon die Datenbankeinträge aus der Datenquelle hat. Die neue DataTable mytable soll diese Einträge übernehmen (das wären 4 Spalten) Spalte 5 und 6 kommen dann dazu für später.
    Weil Rod meinte in dt1 sind die Spalten nicht deklariert. Die Art wie Rod die deklarierte Tabelle befüllt lässt sich nicht auf eine Datenquellenanbindung übertragen, deswegen wollte ich von Tabelle A zu Tabelle B einfach umschaufeln, dann wäre ich von der Datenquelle weg. (dt1 kommt noch aus dem oberen Code)

    Ich denke mir ist auch nicht klar was für dich "Sicherheit" ist.
    @Haudruferzappeltnoch Der Fehler kommt nicht beim Schrfeiben, sondern beim Auslesen.
    Wahrscheinlich musst Du die Herkunfts-Tabelle ebenso designen.
    Mach mal HOver über newRow(3) = CLng(dt1.Rows(i).Item(3).Value) => "Value". Was wird da angezeigt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da das Programm mit Option Strict On nicht läuft steht da nur: "Option Strict On lässt spätes Binden nicht zu".

    Nehme ich Option Strict On raus und lasse es laufen komme ich auf die Fehlermeldung andieser Stelle: "Der öffentliche Member Value für den Typ Decimal wurde nicht gefunden"
    In der Datenquelle ist betreffende Stelle aber eine Ganzzahl aber als Decimal, liegts also vielleicht am falschen Datentyp?

    Haudruferzappeltnoch schrieb:

    wurde nicht gefunden
    klingt so, als ob der Typ zwar Decimal ist, aber Value ist leer.
    Teste das mal mit IsDbNull: docs.microsoft.com/en-us/dotne…ion.isdbnull?view=net-5.0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    IsDBNull funktioniert auch nicht, aber ich habs gefunden.

    Der "Value" ist schon dt1.Rows(i).Item(3)

    Das verstehe ich zwar nicht, aber ich kriege da zum Beispiel meine Werte und kann dort genauso auch auf DBNull prüfen.

    Also

    VB.NET-Quellcode

    1. newRow(3) = dt1.Rows(i).Item
    2. oder
    3. If Convert.IsDBNull(dt1.Rows(i).Item(3)) Then..

    funktioniert

    Danke euch
    "Spätes binden..." - der CompilerFehler kommt immer, wenn du zwei inkompatible Datentypen kompinierst.

    Sowas:

    VB.NET-Quellcode

    1. Dim i As Integer = Textbox1.Text

    Textbox1.Text ist String und i steht ja da, wasses ist.
    Mit Strict On wird das abgelehnt, weil ein String ist kein Integer.
    Mit Strict Off wird "spätes Binden" angewandt, d.h. er versucht das auszuführen. Das kann auch klappen - wenn in der Textbox "25" drinne steht. Steht da aber "Haudraufundschluss" klappt das nicht.
    Das ist also unsicher, oder?

    Aber ich sags nochmal: Du bist da dabei, den zweiten Schritt vor dem ersten zu tun.
    Wenn du irgendwann mal lernst, wie man mit einem typDataset umgeht, dann kannste alles, was du derzeit am Entwickeln bist in die Tonne kloppen.
    Und das wird nicht ausbleiben, dass du das lernst, weil so wie du derzeit rumwurstelst, wird dir das iwann zu mühsam werden.

    Untypisierte DataTables sind eine Basisklasse für typisierte DataTables - direkt sollte man überhaupt nie darauf zugreifen.
    Das mit dem typisierten Dataset versuche ich ja auch, aber sowas kann ich nicht erstellen zu der Datenquelle die ich habe, weil wie im anderen Thread beschrieben keine eingebaute Verbindungsmöglichkeit zu dieser Datenquelle im Assistenten ist. Ich kann wohl wie du sagst das Ganze mit irgendeinem Dataset lernen, aber das macht dieses Problem hier ja nicht anders, wenn man das hier nicht anwenden kann.

    Das mit dem Assistenten hab ich aus einem deiner Videos, nur so weiß ich bisher wo man ein typisiertes Dataset herkriegt, wenn man das anders machen kann, lass es mich wissen.
    Du kannst (ich behaupte mal egal welche) Datenbank-Inhalte in dein typisiertes Dataset laden. Die daten fliegen dann im Arbeitsspeicher rum (was anderes machst du mit der obigen Methode im Übrigen auch nicht, nur auf unsicherem Weg).
    Das typDataSet muss aber eben genauso designed sein wie die Datenbank selbst (Tabellennamen, Spaltennamen, Datentypen) und dann geht das.
    Generell: (hat dir der ErfinderDesRades bestimmt auch schon vorgeschlagen - wenn nicht, dann steht das in den Tutorials drin) Bau' deine Anwendung erstmal mit typDataSet auf,
    die Datenbank kannste hinterher mit geringem Aufwand dranhängen - so kannst du aber erstmal die Anwendung an sich fertigstellen und dann mit "Live-Daten" arbeiten.

    Ich hab die Tortur auch durch und war am Ende froh, dass ich erst DataSet und später die Datenbank ans DataSet drangehangen hab
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Haudruferzappeltnoch schrieb:

    und versuche die Werte aus der Datenbank Tabelle in die neue Tabelle umzuschaufeln


    Wenn Du "umschaufelst", dann hindert dich ja niemand daran, die Daten in eine stark typisierte Tabelle (Designer: Dataset ohne Anbindung, Tabellen designen, Sache von 3 Minuten) reinzuschaufeln oder auch in eine selbst gebaute POCO Klasse reinzuschaufel. Bei der POCO Klasse brauchst vielleicht 5 Minuten, weil es ungewohnt ist und kein Designer hilft.
    Bei Winform (und nur bei Winform) hilft Dir der Designer dann auch noch beim Binden der Tabellen an die Controls.
    Beim DataSet kannst Du deine Daten mit dataSetName.WriteXml sichern und mit dataSetName.ReadXML wieder einlesen.
    Bei POCO geht das über Serialisieren und Deserialisieren.

    Dein Code, deutlich les-, wartbarer und kürzer, damit übersichtlicher. Zuweisungsfehler bekommst sofort um die Ohren gehauen und Intellisense unterstützt dich auch noch.

    Haudruferzappeltnoch schrieb:

    Das mit dem typisierten Dataset versuche ich ja auch, aber sowas kann ich nicht erstellen zu der Datenquelle die ich habe
    Du kannst im Dataset-Designer jedes Dataset erstellen, was dir beliebt: vier Views-Videos
    Ist dann halt händisches gefrickel, wenn kein DbConnector verfügbar ist. Aber untypisierte Datasets enden in Gefrickel ohne Ende.