使用Mono我需要在oracle数据库中调用一个函数。该函数有两个输入参数和一个输出参数。
起初我用.Net运行时测试过。以下非常简单的代码完成了这项工作:
var dbcon = new OracleConnection("my connection string");
dbcon.Open();
OracleCommand cmd = dbcon.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "my_pkg.my_func";
OracleParameter p = new OracleParameter("ReturnValue", OracleType.Number);
p.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(p);
p = new OracleParameter("p_in1", OracleType.VarChar);
p.Size = 5;
p.Direction = ParameterDirection.Input;
p.Value = p1;
cmd.Parameters.Add(p);
p = new OracleParameter("p_in2", OracleType.VarChar);
p.Size = 20;
p.Direction = ParameterDirection.Input;
p.Value = p2;
cmd.Parameters.Add(p);
p = new OracleParameter("p_out", OracleType.VarChar);
p.Direction = ParameterDirection.Output;
p.Size = 512;
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();
return cmd.Parameters["p_out"].Value.ToString();
但是,由于目标操作系统是Linux,我将运行时( Utilities => Options => .Net Runtimes )更改为Mono(版本2.10.9)。我遇到的第一个问题是
中提到的错误据我了解,唯一的出路是在OracleParameter.Value
之前设置OracleParameter.OracleType
,即使是输出参数......所以代码已更改为
p = new OracleParameter();
p.ParameterName = "p_in1";
p.Size = 5;
p.Direction = ParameterDirection.Input;
p.Value = code.ToString ();
p.OracleType = OracleType.VarChar;
NullReferenceException
消失了,但另一个消失了:
PLS-00306:调用的参数的数量或类型错误 'my_func'
ORA-06550:第1行第7列:PL / SQL:忽略语句
正如Mono - Oracle: Current Status for System.Data.OracleClient 中所述:
Input/Output and Return parameters have not been tested.
是否支持ParameterDirection.ReturnValue
?
或者为什么它适用于.Net运行时而不适用于Mono?