Sto eseguendo .NET 3.5 e Oracle 10gR2. Ho aggiunto un parametro di output in risposta al tuo commento.
Server
, Uid
e Pwd
sono stati modificati per proteggere gli innocenti. Impostali su valori appropriati.
La mia procedura memorizzata:
create or replace
procedure test_proc(p1 in number, p2 in out varchar2) is
begin
p2 := to_char(p1 + to_number(p2));
end;
Il mio codice di prova:
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
}
}
}
Quando si utilizza OUT
o IN OUT
parametri, il Size
proprietà del OdbcParameter
deve essere impostato su un valore adeguato.
In risposta al tuo commento sulla gestione delle eccezioni, vorrei che il chiamante del metodo di accesso ai dati gestisse le eccezioni. Con il using
costrutto, il Dispose
il metodo verrà chiamato automaticamente sul comando e sugli oggetti di connessione indipendentemente dal fatto che sia presente un'eccezione o meno.