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即时客户端。这会导致问题???
答案 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;