Microsoft-IIS / 8.5,Oracle输出变量被截断

时间:2015-02-13 20:45:30

标签: c# asp.net oracle iis

OracleConnection connection = DBHelper.OracleConnection;
OracleCommand OraCommand = connection.CreateCommand();

OraCommand.CommandText = "AUTHENTICATION.Authenticate";
OraCommand.CommandType = CommandType.StoredProcedure;

int zero = 0;
OracleParameter newParam = null;


OraCommand.Parameters.Add(newParam);
newParam = new OracleParameter("Authenticated", OracleType.VarChar);
newParam.Direction = ParameterDirection.Output;
newParam.Size = 4000;


OraCommand.Parameters.Add(newParam);
newParam = new OracleParameter("Message", OracleType.VarChar);
newParam.Direction = ParameterDirection.Output;
newParam.Size = 4000;
OraCommand.Parameters.Add(newParam);


newParam = new OracleParameter("Response", OracleType.VarChar);
newParam.Direction = ParameterDirection.Output;
newParam.Size = 4000;
OraCommand.Parameters.Add(newParam);

try
{
        connection.Open();
        OraCommand.ExecuteNonQuery();
        connection.Close();

        errorLabel.Text = OraCommand.Parameters["Message"].Value.ToString() ;

        if (OraCommand.Parameters["Authenticated"].Value.ToString() == "Yes")
        {


            this.Response.Redirect("Default.aspx", true);
        }else
        {
            errorLabel.Text = OraCommand.Parameters["Message"].Value.ToString() + Request.ServerVariables["SERVER_SOFTWARE"] + OraCommand.Parameters[9].Value.ToString();
        }

    }
    catch (Exception ex)
    {
        errorLabel.Text = ex.ToString();
    }

预期产出:

  

1)消息 - 您已成功登录

但是我得到了一个截断的字符串:你有成功

  

2)经过身份验证 - 是

但是我得到了一个截断的字符串

ý

相同的代码在IIS 7.5中运行良好,我们将服务器升级到IIS 8.5,现在我遇到了这个问题。

我确实阅读了一些关于ado.net弃用的文章并使用了odp.net。我不想将我的代码更改为ODP.net。

你有什么想法,为什么我的输出变量会被截断?

当我们升级IIS 8.5时,我们在该计算机上安装了12.1.0即时客户端。这会导致问题???

4 个答案:

答案 0 :(得分:10)

这是Oracle Client 12c中的错误。它不仅截断字符串,还截断数字。恢复到客户端11g解决了问题。

答案 1 :(得分:1)

newParam = new    OracleParameter("Response",OracleType.VarChar);
Use **OracleType.Char** instead of     **OracleType.VarChar** 
newParam = new    OracleParameter("Response", OracleType.Char);
 IT works in my case.

我正在使用Oracle 11g和VS12,在点网代码中截断输出参数,     我什至在存储过程中将输出参数更改为整数。

当我在点网中更改为Char而不是下面的Varchar时,它工作正常。

db.AddParameter(dbCommand, "p_out_result", OracleType.Char, 300, 
ParameterDirection.Output, true, 100, 3, null, DataRowVersion.Default, null);

答案 2 :(得分:0)

我们获得了与迁移到Oracle 12c数据库(在Oracle服务器上)和Windows 2012 for webservices(IIS 8)时相同的体验。

从存储过程返回的Varchar2字符串几乎总是被截断一半 - 不管我们使用什么设置。

将64位客户端12位替换为32位客户端12并未解决问题。

Vick Rom的解决方案解决了我们的问题。 Oracle客户端11安装在64位Windows 2012服务器上。

我们计划保持这种方式,直到Oracle客户端12无法修复。

答案 3 :(得分:0)

我遇到了同样的问题,但由于我的客户的政策坚持使用最新的Oracle客户端,因此选择了不同的方法。在这种情况下,我必须使我的代码在Windows 2012 R2 [IIS 8.5]服务器上与Oracle 12c客户端一起使用。

我没有将varchar2作为输出参数返回,而是修改SP以返回 SYS_REFCURSOR ,其中包含一行/列。

例如:

PROCEDURE get_access_sp (p_mode IN VARCHAR2, p_out OUT SYS_REFCURSOR)
IS
BEGIN
   /*Body of SP*/
   v_out := 'TEST_SP_RETURN_PARAM';

   --RETURN
   OPEN p_out FOR SELECT v_out po FROM DUAL;
EXCEPTION
   WHEN OTHERS
   THEN
      OPEN p_out FOR SELECT 'N' po FROM DUAL;
END get_access_sp;