以下是我的代码:
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客户端截断所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)