Tôi nghĩ rằng bạn đang thiếu sqlCom.ExecuteNonQuery ();
ngoài ra, thay vì chạy select func_test (7) từ kép; hãy chuyển nó để chạy chức năng và chuyển vào tham số
OracleConnection oracleCon = new OracleConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
// Set the command
string anonymous_block = "begin " +
" :refcursor1 := func_test(7) ;" +
"end;";
//fill in your function and variables via the above example
OracleCommand sqlCom= con.CreateCommand();
sqlCom.CommandText = anonymous_block;
// Bind
sqlCom.Parameters.Add("refcursor1", OracleDbType.RefCursor);
sqlCom.Parameters[0].Direction = ParameterDirection.ReturnValue;
try
{
// Execute command; Have the parameters populated
sqlCom.ExecuteNonQuery();
// Create the OracleDataAdapter
OracleDataAdapter da = new OracleDataAdapter(sqlCom);
// Populate a DataSet with refcursor1.
DataSet ds = new DataSet();
da.Fill(ds, "refcursor1", (OracleRefCursor)(sqlCom.Parameters["refcursor1"].Value));
// Print out the field count the REF Cursor
Console.WriteLine("Field count: " + ds.Tables["refcursor1"].Columns.Count);
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e.Message);
}
finally
{
// Dispose OracleCommand object
cmd.Dispose();
// Close and Dispose OracleConnection object
con.Close();
con.Dispose();}
điều này dựa trên ODP mẫu có thể tìm thấy @% ora_home% \ Client_1 \ ODP.NET \ samples \ RefCursor \ Sample5.csproj
Nếu bạn muốn tránh (tốt hơn hoặc tệ nhất!) Bộ sưu tập tham số được xây dựng tùy chỉnh cho mỗi lệnh gọi proc / hàm mà bạn có thể giải quyết vấn đề đó bằng cách sử dụng các khối ẩn danh trong mã của bạn, tôi đã khuyên (một lần nữa chưa được kiểm tra!) Đoạn mã trên để phản ánh Đây là một blog tuyệt vời (của không ai khác ngoài Mark Williams) hiển thị kỹ thuật này. http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html