Saya menjalankan .NET 3.5 dan Oracle 10gR2. Saya telah menambahkan parameter keluaran sebagai tanggapan atas komentar Anda.
Server
, Uid
, dan Pwd
telah diubah untuk melindungi yang tidak bersalah. Setel ke nilai yang sesuai.
Prosedur tersimpan saya:
create or replace
procedure test_proc(p1 in number, p2 in out varchar2) is
begin
p2 := to_char(p1 + to_number(p2));
end;
Kode pengujian saya:
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
}
}
}
Saat menggunakan OUT
atau IN OUT
parameter, Size
properti dari OdbcParameter
harus disetel ke nilai yang memadai.
Menanggapi komentar Anda tentang penanganan pengecualian, saya akan meminta pemanggil metode akses data menangani pengecualian. Dengan using
konstruksi, Dispose
metode akan dipanggil secara otomatis pada perintah dan objek koneksi apakah ada pengecualian atau tidak.