C# 调用存储过程时出现异常: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

我试图使用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 = 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解决了异常。