如何使用Mono调用oracle函数?

时间:2013-07-02 07:58:16

标签: c# linux oracle mono

使用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)。我遇到的第一个问题是

中提到的错误
  1. Bug 10164 - System.Data.OracleClient.OracleParameter.SetOracleType throws System.NullReferenceException
  2. System.Data.OracleClient.OracleParameter.SetOracleType() bug?
  3. 据我了解,唯一的出路是在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?

0 个答案:

没有答案