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?
Schau doch mal ganz genau was Parameters.Add macht wenn du keinen Datentyp angibst.
Ja, er benutzt einen String typ.
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.
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.
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 🙄
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.....
Hallo,
also nochmal ausprobiert:
cmd.Parameters.Add("ab", int.Parse(AuftragNummer));
funktioniert super bei Number(10,0)
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.
Kann ich mir den generierten CommandText + Parameter anzeigen lassen, der an den Server gesendet wird?
Hi,
kann es sein, das der Fehler bei Deinem Parameter liegt? Welches Format hat denn das Tabellenfeld S1?
Gruß
f_igy
Die aktuelle Tabelle hat 3 Spalten.
S1 => NUMBER
S2 => NUMBER(10,8)
S3 => NUMBER(10,8)
😃
@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.