首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle number OUT参数始终为0

Oracle number OUT参数始终为0
EN

Stack Overflow用户
提问于 2017-12-13 09:22:43
回答 1查看 259关注 0票数 1

我有一个存储过程,它接受多个输入参数和两个数字输出参数。如果我从stored执行存储过程,它会打印两个输出参数的正确值。

如果我从C#调用存储过程,那么两个输出参数总是0

在这里,我展示了代码:

代码语言:javascript
复制
    public int ExecuteStore(string storeToExecute, CountDocumentsData storeResultDataObject, int old_systemid, int current_systemid, params SearchFilter[] searchFilters)
    {
        using (OracleConnection connection = new OracleConnection(this.ConnectionString))
        {
            try
            {
                OracleCommand objCmd = new OracleCommand();
                objCmd.Connection = connection;
                connection.Open();
                objCmd.CommandText = storeToExecute;
                objCmd.CommandType = CommandType.StoredProcedure;

                foreach (var filter in searchFilters)
                {
                    OracleDbType type = OracleDbType.Varchar2;

                    if (filter.GetType() == typeof(YearFilter) || filter.GetType() == typeof(MonthFilter)
                            || filter.GetType() == typeof(ApplicationFilter) || filter.GetType() == typeof(DocumentTypeFilter))
                    {
                        type = OracleDbType.Varchar2;
                        objCmd.Parameters.Add(filter.FilterName, type, 200).Value = filter.Value;
                    }
                    else
                    {
                        type = OracleDbType.Int32;
                        objCmd.Parameters.Add(filter.FilterName, type).Value = filter.Value;
                    }                       
                }

                objCmd.Parameters.Add("Lower_SystemID", OracleDbType.Int32, 200).Value = old_systemid;
                objCmd.Parameters.Add("Higher_SystemID", OracleDbType.Int32, 200).Value = current_systemid;

                objCmd.Parameters.Add("DocumentsNumber", OracleDbType.Int32).Direction = ParameterDirection.Output;
                objCmd.Parameters.Add("DocumentsSize", OracleDbType.Int32).Direction = ParameterDirection.Output;

                int res = objCmd.ExecuteNonQuery();
                Console.WriteLine(Convert.ToDecimal(objCmd.Parameters["DocumentsNumber"].Value.ToString()));
                Console.WriteLine(Convert.ToDecimal(objCmd.Parameters["DocumentsSize"].Value.ToString()));

                return res;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Query error.", ex);
                throw new Exception("Error", ex);
            }
        }
    }

存储过程:

代码语言:javascript
复制
Procedure CountDocuments
(
    Application IN VARCHAR2, 

    YearDoc IN VARCHAR2,  

    MonthDoc IN VARCHAR2,

    UoId IN Integer,

    SearchOnSubjected IN Integer,

    DocType IN VARCHAR2,

    Lower_SystemID IN Integer,

    Higher_SystemID IN Integer,

    DocumentsNumber OUT Integer,

    DocumentsSize OUT Integer
  ) Is

  queryToExecute VarChar2 (2000);
  Begin

  queryToExecute := ...

  Execute Immediate queryToExecute 
             Into DocumentsNumber, DocumentsSize 
             Using YearDoc, MonthDoc, Lower_SystemID, Higher_SystemID;

  End CountDocuments;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-13 09:32:22

您似乎使用动态参数,但您绑定它们的位置。这似乎很奇怪。我不知道运行时searchFilters中的内容是否与存储过程完全匹配,但如果不是,则需要使用

代码语言:javascript
复制
objCmd.BindByName = true;

否则你的参数最终会出现在错误的位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47789483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档