如题,oracle存储过程的参数是数组,在c#代码里怎样传递参数,调用oracle存储过程?能给具体的例子最好了。
这个问题困扰了我两天,还请大侠们帮忙啊!分不多了,给20分,请见谅。

解决方案 »

  1.   

    用 OracleParameter, 其它的和SQL一样. 都是把SQL改成Oracle就行了.
      

  2.   

    存储过程的参数是个数组咧,sql存储过程也可以用数组作为参数的吗?我没写过sql的,所以还是不清楚啊。
    还请marcoak 再详解。谢谢
      

  3.   

     public void AddOutCursorParameter(string name,OracleType type)
            {
                OracleParameter parameter = new OracleParameter(name, type);
                parameter.Direction = ParameterDirection.Output;
                command.Parameters.Add(parameter);
            }        public void AddInOrOutPatameter(string name,DbType type,object value)
            {
                DbProviderFactory ProviderFactory = DbProviderFactories.GetFactory(accessDb.DbConnectCreater().GetType().Namespace);
                DbParameter parameter = ProviderFactory.CreateParameter();
                parameter.ParameterName = name;
                parameter.Value = value;
                parameter.Direction = ParameterDirection.InputOutput;
                parameter.DbType = type;
                parameter.Size = 1000;
                command.Parameters.Add(parameter);
            }
    传递参数时要一个个对应的传进去的 
    每次都会创建一个parameter 对象
    你讲这个对象加到你的Command里面去 : command.Parameters.Add(parameter);
    你的SP 有多少个参数需要传递
    就写几行
    上面是我自己包装了的 
    不是蛮好 你可以参考一下
      

  4.   

    用这种当然要自己加.
     string spName;//存储过程名
     params object[] parameterValues; //参数值序列 OracleParameter[] commandParameters = GetSpParameters(spName, true);
     AssignParameterValues(commandParameters, parameterValues); /// <summary>
     /// 获取存储过程参数
     /// </summary>
     /// <param name="spName">存储过程名</param>
     /// <param name="hasReturn">是否包含返回值</param>
     /// <returns>返回参数序列</returns>
     public OracleParameter[] GetSpParameters (string spName, bool hasReturn) {
              //缓存HashTable的主键
              string cacheKey = spName + (hasReturn ? " :hasReturn" : null);
              //从Hachtable中获取参数
              OracleParameter[] cachedParameters = (OracleParameter[])myCache[cacheKey];
              if (cachedParameters == null) {
                    //如果Hachtable中没有,调用获取存储过程参数数组方法
                    cachedParameters = (OracleParameter[])(myCache[cacheKey] = 
                                        GetSpParameterSet(spName, hasReturn));
                }
                return CloneParameters(cachedParameters);
            }/// <summary>
    /// 拷贝缓存中的参数序列
    /// </summary>
    /// <param name="originalParameters">源参数序列</param>
    /// <returns>拷贝后的参数序列</returns>
    private OracleParameter[] CloneParameters (OracleParameter[] originalParameters) {
                //拷贝缓存中的参数序列
                OracleParameter[] clonedParameters = new OracleParameter[originalParameters.Length];            for (int i = 0, j = originalParameters.Length; i < j; i++) {
                    clonedParameters[i] = 
                                     (OracleParameter)((ICloneable)originalParameters[i]).Clone();
                }
                return clonedParameters;
            }/// <summary>
    /// 将参数值序列赋值给对应的参数序列
    /// </summary>
    /// <param name="commandParameters">待赋值的参数序列</param>
    /// <param name="parameterValues">参数值序列</param>
    private bool AssignParameterValues (OracleParameter[] commandParameters, 
                                        object[] parameterValues) {
                if ((commandParameters == null) || (parameterValues == null)) {
                    //若参数为null,返回
                    return true;
                }            // 参数数组长度与参数值数组长度需匹配
                if (commandParameters.Length != parameterValues.Length) {
                    Trace.Write("AssignParameterValues", "Error", "参数个数和参数值个数不匹配。");
                    return false;
                }            //循环为参数赋值
                //注意,参数与参数值在各自的序列中位置应当对应
                for (int i = 0, j = commandParameters.Length; i < j; i++) {
                    commandParameters[i].Value = parameterValues[i];
                }            return true;
            }再废话一句. 如果要想ORACLE存储过程返回数据集,就要到游标和包.
      

  5.   

    补一个方法.        /// <summary>
            /// 获取存储过程参数数组
            /// </summary>
            /// <param name="spName">存储过程名</param>
            /// <param name="hasReturn">是否包含返回类型的参数</param>
            /// <returns>参数数组</returns>
            private OracleParameter[] GetSpParameterSet (string spName, bool hasReturn) {
                using (OracleCommand cmd = new OracleCommand()) {
                    //创建并打开数据连接
                    if (!ConnectDataBase()) {
                        //连接数据库失败
                        Trace.Write("Connection", "Error", "连接数据库失败。");
                    }                //为命令指定连接
                    cmd.Connection = conDB;                //指定CommandText为存储过程名
                    cmd.CommandText = spName;
                    cmd.CommandType = CommandType.StoredProcedure;
                    //从存储过程中检索参数,填充到Parameters集
                    try {
                        OracleCommandBuilder.DeriveParameters(cmd);
                    }
                    catch (Exception e) {
                        //执行失败
                        //从异常中获取失败信息
                        string msg = e.Message;
                        Console.WriteLine(e.Message);
                        //调用写日志方法
                        Trace.Write("DeriveParameters", "Error", spName + "|" + msg);
                    }                try {
                        //如果有返回值
                        if (!hasReturn) {
                            cmd.Parameters.RemoveAt(0);
                        }
                    }
                    catch (Exception e) {
                        //执行失败
                        //从异常中获取失败信息
                        string msg = e.Message;
                        Console.WriteLine(e.Message);
                    }                //将Parameters集中的参数复制到参数数组
                    OracleParameter[] para = new OracleParameter[cmd.Parameters.Count];
                    cmd.Parameters.CopyTo(para, 0);                return para;
                }
            }
      

  6.   

    to :marcoak
    比如我的存储过程如下:我在c#里对输入参数进行初始化 string[] i_string = new string[3] { "First Element", "Second Element ", "Third Element " };
    然后怎么处理啊?还请指教,谢谢!create or replace package pack_test
    as
     type string_array is table of varchar2(20) index by binary_integer;
     procedure sp_test(i_string   in   string_array,
                       o_string   out  string_array);
    end ;
    ---------
    create or replace package body pack_test as
      procedure sp_test(i_string in string_array, o_string out string_array) is
        i integer;
      begin
        if i_string.count != 0 then
          for i in 1 .. i_string.count loop
            o_string(i) := i_string(i)||'-'||i;
          end loop;
        end if;
      end sp_test;
    end pack_test;
      

  7.   


                //循环为参数赋值
                //注意,参数与参数值在各自的序列中位置应当对应
                for (int i = 0, j = commandParameters.Length; i < j; i++) {
                    commandParameters[i].Value = parameterValues[i];
                }这里是怎么赋值的呀?我的parameterValues[i]也是个数组
      

  8.   

    你把你的数组加进object就行了.string[] i_string = new string[3] { "First Element", "Second Element ", "Third Element " };
    //无返回值
    params object[] parameterValues = new parameterValues[]{ i_string, null};
    输出参数要留空.如果你的存储过程有返回值, 也要留空. 
    string[] i_string = new string[3] { "First Element", "Second Element ", "Third Element " };
    //有返回值
    params object[] parameterValues = new parameterValues[]{ null, i_string, null};
      

  9.   

    oracle存储过程的参数是数组各位看清楚题目了吗? 就胡乱回答