1

使用 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 (ver. 2.10.9)。我当时遇到的第一个问题是

  1. 错误 10164 - System.Data.OracleClient.OracleParameter.SetOracleType 抛出 System.NullReferenceException
  2. System.Data.OracleClient.OracleParameter.SetOracleType() 错误?

据我了解,唯一的出路是设置OracleParameter.Valuebefore 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?

4

0 回答 0