日期:2014-05-17  浏览次数:21075 次

c#调用oracle存储过程参数问题
我有一段调用oracle存储过程的c#代码,如下所示:
System.Data.OracleClient.OracleCommand CMD = new OracleCommand(fun_name, con);
  CMD.Connection = con;
  CMD.CommandType = System.Data.CommandType.StoredProcedure;
 CMD.Parameters.Add(new OracleParameter());
  CMD.Parameters[0].OracleType = OracleType.Number;
  CMD.Parameters[0].Direction = ParameterDirection.Input;
  //CMD.Parameters[0].ParameterName = "pi";
  CMD.Parameters[0].Value = "2";


  CMD.Parameters.Add(new OracleParameter());
  CMD.Parameters[1].OracleType = OracleType.VarChar;
  CMD.Parameters[1].Size = 20;
  CMD.Parameters[1].Direction = ParameterDirection.Input;
  //CMD.Parameters[1].ParameterName = "p2";
  CMD.Parameters[1].Value = "xx";
 CMD.ExecuteNonQuery();
其中有两行代码被注释了,运行时就会报错:参数个数或类型错误。
打开注释就没问题,可是我我又不想传递参数名称,如何处理呢?如果必须传递参数名称,在oracle中如何获取的存储过程的参数名称呢?多谢!


------解决方案--------------------
SqlServer中

Create PROCEDURE [dbo].[AddFile]

@PortalId int,
@FileName nvarchar(100),
@Extension nvarchar(100),
@Size int,
@Width int,
@Height int,
@ContentType nvarchar(200),
@Folder nvarchar(200),
@FolderID int
AS
....

@PortalId这些就是参数名,Oracle中应该差不多吧。
------解决方案--------------------
路过!!!!!!!!!!
------解决方案--------------------
运行时就会报错:参数个数或类型错误。
你的写法是正确的,注意参数个数或类型。

或者你可以象下面这样写,一般来说不必把Parameter的属性都设上。
CMD.Parameters.Add(new OracleParameter("@pi", "2"));

------解决方案--------------------
探讨

谢谢4楼的指点,我主要的问题在于传递参数时不想传递参数名称。

------解决方案--------------------
oracle:
select t.object_name,t.argument_name,t.data_type,t.in_out 
from all_arguments t 
where t.owner='用户名' and 
t.object_name='存储过程名' and 
t.package_name='包名'


sql:
select * from syscolumns where ID in 
(SELECT id FROM sysobjects as a 
WHERE OBJECTPROPERTY(id, N'IsProcedure') = 1 
and id = object_id(N'[dbo].[存储过程名]'))


或者在C#中使用SqlCommandBuilder.DeriveParameters(SqlConnection);从数据库中映射

我的异常网推荐解决方案:oracle存储过程,http://www.aiyiweb.com/oracle-develop/177537.html