Laden...

Oracle C# und Number-DbType

Erstellt von Hans18 vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.336 Views
H
Hans18 Themenstarter:in
13 Beiträge seit 2013
vor 11 Jahren
Oracle C# und Number-DbType

verwendetes Datenbanksystem: Oracle 64Bit + ODP.NET

Hallo zusammen,

ich habe eine Oracle-Datenbank, die ich mit Daten speisen soll.
Die Daten erhalte ich per Stream und die Umwandlung findet bei mir statt.

Die aktuelle Tabelle hat 3 Spalten.
S1 => NUMBER
S2 => NUMBER(10,8)
S3 => NUMBER(10,8)

Die C# Seite arbeitet für alle 3 Spalten mit Decimal (ist doch richtig, oder?).
Die Anfrage sieht wie folgt aus:

       const string stat = "SELECT COUNT(*) FROM STATIONS WHERE S1= :S1";

                using (var oC= new OracleCommand(stat,con))
                {
                    oC.Parameters.Add("S1", e.S1);
                    return (Decimal)oC.ExecuteScalar();
                }

Jedoch erhalte ich immer die Fehlermeldung: ['System.Exception'(Die angegebene Umwandlung ist ungültig.)]]

Woran kann das noch liegen?

F
10.010 Beiträge seit 2004
vor 11 Jahren

Schau doch mal ganz genau was Parameters.Add macht wenn du keinen Datentyp angibst.
Ja, er benutzt einen String typ.

849 Beiträge seit 2006
vor 11 Jahren

Mit int etc usw funktioniert add Parameter ohne Typangabe aber auch super.

Ich schätze das bei Count(*) einfach etwas anderes als decimal. Denn bei einem Count sollte ja der Spaltentyp egal sein.

F
10.010 Beiträge seit 2004
vor 11 Jahren

Nein, AddWithValue funktioniert so.

2.891 Beiträge seit 2004
vor 11 Jahren

Ich schätze das bei Count(*) einfach etwas anderes als decimal.

Darauf würde ich auch erstmal tippen. Das ExecuteScalar eines "count(*)" gibt in der Regel ein int (oder ggf. long) - also eine Ganzzahl - zurück. Keine gebrochene Zahl wie decimal.
Kann sein, dass das bei Oracle anders ist, aber ich würde erstmal da gucken.

H
Hans18 Themenstarter:in
13 Beiträge seit 2013
vor 11 Jahren

Es funktioniert, wenn ich mit einem OracleParameter, dem jeweiligen Typ und Größe arbeite.
Und ja, Oracle arbeitet intern nur mit Decimal und deswegen liefert laut Doku ExecuteScalar auch ein Decimal. Dass Add() den Typ nicht erkennt finde ich schwach; konnte ich aber so in der Deutlichkeit auch nirgendwo finden.
AddWithValue gibt es beim ODP.NET nicht 🙄

F
10.010 Beiträge seit 2004
vor 11 Jahren

http://msdn.microsoft.com/de-de/library/9dd8zze1.aspx

Wenn diese Konvertierung nicht ausgeführt wird, geht der Compiler davon aus, dass die SqlParameterCollection.Add-Überladung (string, SqlDbType) aufgerufen werden soll.

So ist es bei MS Sql Dokumentiert.
Und eben deshalb wurde mit FW 2.0 ( also for 9 Jahren ) AddWithValue eingeführt.

Wenn die das bei Oracle nicht gemacht haben.....

849 Beiträge seit 2006
vor 11 Jahren

Hallo,

also nochmal ausprobiert:


cmd.Parameters.Add("ab", int.Parse(AuftragNummer));

funktioniert super bei Number(10,0)

H
Hans18 Themenstarter:in
13 Beiträge seit 2013
vor 11 Jahren

Laos mit Integer funktioniert das bei mir auch super, aber mit Decimal NUMBER(10,8) nicht. Oder ich hab einen anderen Fehler.
Aber dass Add() nur String erkennt glaube ich langsam doch auch nicht mehr. Denke das war eine Fehlinfo auf Oracle bezogen.

H
Hans18 Themenstarter:in
13 Beiträge seit 2013
vor 11 Jahren

Kann ich mir den generierten CommandText + Parameter anzeigen lassen, der an den Server gesendet wird?

F
115 Beiträge seit 2012
vor 11 Jahren

Hi,

kann es sein, das der Fehler bei Deinem Parameter liegt? Welches Format hat denn das Tabellenfeld S1?

Gruß
f_igy

H
Hans18 Themenstarter:in
13 Beiträge seit 2013
vor 11 Jahren

Die aktuelle Tabelle hat 3 Spalten.
S1 => NUMBER
S2 => NUMBER(10,8)
S3 => NUMBER(10,8)

😃

F
10.010 Beiträge seit 2004
vor 11 Jahren

@Hans18:

Kann ich mir den generierten CommandText + Parameter anzeigen lassen, der an den Server gesendet wird?

Nein, und das haben wir hier auch schon zig mal beschrieben.

Es wäre jetzt interessant, was Du jetzt tatsächlich machst.