C#和Oracle:输出参数被截断

时间:2019-01-24 14:11:26

标签: c# oracle

我在使用C#和Oracle DB时遇到另一个问题。 因此,我执行了一个存储过程并取回out参数,一切正常,但最后,我的输出数据被加半了。

create or replace PROCEDURE TEST(MyVar IN VARCHAR2, return_var OUT VARCHAR2) AS 
BEGIN
  DECLARE newId number;
  BEGIN
     SELECT (NVL(MAX(ID),0) + 1) 
       INTO newId 
       FROM MY_TABLE;

     INSERT INTO MY_TABLE
     VALUES (newId, sysdate, 'BEL', '3' , MyVar, 'var2', 'AZ', 'TR', 'FG', 'QW', 'XC', 'IO', '1', '0', sysdate, 'TT', 'BB', 'OO', '8', '9', sysdate, '5', '6');
  END;

  return_var := 'TESTRETURN';
END TEST;

这是C#代码:

OracleParameter out_param = oCommand.CreateParameter();
out_param.ParameterName = "return_code";
out_param.Direction = ParameterDirection.Output;
out_param.DbType = DbType.String;
out_param.Size = 300;
oCommand.Parameters.Add(out_param);
oCommand.ExecuteNonQuery();
Results = out_param.Value.ToString();

我得到的是: TESTR ,而不是 TESTRETURN

如果我在Oracle过程TESTRETURN中替换为诸如“ THISCHAINHAVE20CARSX”之类的较大内容,我会得到“ THISCHAINH”

如果我只用两个字母代替,我只有一个字母。.

4 个答案:

答案 0 :(得分:1)

对于OUT参数,您应该/必须设置属性DbTypeOracleDbType

尝试添加

out_param.OracleDbType = OracleDbType.Varchar2;

在执行代码之前先执行代码。

您的代码的较短版本是:

oCommand.Parameters.Add("return_code", OracleDbType.Varchar2, 300, null, ParameterDirection.Output);
oCommand.Parameters("return_code").DbType = DbType.String;

也许您必须使用String.Empty而不是null

答案 1 :(得分:1)

我也遇到了这个错误。我的设置如下:

  • Windows Server 2019上的Oracle Express 18c(18c并未明确支持2019,但它似乎可以工作)。
  • Windows Server 2019上的Oracle Client 19(与上面的服务器不同)。

我遇到了完全相同的问题,返回的字符串被截断/切成两半。虽然,我的问题是使用UPDATE table ... RETURNING char_col INTO :out_param这种查询。 (我的应用程序正在使用System.Data.OracleClient)

我的解决方案是卸载19客户端,然后安装11gR2客户端。同样,Win2019上未明确支持11gR2,但它似乎可以工作。 (“以管理员身份”运行11客户端的安装。)
附带说明:从11客户端连接到18数据库时,我必须使用以下命令更新数据库服务器上的sqlnet.ora:SQLNET.ALLOWED_LOGON_VERSION_SERVER= 11。 否则,我会收到以下错误消息:“ ORA-28040:没有匹配的身份验证协议错误”。

我还发现该解决方案也有效(通过将“旧” dll复制到可执行文件的文件夹中):https://stackoverflow.com/a/23161879/1037864

答案 2 :(得分:0)

VARCHAR2 替换为 CHAR

时有效
CREATE OR REPLACE PROCEDURE TEST(var1 IN VARCHAR2, return_code OUT VARCHAR2)

作者

CREATE OR REPLACE PROCEDURE TEST(var1 IN VARCHAR2, return_code OUT CHAR)

因此,this topic中的错误也适用于System.Data.OracleClient.dll程序集。

答案 3 :(得分:0)

此解决方案工作正常。提示是:

  • 返回参数始终为 CHAR,从不为 VARCHAR 或 VARCHAR2。