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.