Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Oracle C# und Number-DbType
Hans18
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

Oracle C# und Number-DbType

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10084

beantworten | zitieren | melden

Schau doch mal ganz genau was Parameters.Add macht wenn du keinen Datentyp angibst.
Ja, er benutzt einen String typ.
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10084

beantworten | zitieren | melden

Nein, AddWithValue funktioniert so.
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Zitat von unconnected
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.
private Nachricht | Beiträge des Benutzers
Hans18
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Hans18 am .
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10084

beantworten | zitieren | melden

http://msdn.microsoft.com/de-de/library/9dd8zze1.aspx
Zitat
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.....
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

Hallo,

also nochmal ausprobiert:


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

funktioniert super bei Number(10,0)
private Nachricht | Beiträge des Benutzers
Hans18
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Hans18
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

Kann ich mir den generierten CommandText + Parameter anzeigen lassen, der an den Server gesendet wird?
private Nachricht | Beiträge des Benutzers
f_igy
myCSharp.de - Member



Dabei seit:
Beiträge: 117

beantworten | zitieren | melden

Hi,

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

Gruß
f_igy
private Nachricht | Beiträge des Benutzers
Hans18
myCSharp.de - Member



Dabei seit:
Beiträge: 13

Themenstarter:

beantworten | zitieren | melden

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

:)
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10084

beantworten | zitieren | melden

@Hans18:
Zitat
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.
private Nachricht | Beiträge des Benutzers