Jeg kører .NET 3.5 og Oracle 10gR2. Jeg har tilføjet en outputparameter som svar på din kommentar.
Server , Uid og Pwd er blevet ændret for at beskytte de uskyldige. Indstil dem til passende værdier.
Min lagrede procedure:
create or replace
procedure test_proc(p1 in number, p2 in out varchar2) is
begin
p2 := to_char(p1 + to_number(p2));
end;
Min testkode:
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
}
}
}
Når du bruger OUT eller IN OUT parametre, Size egenskaben for OdbcParameter skal indstilles til en passende værdi.
Som svar på din kommentar vedrørende håndtering af undtagelser, vil jeg have den, der ringer til dataadgangsmetoden, til at håndtere undtagelser. Med using konstruktion, Dispose metoden kaldes automatisk på kommando- og forbindelsesobjekterne, uanset om der er en undtagelse eller ej.