Oracle 12c,存储过程OUT参数字符串消息中断

时间:2018-04-11 13:24:11

标签: c# oracle12c

我创建了一个包含两个输入和一个输出的虚拟包。保存时我应该获得“SUCCESS”,但它会返回“SU” Oracle 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();
        }

当应用程序托管在服务器中时会发生问题。但是我在源代码中运行时工作正常。 环境细节:oracele 12c,框架3.5,iis 10.

3 个答案:

答案 0 :(得分:0)

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

我和Camilio一起讨论了finally块中的那个事务。并确保关闭连接或者您必须获得ORA-1000例外。

答案 1 :(得分:0)

为什么不尝试接近这个......

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();
    }

答案 2 :(得分:0)

如果您使用的是Oracle 12c客户端,请尝试将客户端降级到11g版本。无需更改服务器。此线程here

中提到的Oracle 12c客户端发行版中存在一个已知错误

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