Ik gebruik .NET 3.5 en Oracle 10gR2. Ik heb een uitvoerparameter toegevoegd als reactie op je opmerking.
Server
, Uid
, en Pwd
zijn veranderd om de onschuldigen te beschermen. Stel ze in op de juiste waarden.
Mijn opgeslagen procedure:
create or replace
procedure test_proc(p1 in number, p2 in out varchar2) is
begin
p2 := to_char(p1 + to_number(p2));
end;
Mijn 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
}
}
}
Bij gebruik van OUT
of IN OUT
parameters, de Size
eigenschap van de OdbcParameter
moet op een adequate waarde worden ingesteld.
In antwoord op uw opmerking over het afhandelen van uitzonderingen, zou ik willen dat de beller van de methode voor gegevenstoegang de uitzonderingen afhandelt. Met de using
constructie, de Dispose
methode wordt automatisch aangeroepen op de opdracht- en verbindingsobjecten, of er nu een uitzondering is of niet.