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.