DataAdapter StrongTypingException aber die Datentypen stimmen

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

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

    DataAdapter StrongTypingException aber die Datentypen stimmen

    Hallo,

    ich bekomme eine StrongTypingException in meiner DataTable beim befüllen mittels DataAdapter. Ich mache es folgendermaßen:

    die DataTable rawtest hat zwei Spalten Zeitstempel und Wert, erstere ist als DateTime definiert, zweitere als Int16

    VB.NET-Quellcode

    1. da.Fill(DS1.rawtest)


    Warum denke ich, dass die Datentypen stimmen? Die Spalten der Datenbank sind DateTime und smallint. Beim Auslesen sieht man in VS bspw. #11/03/2022 03:33:22 PM# für Spalte 1 oder Zahlen im zweistelligen Bereich für spalte2. Außerdem kriege ich bei diesem Code keinerlei Fehlermeldung, nur die Tabelle wird nicht befüllt.

    VB.NET-Quellcode

    1. Private Sub btStart_Click(sender As Object, e As EventArgs) Handles btStart.Click
    2. ''Überprüfe mit DataReader Werte in Datenbankabfrage
    3. Dim a As DateTime
    4. Dim b As Short
    5. Using con As New SqlConnection("Data Source=mydatasource;Initial Catalog=mycatalog;Integrated Security=False;User ID=abc;Password=abc;Connect Timeout=15")
    6. con.Open()
    7. Using da As SqlDataReader = New SqlCommand("Select Erfassungszeit, SubStatus from mytable", con).ExecuteReader
    8. While da.Read
    9. a = CDate(da.Item(0))
    10. b = CShort(da.Item(1))
    11. End While
    12. End Using
    13. con.Close()
    14. End Using
    15. ''Befülle Tabelle mit DataAdapter
    16. DS1.rawtest.Clear()
    17. Using con As New SqlConnection("Data Source=mydatasource;Initial Catalog=mycatalog;Integrated Security=False;User ID=abc;Password=abc;Connect Timeout=15")
    18. Using da As New SqlDataAdapter("Select Erfassungszeit, SubStatus from mytable", con)
    19. da.Fill(DS1.rawtest)
    20. End Using
    21. End Using
    22. End Sub


    Was übersehe ich denn?

    Viele Grüße

    *Topic verschoben*

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Dann mach doch erstmal ne Testtabelle mit einem Eintrag. Wenn das auch crasht, dann poste mal, was datentyp- und werttechnisch in der DB steht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Na Moment. So ein ähnliches Ding hatte heute jan99. Lass Dir mal bitte anzeigen, welchen Datentyp der Datumswert aus der DB in VB hat. Bei ihm kam nämlich nicht System.DateTime raus, sondern OracleDateTime. Und das musste erstmal konvertiert werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich hab grad keine DB zur Hand, aber welche Datenproperties liefert denn der SqlDataReader zurück? Vielleicht spuckt der aus, welche DataTypes hinterlegt sind. Das schien zumindest der OracleReader bei jan99 zu können.

    btw: #11/03/2022 03:33:22 PM# liefert nicht den 11. März, sondern den 3. November zurück, da das us-amerikanische Datumsformat #Monat/Tag/Jahr Uhrzeit# hier verwendet wird. Das weißt Du, oder?

    ##########

    IN Netz wird die Exception auch immer wieder mit NULL in Verbindung gebracht. Was passiert, wenn Du testweise im tDS-Designer die Spalteneigenschaft NullValue von (Throw Exception) auf was anderes (sinnvolles) stellst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Ja hab ich nicht richtig wieder gegeben, das Datum ist tatsächlich #3/11/2022 03:33:22 PM#. Normalerweise sehe ich diese Darstellung ja auch nicht wenn alles funktioniert^^


    Bin im DataReader tatsächlich fündig geworden:

    Für die zweite Spalte entsprechend der Integer.

    ThrowException ist die einzige Option für eine DateTime Spalte. Wenn ich Empty und Nichts versuche sagt VS direkt ungültiger Eigenschaftswert und springt zurück auf ThrowException

    Haudruferzappeltnoch schrieb:

    Für die zweite Spalte entsprechend der Integer.
    Wiewas Integer? Ich dachte Short? Integer ist nicht Int16!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    probierma sowas:

    VB.NET-Quellcode

    1. Private Sub btStart_Click(sender As Object, e As EventArgs) Handles btStart.Click
    2. ''Befülle Tabelle mit DataAdapter
    3. dim tb=new DataTable
    4. Using con As New SqlConnection("Data Source=mydatasource;Initial Catalog=mycatalog;Integrated Security=False;User ID=abc;Password=abc;Connect Timeout=15")
    5. Using da As New SqlDataAdapter("Select Erfassungszeit, SubStatus from mytable", con)
    6. da.Fill(tb)
    7. End Using
    8. End Using ' hier stoppen, und tb angucken. ab vs2019 gibts da einen Intellisense-Button, der eine tabellarische Ansicht der DataTable anzeigt - sehr komfortabel!
    9. End Sub
    Ja sorry in mssql heißt der short smallint. Da stimmt jedenfalls alles auch so wie mit der DateTime.

    Die untypisierte dt wird beschrieben, mit genau den Elementen wie der DataReader sie mir zeigt. Finde ich auch nur im tb.rows(0).ItemArray. Sind also auch vom Typ Object erstmal. Ich finde allerdings nicht den Pfad um hier den echten dahinterliegenden Typ zu finden wie beim DataReader.
    scheinbar hast du die Tabellen-Preview nicht gefunden - welche VS-Version verwendest du?

    Es geht bei meim Versuch nicht um die Datentypen, sondern auch um die Werte - also sind wirklich alle Properties aller Datensätze mit dem befüllt, was du denkst?
    (Und wenn es mehrere Rows gibt, dann muss auch in jeder ein ItemArray sein)
    Ohman nu hab ichs. VB ist mal wieder schlauer als mir gut tut.

    Die Spalten werden anhand ihrer Namen zugeordnet und nicht anhand ihrer Reihenfolge. Daher hat er die Spalten des ResultSets nirgendwo hingetan, denn die Spalten gabs ja nicht in der dt, und für die Spalten der dt hatte er kein Ergebnis deswegen wahrscheinlich versucht mit Nothing oder so zu füllen.

    Im Sql hab ich also die Spalten so umbenannt wie sie in der VB dt stehen. Quasi

    SQL-Abfrage

    1. Select Spalte1Sql as Spalte1VB, ...