Announcement

Collapse
No announcement yet.

Erhalte immer InvalidCast-/ InvalidOperationException - ODP.NET

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

  • Erhalte immer InvalidCast-/ InvalidOperationException - ODP.NET

    Hallo,

    ich bin dabei mich in .NET einzuarbeiten und möchte mittels ODP.NET (Oracle Data Provider) eine einfache SQL-Query ausführen.

    Leider erhalte ich immer eine InvalidCastException oder eine InvalidOperationException und kann den Fehler auch nach stundenlangem Suchen/googeln nicht finden. Meiner Ansicht nach müsste der Code einwandfrei funktionieren. Da ich Anfänger bin und erst seit einigen Tagen mit .NET arbeite kann es gut sein, dass das Problem auch an irgendwelchen IDE-Einstellelungen (Assembly-/Verweiseinstellungen?) oder ähnlichem liegt.


    [highlight=c#]
    public ActionResult Index()
    {

    OracleConnection conn = null;
    try
    {
    conn = new OracleConnection("Data Source=asdf;User ID=as;Password=df;");
    conn.Open();

    string cmdText = "select count(*) from delivery";
    OracleCommand cmd = new OracleCommand(cmdText, conn);
    cmd.CommandType = CommandType.Text;

    using (OracleDataReader dr = cmd.ExecuteReader())
    {
    rd.Read(); // Edit: gerade noch eingefügt
    string typ = dr.GetValue(0).GetType().Name; // System.InvalidOperationException
    int count = dr.GetInt16(0); // System.InvalidCastException
    }

    }
    catch (InvalidCastException ice)
    {
    Trace.Write(ice.StackTrace);
    }
    catch (Exception e)
    {
    Trace.Write(e.StackTrace);
    }
    finally
    {
    if (conn != null)
    conn.Close();
    }
    return View();
    }
    [/highlight]

    Zuerst hatte ich nur den "int count = dr.GetInt16(0);" Aufruf drin, aber als ich das nicht zum Laufen bekommen hab, habe ich den getType Aufruf eingebaut, welcher auch nicht funktioniert - hier sieht es so aus, als ob die Verbindung nicht richtig hergestellt ist, aber das Open() funktioniert problemlos.

    Die Datenbank ist unter diesem Alias aus einem Delphi Programm oder Oracle SQL-Worksheet problemlos zu erreichen und die Query gibt auch auf jeden Fall einen Wert zurück.

    Oracle Version: 9.2.0.8.0
    ODP.NET-Version: 9.2.0.7.0

    Vielen Dank für die Hilfe.
    Gruß Rev
    Zuletzt editiert von Revenant; 29.11.2010, 18:47.

  • #2
    Muss man da nicht noch erst dr.Read() aufrufen bevor man auf den Datensatz zugreift? Das würde ich auch sämtliche Exceptions bei Datenzugriff erklären.

    Comment


    • #3
      Stimmt ja, habe den Aufruf gerade noch eingebaut (den hatte ich beim Testen kurzzeitig rausgenommen). Mit reader.read() komm ich bis zu

      [highlight=c#]int count = dr.GetInt16(0);[/highlight]

      Die InvalidCastException bekomme ich aber trotzdem.

      Comment


      • #4
        Interessant ist, dass ich die InvalidCastException auch erhalte wenn ich nur

        [hightlight=C#]dr.GetInt16(0);[/hightlight]

        aufrufe, also das Ergebnis gar nicht weiter verarbeite...

        Comment


        • #5
          Ich würde mal behaupten, dass da ein Int32 zurückkommt, kein Int16. Probiere aber zB mal folgendes:
          ...
          int count = (int)dr[0];
          ...

          bye,
          Helmut

          PS:
          würdest du als Abfrage zB.
          "select count(*) as Anzahl from delivery";
          schreiben (kenne den ansonst vergebenen Default-Spaltenneme nicht), könntest du auch per Name zugreifen:
          ...
          int count = (int)dr["Anzahl"];
          ...
          Ist vor allem super, wenn man mehrere Felder hat.

          Comment


          • #6
            Da dein SQL einen einzelnen Wert zurück gibt wäre wohl der Aufruf der ExecuteScalar Methode an deinem OracleCommand passender.

            Nebenbei die Exceptions die du bekommst (InvalidOperationException und InvalidCastException) haben nicht nur einen Typ sondern auch eine Message. Insbesondere die Message der InvalidOperationException sollte eigentlich recht deutlichen Klartext enthalten der dir das Problem aufzeigt.

            Comment


            • #7
              Problem gelöst

              Hallo,

              erst einmal vielen Dank allen für die Hilfe.


              Das mit dem Exception Text kannte ich übrigens, hat mir aber nicht viel weitergeholfen.

              Letztendlich lag das Problem daran, dass ich auf eine Datenbank-Spalte oder eben ein SQL-Ergebnis vom nativen Oracle Datentyp NUMBER mit dem falschen Accessor zugegriffen habe.

              Der richtige Aufruf lautet:

              [highlight=C#]
              decimal count = dr.GetDecimal(0);
              [/highlight]

              oder eben:

              [highlight=C#]
              decimal count = (decimal)dr[0]; // funktioniert
              int count = Convert.ToInt32(dr.GetDecimal(0)); // funktioniert auch
              [/highlight]


              Grüße
              Rev

              Comment

              Working...
              X