Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Was ist der richtige odbc-Befehl zum Aufrufen von gespeicherten Oracle-Prozeduren mit Parametern aus .Net?

Ich verwende .NET 3.5 und Oracle 10gR2. Als Antwort auf Ihren Kommentar habe ich einen Ausgabeparameter hinzugefügt.

Server , Uid , und Pwd wurden geändert, um die Unschuldigen zu schützen. Stellen Sie sie auf geeignete Werte ein.

Meine gespeicherte Prozedur:

create or replace
procedure test_proc(p1 in number, p2 in out varchar2) is
begin
  p2 := to_char(p1 + to_number(p2));
end;

Mein Testcode:

using System;
using System.Data;
using System.Data.Odbc;

class OdbcTest
{
    const string connectionString =
        @"Driver={Microsoft ODBC for Oracle};" +
        @"Server=MyTnsName;" +
        @"Uid=MySchema;" +
        @"Pwd=MyPassword;";

    public static string TryMe()
    {
        using (var odbcConn = new OdbcConnection(connectionString))
        using (var odbcCommand = odbcConn.CreateCommand())
        {
            odbcCommand.CommandText = "{ CALL test_proc(?, ?) }";
            odbcCommand.CommandType = CommandType.StoredProcedure;

            odbcCommand.Parameters.Add("p1", OdbcType.Decimal).Value = 42;
            var p2 = odbcCommand.Parameters.Add("p2", OdbcType.VarChar, 30);
            p2.Direction = ParameterDirection.InputOutput;
            p2.Value = "25";

            odbcConn.Open();
            odbcCommand.ExecuteNonQuery();

            return p2.Value as string; // returns 67
        }
    }
}

Bei Verwendung von OUT oder IN OUT Parameter, die Size Eigenschaft des OdbcParameter muss auf einen angemessenen Wert gesetzt werden.

Als Antwort auf Ihren Kommentar zur Ausnahmebehandlung würde ich den Aufrufer der Datenzugriffsmethode Ausnahmen behandeln lassen. Mit dem using Konstrukt, das Dispose -Methode wird automatisch für die Befehls- und Verbindungsobjekte aufgerufen, unabhängig davon, ob eine Ausnahme vorliegt oder nicht.