c# – 存储过程OUTPUT VARCHAR2值使用12c客户端截断

c# – 存储过程OUTPUT VARCHAR2值使用12c客户端截断,第1张

概述我正在使用oracle 11g.我的存储过程是返回varchar2,但它的值被oracle客户端截断. 以下是我的代码: if ((ds != null) && (ds.Tables.Count > 0)) { foreach (DataRow rw in ds.Tables[0].Rows) 我正在使用oracle 11g.我的存储过程是返回varchar2,但它的值被oracle客户端截断.
以下是我的代码:
if ((ds != null) && (ds.tables.Count > 0))                {                    foreach (DaTarow rw in ds.tables[0].Rows)                    {                        OracleParameter param = new OracleParameter((rw["argument_name"]).ToString(),GetoracleType(rw["data_type"].ToString().toupper()));                        param.Direction = GetParameterDirection((rw["in_out"]).ToString().toupper());                        discoveryCommand.Parameters.Add(param);                        if (param.Direction == ParameterDirection.Output && param.OracleType == OracleType.VarChar)                        {                            param.Size = 4000;                        }                    }                }

我将param.size增加到4000,但是值被截断.
是否有任何解决方案.在服务器上我有Oracle 12c.我需要获得解决方案,而不会在我的项目中更新oracle客户端版本,因为某些原因是不允许的.

以下是SP.我修改它返回硬编码的值.还是一样的问题

PROCEDURE access_level (          p_emp_ID IN  employees.emp_ID%TYPE,p_ID IN  NUMBER,p_type VARCHAR2,p_access_level OUT VARCHAR2 ) IS  BEGIN p_access_level := 'X' || 'RO' || 'RW'; END IF;
解决方法 对于连接到服务器12.1.0.1.0的客户端版本11.2.0.1.0,我无法重现您的问题.当Oracle 12c客户端截断输出变量时,这是一个 known case,但是如果您使用11g版本的客户端,则不应该是这样.

我使用了以下测试表和存储过程:

CREATE table TEST_table(    ID NUMBER(11) NOT NulL,name VARCHAR2(256),CONSTRAINT TEST_table_PK PRIMARY KEY (ID))/INSERT INTO TEST_table(ID,name) VALUES(1,'Some test data')/CREATE PROCEDURE TEST_PROCEDURE(   P_ID OUT NUMBER,P_name OUT VARCHAR2)ASBEGIN   SELECT ID,name INTO P_ID,P_name FROM TEST_table;END;

以下是正确提取数据的客户端代码:

using (OracleConnection connection = new OracleConnection()){    connection.ConnectionString = ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString;    connection.open();    using (OracleCommand command = connection.CreateCommand())    {        command.CommandText = "TEST_PROCEDURE";        command.CommandType = CommandType.StoredProcedure;        OracleParameter param1 = new OracleParameter("P_ID",OracleType.Number);        param1.Direction = ParameterDirection.Output;        command.Parameters.Add(param1);        OracleParameter param2 = new OracleParameter("P_name",OracleType.VarChar);        param2.Size = 4000;        param2.Direction = ParameterDirection.Output;        command.Parameters.Add(param2);        using (command.ExecuteReader())        {            Console.Writeline($"Output: [{param2.Value}]");        }    }}

要继续您的问题,请您执行以下 *** 作:

>如果可以创建上面的测试表和存储过程,并检查如何使用上述代码获取字符串数据.
>如果由于某种原因不可能,请提供以下信息:

>调用存储过程的完整代码
>所有从事存储过程的表的DDL
>获取数据的完整客户端代码

恶魔总是在细节.我们应该明白你的情况与上面的示例代码的区别.

总结

以上是内存溢出为你收集整理的c# – 存储过程OUTPUT VARCHAR2值使用12c客户端截断全部内容,希望文章能够帮你解决c# – 存储过程OUTPUT VARCHAR2值使用12c客户端截断所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存