Announcement

Collapse
No announcement yet.

Typumwandlung ist ungültig

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Typumwandlung ist ungültig

    Hi,

    Ich nutze gerade für ein Projekt das Caliburn Micro MVVM Pattern ( falls das relevant ist ).

    Mein Vorhaben:
    Ich lade eine Liste mit Artikeln in eine Liste und möchte diese anschließend einer BindableCollection zuweisen. Dazu habe ich folgende Codes:

    ArticleDataModel.cs
    PHP Code:
        public class ArticleDataModel
        
    {
            public 
    bool Aktiv getset; }
            public 
    string Artikelnummer getset; }
            public 
    int AuspraegungID getset; }
            public 
    string ArtikelSKU getset; }
            public 
    string HauptArtikelgruppe getset; }
            public 
    string ArtikelTyp getset; }
            public 
    string ArtikelTypBezeichnung getset; }
            public 
    string Matchcode getset; }
            public 
    string Bezeichnung1 getset; }
            public 
    string Bezeichnung2 getset; }
            public 
    string Bezeichnung getset; }
            public 
    string Variante getset; }
            public 
    decimal Laenge getset; }
            public 
    decimal Hoehe getset; }
            public 
    decimal Breite getset; }
            public 
    decimal Gewicht getset; }
            public 
    decimal Bestand getset; }
            public 
    decimal BestandPick getset; }
            public 
    string Offen getset; }
            public 
    string SplitSize getset; }
        } 

    MainViewModel.cs ( relevanter Auszug ):
    PHP Code:
            public BindableCollection<ArticleDataModelArticleDataList getset; }


            public 
    MainViewModel()
            {

                
    /*
                 * auskommentierter Bereich
                */

                
    using DataTable dt DataBaseModel.Query() ) {

                    if (
    dt.Rows.Count 1)
                        return;

                    List<
    ArticleDataModellstData = new List<ArticleDataModel>();

                    foreach (
    DataRow r in dt.Rows) {

                        
    lstData.Add( new ArticleDataModel() {
                                
    Aktiv r.Field<Boolean>("Aktiv"),
                                
    Artikelnummer r.Field<string>("Artikelnummer"),
                                
    AuspraegungID r.Field<int>("AuspraegungID"),
                                
    ArtikelSKU r.Field<string>("ArtikelSKU"),
                                
    HauptArtikelgruppe r.Field<string>("HauptartikelGruppe"),
                                
    ArtikelTyp r.Field<string>("ArtikelTyp"),
                                
    ArtikelTypBezeichnung r.Field<string>("ArtikelTypBezeichnung"),
                                
    Matchcode r.Field<string>("Matchcode"),
                                
    Bezeichnung1 r.Field<string>("Bezeichnung1"),
                                
    Bezeichnung2 r.Field<string>("Bezeichnung2"),
                                
    Bezeichnung r.Field<string>("Bezeichnung"),
                                
    Variante r.Field<string>("Variante"),
                                
    Laenge r.Field<decimal>("Laenge"),
                                
    Breite r.Field<decimal>("Breite"),
                                
    Hoehe r.Field<decimal>("Hoehe"),
                                
    Gewicht r.Field<decimal>("Gewicht"),
                                
    Bestand r.Field<decimal>("Bestand"),
                                
    BestandPick r.Field<decimal>("BestandPick"),
                                
    Offen r.Field<string>("Offen"),
                                
    SplitSize r.Field<string>("SplitSize")
                        });

                    }

                    
    ArticleDataList = new BindableCollection<ArticleDataModel>( lstData );

                }

            } 

    Im Debugger sehe ich, dass er 9602 DataRows hat, also alles geladen wurde. Der Umwandlungsfehler muss in diesem Bereich sein:
    PHP Code:
    lstData.Add( new ArticleModel() {
            
    // ...
        
    }); 

    Zum Vergleich evtl. noch hilfreich, der Query-Aufbau:
    PHP Code:
    select
        Aktiv 
    cast(abs(isnull(ArtikelStamm.Aktiv0)) as bit),
        
    Artikelnummer ArtikelStamm.Artikelnummer,
        
    AuspraegungID Variante.AuspraegungID,
        
    ArtikelSKU ArtikelStamm.Artikelnummer iif(Variante.AuspraegungID 0';' cast(Variante.AuspraegungID as varchar(5)), ''),
        
    HauptartikelGruppe ArtikelStamm.Hauptartikelgruppe,
        
    ArtikelTyp = case
            
    when ArtikelStamm.Stuecklistentyp 3 then 'L'
            
    when ArtikelStamm.Stuecklistentyp 2 then 'H'
            
    when ArtikelStamm.Stuecklistentyp 1 then 'P'
            
    else 'A'
        
    end,
        
    ArtikelTypBezeichnung = case
            
    when ArtikelStamm.Stuecklistentyp 3 then 'Leistungsstückliste'
            
    when ArtikelStamm.Stuecklistentyp 2 then 'Handelsstückliste'
            
    when ArtikelStamm.Stuecklistentyp 1 then 'Produktionsstückliste'
            
    else 'Stammartikel'
        
    end,
        
    Matchcode ArtikelStamm.Matchcode,
        
    Bezeichnung1 ArtikelStamm.Bezeichnung1,
        
    Bezeichnung2 ArtikelStamm.Bezeichnung2,
        
    Bezeichnung Bezeichnung1 isnull(Bezeichnung2''),
        
    Variante Auspraegung.Auspraegung1 iif(Auspraegung.Auspraegung2 is not null' ; ' Auspraegung.Auspraegung2''),
        
    Laenge ArtikelStamm.Laenge,
        
    Hoehe ArtikelStamm.Breite,
        
    Breite ArtikelStamm.Hoehe,
        
    Gewicht cast(Variante.Gewicht as varchar(15)) + iif(ArtikelStamm.Gewichtseinheit is not null' ' ArtikelStamm.Gewichtseinheit' kg'),
        
    Bestand isnull(Bestand.Menge0),
        
    BestandPick isnull(BestandPick.Menge0),
        
    Offen null,
        
    SplitSize = case
            
    when abs(isnull(Variante.VOSS_IsS0)) = 1 then 'S'
            
    when abs(isnull(Variante.VOSS_IsL0)) = 1 then 'L'
            
    when abs(isnull(Variante.VOSS_IsXL0)) = 1 then 'XL'
            
    else 'M'
        
    end 

    Sollte aus meiner Sicht alles zu den entsprechenden DataRow.Field<T>( col_name ) passen?

    Für Hinweise immer offen, danke!
    Gruß Arne


    ps: was ist eigentlich mit dem highlightning geworden? Ist das mit der vb5 entfallen?
    Habe jetzt php-Tags verwendet, damit überhaupt was gehighlighted wird.

    PHP rocks!
    Eine Initiative der PHP Community

  • #2
    Wie lautet der exakte Fehler und "wer" ist der Melder?
    Ohne genau aufs Detail geachtet zu haben sticht mir im SQL ein Bit Cast ins Auge. Stichwort "übliche Verdächtige", soll das vielleicht eher ein Boolean sein oder noch was anderes, "gängigeres", ach und welcher DB Anbieter, alles aus einem Haus?

    Comment


    • #3
      Hi,

      Bisher habe ich immer zu bit gecasted, wenn ich in C# bspw. zu bool konvertieren wollte: Contert.ToBoolean(<bit_column>); hat bisher gut funktioniert.
      SQL-Server ist MSSQL-Server 2014.

      Der exakte Fehler ist wie im Titel geschrieben, mehr als den StackTrace hätte ich dann auch nicht mehr, aber der zeigt mir ja auch nur, dass der Fehler in der Zeile wie angegeben liegt.
      exception.jpg


      EDIT: Habe eben mal auf int umgestellt, kommt auf das selbe raus.





      Zuletzt editiert von Arne Drews; 19.02.2019, 13:21.
      PHP rocks!
      Eine Initiative der PHP Community

      Comment


      • #4
        Tja, das Bild sagt mir jetzt auch nichts, es geht einfach um die Frage, von wem die Meldung kommt, Db, ...

        Ansonsten: Im SQL Statement sind potentiell alle Casts problematisch, besonders die mit Varianz durch IIF und unterschiedlicher Handhabung. Was auch immer dabei nämlich rauskommt, schon die DB muss sich zu einem Zeitpunkt X beim Öffnen der Menge entscheiden, welchen Typ sie dafür nutzt. Das Verfahren ist bei mehreren Datensätzen oder verschiedenen Öffnungszeitpunkten in Deinem Statement nicht deterministisch oder?

        Comment


        • #5
          In deinem SQL bastelt du an das Gewicht die Einheit dran. Gewicht ist also ein varchar/string. In deinem Model tust du so als wäre es ein decimal. Sinnvoll ist sicher Wert und Einheit beim Gewicht zu trennen. Voraussichtlich willst du ja mit dem Gewicht rechnen bzw. zumindest das Gewicht in korrekter Lokalisierung anzeigen und nicht einfach so wie die DB es liefert.

          Comment


          • #6
            Originally posted by defo2
            Tja, das Bild sagt mir jetzt auch nichts, es geht einfach um die Frage, von wem die Meldung kommt, Db, ...
            Nicht von der DB, dachte das ist ersichtlich aus dem StackTrace, da sollte dann doch eigentlich auch eine SQL-Komponente auftreten, oder irre ich?

            Ralf Jansen: Guter Hinweis, danke. Habe das auf string umgestellt.
            Fehler bleibt leider. Andere Spalten habe ich mal mit isnull() versehen, um NULL-Werte auszuschließen.
            Zuletzt editiert von Arne Drews; 19.02.2019, 14:37.
            PHP rocks!
            Eine Initiative der PHP Community

            Comment


            • #7
              Dann würde ich empfehlen die im Model als decimal definierten Typen mal durchzugehen. Die anderen sehen unverfänglich aus. Sind die als decimal definierten Properties im Model auch wirklich numeric oder decimal in der Datenbank? Nur die lassen sich nach decimal casten. Float- und Integer-typen sind nicht einfach nach decimal castbar.

              Comment


              • #8
                Danke für eure Hinweise, tatsächlich lag es an der Spalte Offen, die ich mit NULL vorbelegt hatte, um später diese noch mit einem Wert zu befüllen.
                Dies konnte nicht zu string gecasted werden.

                Jetzt geht wenigstens die Zuweisung an die BindableCollection schon mal.
                Das damit gebundene DataGrid zeigt allerdings nur zwei leere Zeilen an, da schaue ich mal weiter...

                Danke!


                EDIT: jap, war nur ein Tippfehler im x:Name-Binding.
                Danke, läuft!
                Zuletzt editiert von Arne Drews; 19.02.2019, 14:37.
                PHP rocks!
                Eine Initiative der PHP Community

                Comment


                • #9
                  Originally posted by Arne Drews View Post
                  Danke für eure Hinweise, tatsächlich lag es an der Spalte Offen, die ich mit NULL vorbelegt hatte, um später diese noch mit einem Wert zu befüllen.
                  Dies konnte nicht zu string gecasted werden.
                  Schön das sich der Fehler gefunden hat. Das es an der Spalte lag klingt trotzdem merkwürdig.
                  Dein gezeigter Debug Screenshot zeigt das es in Unbox.ValueType knallt.
                  a.) String ist aber kein ValueType sondern ein ReferenceType.
                  b.) null lässt sich nach string casten
                  c.) wenn es beim casten zu string knallt bekommt man eigentlich einen andere Fehlermeldung. Ist auch eine InvalidCastException aber der Quelltyp wird auch genannt (etwa 'Das Objekt des Typs "XYZ" kann nicht in Typ "string" konvertiert werden).


                  Edit: Vergiss das. Der Screenshot bezog sich noch auf das Problem mit "Gewicht".

                  Comment

                  Working...
                  X