Frage

Hallo, ich habe einen DataRow aus einem Datatable aus einem DataSet gezogen. Ich bin der Zugriff auf eine Spalte, die in SQL als Float-Datentyp definiert ist. Ich versuche, diesen Wert auf eine lokale Variable (c # float-Datentyp) zuweisen, aber ich erhalte eine InvalidCastExecption

DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65);
_AccelLimit = (float)exercise["DefaultAccelLimit"];  

Nun, das Spiel mit diesem Ich tat es funktioniert, aber es hat keinen Sinn, und es fühlte sich nicht richtig.

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];

Kann mir jemand erklären, was ich hier fehlt?

War es hilfreich?

Lösung

Ein SQL float ist ein doppelt nach der Dokumentation für SqlDbType .

Andere Tipps

Und normalerweise würden Sie nie Schwimmer in SQL Server verwenden (oder real), wenn Sie mathematische Berechnungen auf den Daten durchführen wollen, wie es ein ungenauer Datentyp ist, und es wird Rechenfehler einführen. Verwenden Sie einen Dezimal-Datentyp statt, wenn Sie Genauigkeit benötigen.

Der Schwimmer in Microsoft SQL Server entspricht ein Doppel in C #. Der Grund dafür ist, dass eine Fließkommazahl nur eine Dezimalzahl annähern kann, die Genauigkeit eine Gleitkommazahl bestimmt, wie genau diese Zahl annähert eine Dezimalzahl. Der Doppeltyp stellt ein doppeltgenaue 64-Bit-Gleitkommazahl mit Werten von negativ zu positiv 1.79769313486232e308 1.79769313486232e308 Bereich sowie positive oder negative Null, Positiver, Negativ und Not-a-Number (NaN).

Ich denke, die wichtigste Frage hier beantwortet wurde, aber ich fühle mich verpflichtet, etwas für den Abschnitt der Frage hinzuzufügen, die besagen, dass das funktioniert.

  

_AccelLimit = (float) (double) Übung [ "DefaultAccelLimit"];

Der Grund dieser „funktioniert“ und der Grund, warum es „fühlt sich nicht richtig“ ist, dass Sie die doppelte mit einem Schwimmer durch den zweiten Guss sind Herabstufung (der auf der linken Seite), so dass Sie Präzision verlieren und sagen, effektiv die Compiler, dass es in Ordnung ist trunkieren der Wert zurückgegeben.

In Worten diese Zeile gibt ... Holen Sie ein Objekt (das geschieht mit einem Doppel in diesem Fall zu halten) Werft das Objekt um ein Doppel (verlieren alle das Objekt Verpackung) Cast beides in mit einem Schwimmer (und verlieren alle feinen Präzision eines double)

z. Wenn der Wert sagen ,0124022806089461 und Sie die oben dann wird der Wert von AccelLimit wird 0.01240228

wie das ist, das Ausmaß dessen, was ein Schwimmer in c # aus dem doppelten Wert erhalten. Es ist eine gefährliche Sache zu tun, und ich bin ziemlich sicher, dass es ein Abschneiden zu, anstatt eine Rundung aber jemand möchte kann dies bestätigen, da ich nicht sicher bin.

Der Grund ist es "nicht richtig anfühlt", weil C # die gleiche Syntax für Unboxing verwendet und für Gießen , das sind zwei sehr verschiedene Dinge. exercise["DefaultAccelLimit"] enthält einen doppelten Wert, als ein Objekt umrandet. (double) ist erforderlich, um unbox das Objekt zurück in ein Doppel. Die (float) vor, dass dann werfen die Doppel auf einen Float-Wert. C # nicht zulässt, dass Boxen und im gleichen Arbeitsgang Gießen, so müssen Sie unbox, dann werfen.

Das gleiche gilt auch, wenn die Besetzung nicht zerstörenden ist. Wenn ein Schwimmer als Objekt verpackt wurde, die Sie in einem Doppel werfen wollten, würden Sie es wie so tun. (double)(float)object_var

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top