C# 调用存储过程时出现异常:ORA-01460-请求的转换未实现或不合理
我试图使用ADO.NET调用存储过程,但出现以下错误: ORA-01460-未实施或 要求不合理的转换 我尝试调用的存储过程具有以下参数:C# 调用存储过程时出现异常:ORA-01460-请求的转换未实现或不合理,c#,.net,oracle,ado.net,C#,.net,Oracle,Ado.net,我试图使用ADO.NET调用存储过程,但出现以下错误: ORA-01460-未实施或 要求不合理的转换 我尝试调用的存储过程具有以下参数: param1 IN VARCHAR2, param2 IN NUMBER, param3 IN VARCHAR2, param4 OUT NUMBER, param5 OUT NUMBER, param6 OUT NUMBER, param7 OUT VARCHAR2 下面是我用来调用存储过程的C代码: OracleCommand command
param1 IN VARCHAR2,
param2 IN NUMBER,
param3 IN VARCHAR2,
param4 OUT NUMBER,
param5 OUT NUMBER,
param6 OUT NUMBER,
param7 OUT VARCHAR2
下面是我用来调用存储过程的C代码:
OracleCommand command = connection.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "MY_PROC";
OracleParameter param1 = new OracleParameter() { ParameterName = "param1", Direction = ParameterDirection.Input,
Value = p1, OracleDbType = OracleDbType.Varchar2, Size = p1.Length };
OracleParameter param2 = new OracleParameter() { ParameterName = "param2", Direction = ParameterDirection.Input,
Value = p2, OracleDbType = OracleDbType.Decimal };
OracleParameter param3 = new OracleParameter() { ParameterName = "param3", Direction = ParameterDirection.Input,
Value = p3, OracleDbType = OracleDbType.Varchar2, Size = p3.Length };
OracleParameter param4 = new OracleParameter() { ParameterName = "param4", Direction = ParameterDirection.Output,
OracleDbType = OracleDbType.Decimal };
OracleParameter param5 = new OracleParameter() { ParameterName = "param5", Direction = ParameterDirection.Output,
OracleDbType = OracleDbType.Decimal};
OracleParameter param6 = new OracleParameter() { ParameterName = "param6", Direction = ParameterDirection.Output,
OracleDbType = OracleDbType.Decimal };
OracleParameter param7 = new OracleParameter() { ParameterName = "param7", Direction = ParameterDirection.Output,
OracleDbType = OracleDbType.Varchar2, Size = 32767 };
command.Parameters.Add(param1);
command.Parameters.Add(param2);
command.Parameters.Add(param3);
command.Parameters.Add(param4);
command.Parameters.Add(param5);
command.Parameters.Add(param6);
command.Parameters.Add(param7);
command.ExecuteNonQuery();
你知道我做错了什么吗?你在哪里把值输入参数
编辑:对不起,问题不好。更确切地说,您将哪些值推送到参数中来?ADO.NET实现不会在客户端检查推入参数的对象的类型;服务器负责验证对象类型是否与您给定的DB参数类型相匹配。转换错误可能是由于将参数声明为OracleDbType.Decimal,然后意外地将字符串推入其中而导致的。不确定它是否相关,但SQL VARCHAR2值限制为4000(尽管PL/SQL可以处理32000个) 您可以尝试将“Size=32767”修改为更小的值(例如500),看看是否有效
还要查看您传递的字符串的大小。如果其中一个是50000个字符,这可能就是问题所在。您使用的是什么oracle客户端。oracle存在一个与绑定相关的问题,它给出了相同的错误消息。如果我没记错的话,问题是10.2.0.3到11.1.0.7之间的所有客户端都会出现此错误 我有一个应用程序在10.2.0.1中运行良好,而在11.1.0.7客户端中突然出现上述错误 切换到11.2.0.1 oracle客户端修复了该问题 但是,在您的情况下,我会首先检查您的客户端的NLS设置是否与数据库匹配(或者至少兼容) 不能保证是同一个问题,但你至少可以再检查一遍 //抱歉,只是看到它已被修复,但该信息可能对其他人有用 干杯,
Crocked在创建OracleParameters时,我正在设置其Value属性(对于IN参数)。这不对吗?p1是字符串,p2是长字符串,p3是字符串。我手边没有Oracle的副本可供测试,但在过去修补过这类东西后,我想到了两件事。首先,在将p2指定给参数时,尝试将其强制转换为十进制。其次,尝试删除Varchar2参数的大小参数。DB类型转换是出了名的挑剔,有时提供的信息比它想要的要多(或者期望它执行简单的隐式转换,如从长到小数),可能会导致挂断。哦,在将字符串推入参数时,还要确保字符串不为null。如果是,则改用DBNull.Value。这也会带来麻烦。我尝试了你的两个建议,但不幸的是,我仍然得到相同的异常。将大小更改为512而不是32767解决了异常。