Ik denk dat je de sqlCom.ExecuteNonQuery(); . mist
ook, in plaats van het uitvoeren van de select func_test(7) van dual; laten we het omschakelen om de functie uit te voeren en de parameter door te geven
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();}
dit is gebaseerd op het voorbeeld-ODP dat kan worden gevonden @ %ora_home%\Client_1\ODP.NET\samples\RefCursor\Sample5.csproj
Als je de op maat gemaakte paramverzameling voor elke proc / functie-aanroep wilt vermijden (voor beter of slechtste!) kun je dat omzeilen door anonieme blokken in je code te gebruiken. Ik heb de bovenstaande code gewijzigd (wederom niet getest!) deze techniek.Hier is een mooie blog (van niemand minder dan Mark Williams) die deze techniek laat zien.http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html