Jag kör .NET 3.5 och Oracle 10gR2. Jag har lagt till en utdataparameter som svar på din kommentar.
Server
, Uid
och Pwd
har ändrats för att skydda de oskyldiga. Ställ in dem på lämpliga värden.
Min lagrade procedur:
create or replace
procedure test_proc(p1 in number, p2 in out varchar2) is
begin
p2 := to_char(p1 + to_number(p2));
end;
Min testkod:
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 använder OUT
eller IN OUT
parametrar, Size
egenskapen för OdbcParameter
måste ställas in på ett adekvat värde.
Som svar på din kommentar angående undantagshantering skulle jag låta den som anropade dataåtkomstmetoden hantera undantag. Med using
konstruktionen, Dispose
metod kommer att anropas automatiskt på kommando- och anslutningsobjekten oavsett om det finns ett undantag eller inte.