【问题标题】:Oracle 12c, Stored Procedure OUT Parameter string message BreaksOracle 12c,存储过程 OUT 参数字符串消息中断
【发布时间】:2018-09-21 09:54:51
【问题描述】:

我创建了一个包含两个输入和一个输出的虚拟包。保存时我应该得到“SUCCESS”,但它返回“SU”。
甲骨文SP

PROCEDURE savedetail (  p_msg  OUT VARCHAR2,                           
                         inputs...
                         )    begin  p_msg := 'SUCCESS';   END;

C#代码

public string SaveLoad(DataGL.ScheduledMaintenance objmaster)
    {
        try
        {
            this.AppConnection.OpenConnection();
            this.AppConnection.BeginTransaction();
            cmd = this.AppConnection.Connection.CreateCommand();
            cmd.Transaction = this.AppConnection.Transaction;
            cmd.CommandText = "PKG_VHSCHDULEMAINTENANCE.USP_SAVE";
            cmd.CommandType = CommandType.StoredProcedure;

            Parameter = cmd.CreateParameter();
            Parameter.ParameterName = "p_HostBranchId";
            Parameter.OracleType = OracleType.Number;
            Parameter.Value = objmaster.intBranchId;
            cmd.Parameters.Add(Parameter); 

            Parameter = cmd.CreateParameter();
            Parameter.ParameterName = "p_UserId";
            Parameter.OracleType = OracleType.Number;
            Parameter.Value = objmaster.intUserId;
            cmd.Parameters.Add(Parameter); 


            Parameter = cmd.CreateParameter();
            Parameter.ParameterName = "p_OutMsg";
            Parameter.OracleType = OracleType.VarChar;
            Parameter.Size = 100;
            Parameter.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(Parameter);


            cmd.ExecuteNonQuery();

            string strResult = "";
            strResult = cmd.Parameters["p_OutMsg"].Value.ToString();

            return strResult;
        }
        catch (Exception exc)
        {

        }
        finally
        {
            this.AppConnection.CommitTransaction();
        }

应用程序托管在服务器中时会出现问题。但是当我在源代码中运行时它工作正常。 环境细节:oracle 12c,framework 3.5,iis 10。

【问题讨论】:

  • 你试过调试它,我猜?我在这里看到的一个危险信号是一个空的 catch 块;结果不明的秘诀。
  • 为什么要在 finally 块中提交事务?你不知道那里是否发生了错误
  • @rory.ap 感谢您的回复。是的,我尝试使用应用程序源进行调试,但在使用托管应用程序时我没有遇到任何问题,我得到了那个错误。我使用 catch 块来捕获错误日志。我暂时删除了它。捕获(异常前)
  • @camilo 感谢您的回复。实际上这是所有页面中使用的常用方法。在那个方法中,我正在关闭连接。

标签: c# oracle12c


【解决方案1】:

我曾经在针对 32 位版本的 Odac 运行 64 位 IIS 应用程序时遇到过类似的问题。确保这些匹配。

关于 finally 块中的交易,我同意 Camilio。并确保关闭连接,否则您一定会得到 ORA-1000 异常。

【讨论】:

    【解决方案2】:

    你为什么不尝试更接近这个的东西......

    public string SaveLoad(DataGL.ScheduledMaintenance objmaster)
    {
        try
        {
        OracleConnection connection = this.AppConnection;
        connection.Open();
        OracleTransaction transaction = connection.BeginTransaction();
        OracleCommand cmd = new OracleCommand("PKG_VHSCHDULEMAINTENANCE.USP_SAVE", connection, transaction);
        cmd.CommandType = CommandType.StoredProcedure;
    
        OracleParameter parameter = new OracleParameter("p_HostBranchId",OracleType.Number);
        parameter.Value = objmaster.intBranchId;
        cmd.Parameters.Add(parameter); 
    
        OracleParameter parameter = new OracleParameter("p_UserId",OracleType.Number);
        parameter.Direction = ParameterDirection.Output;
        parameter.Value = objmaster.intUserId;
        cmd.Parameters.Add(parameter); 
    
        OracleParameter parameter = new OracleParameter("p_OutMsg",OracleType.VarChar,100);
        parameter.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(parameter);
    
        cmd.ExecuteNonQuery();
    
        string strResult = "";
        strResult = cmd.Parameters["p_OutMsg"].Value.ToString();
    
        connection.CommitTransaction();
            return strResult;
        }
        catch (Exception exc)
        {
    
        }
        finally
        {
            connection.close();
        }
    

    【讨论】:

    • 感谢您的回复。但它不工作。问题依然存在。
    • 如果您使用的是 Oracle 客户端 12c,那么您可能应该尝试使用版本 11 的客户端。此线程中提到了一个已知错误。 (stackoverflow.com/questions/42856909/…)
    【解决方案3】:

    如果您使用的是 Oracle 12c 客户端,请尝试将客户端降级到版本 11g(如果您手头有该客户端)。无需更改服务器。此线程here 中提到的 Oracle 12c 客户端发行版中存在一个已知错误

    或者您可以尝试升级到更新版本的 Oracle 12c 客户端,就像上面列出的线程中的最终答案一样。详细介绍新 ODBC 驱动程序并在最后列出了 12c 客户端的已知故障的 Oracle 文档在答案中列出了一个链接,但我将其包括在内 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-02
      • 2012-03-11
      • 2015-06-11
      • 2013-10-10
      • 1970-01-01
      • 2013-04-24
      • 2011-10-16
      • 2012-04-18
      相关资源
      最近更新 更多