我在使用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”
如果我只用两个字母代替,我只有一个字母。.
答案 0 :(得分:1)
对于OUT参数,您应该/必须设置属性DbType
和OracleDbType
尝试添加
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)
我也遇到了这个错误。我的设置如下:
我遇到了完全相同的问题,返回的字符串被截断/切成两半。虽然,我的问题是使用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)
此解决方案工作正常。提示是: