Tôi đang chạy .NET 3.5 và Oracle 10gR2. Tôi đã thêm một tham số đầu ra để phản hồi lại nhận xét của bạn.
Server
, Uid
và Pwd
đã được thay đổi để bảo vệ người vô tội. Đặt chúng thành các giá trị thích hợp.
Thủ tục đã lưu trữ của tôi:
create or replace
procedure test_proc(p1 in number, p2 in out varchar2) is
begin
p2 := to_char(p1 + to_number(p2));
end;
Mã thử nghiệm của tôi:
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
}
}
}
Khi sử dụng OUT
hoặc IN OUT
tham số, Size
thuộc tính của OdbcParameter
phải được đặt thành một giá trị thích hợp.
Để trả lời nhận xét của bạn về việc xử lý ngoại lệ, tôi sẽ yêu cầu trình gọi của phương thức truy cập dữ liệu xử lý các ngoại lệ. Với using
cấu trúc, Dispose
phương thức sẽ được gọi tự động trên các đối tượng lệnh và kết nối cho dù có ngoại lệ hay không.