【问题标题】:How to call an Oracle Function using oracle .Net provider?如何使用 oracle .Net 提供程序调用 Oracle 函数?
【发布时间】:2013-01-31 08:56:39
【问题描述】:

当我在我的 .net mvc 项目中使用旧的 Oracle Dll 时,它可以工作:

   cmd.CommandText = "dba.user_login";
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.Add("KUL", OracleType.VarChar).Value = userName;
   cmd.Parameters.Add("SIFRE", OracleType.VarChar).Value = pass;
   cmd.Parameters.Add("FLAG", OracleType.Float).Value = 1;
   cmd.Parameters.Add("HATA", OracleType.VarChar).Value = "error";
   cmd.Parameters.Add("result", OracleType.Float).Direction = ParameterDirection.ReturnValue;

但我想使用新的 oracle .net 提供程序,因为不推荐使用旧的 oracle dll。我试过这个:

   cmd.CommandText = "dba.user_login";
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.Add("KUL", OracleDbType.Varchar2).Value = userName;
   cmd.Parameters.Add("SIFRE", OracleDbType.Varchar2).Value = pass;
   cmd.Parameters.Add("FLAG", OracleDbType.Single).Value = 1;
   cmd.Parameters.Add("HATA", OracleDbType.Varchar2).Value = "error";
   cmd.Parameters.Add("result", OracleDbType.Single).Direction = ParameterDirection.ReturnValue;

但它不起作用。异常:ORA-06502:PL/SQL:数字或值错误:字符到数字的转换错误\nORA-06512:在第 1 行 任何人都可以帮我解决这个问题。谢谢。

【问题讨论】:

  • 继续并发布您正在调用的函数的定义。请记住,ODP.net(我怀疑这是您所指的“新预言机提供者”)默认按位置绑定(与默认 System.Data.Ora 不同)——您可以使用 BindByName = true 来强制命令对象表现相同。
  • 我使用的是 11.2.0 ODP.net (Oracle.DataAccess.dll)。我插入了 BindByName = true => 并且它有效。非常感谢。

标签: .net oracle function call provider


【解决方案1】:

太棒了,一个设计决策在开始使用它时总是会导致问题(并且偶尔会在路上!)

既然这回答了你的问题,我会“提升”我对答案的评论(如果这不合适,请告诉我,我会删除这个答案)

请记住,ODP.net 默认按位置绑定(与默认 System.Data.Ora 不同)——您可以使用

BindByName = true 

强制命令对象表现相同

【讨论】:

  • 作为记录,最后一件事:当我使用 System.Data.Ora 调用存储过程时,cmd.ExecuteNonQuery() 返回 1 但现在我使用的是 ODP.net 并且 cmd.ExecuteNonQuery() 返回-1。为什么返回值将 1 更改为 -1 我不知道,但根据 MSDN ExecuteNonQuery 将始终返回 -1 用于存储过程调用。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2023-03-06
  • 2011-01-31
  • 2018-07-09
  • 1970-01-01
相关资源
最近更新 更多