C# 在Oracle 10g服务器上调用存储过程时出错

C# 在Oracle 10g服务器上调用存储过程时出错,c#,oracle,stored-procedures,plsql,C#,Oracle,Stored Procedures,Plsql,我从C#调用存储过程,得到以下异常: ORA-06550:第1行第7列: PLS-00306:调用“MY_PROC”时参数的数量或类型错误 ORA-06550:第1行第7列: PLS-00306:调用“MY_PROC”时参数的数量或类型错误 ORA-06550:第1行第7列: PL/SQL:忽略语句 因为我的程序有57个参数,所以不容易知道问题到底出在哪里。 有没有办法得到更详细的信息 注意:但是参数类型和数量似乎匹配 以下是我的存储过程参数: Var_PE_... IN NUMBER(8,

我从C#调用存储过程,得到以下异常:

ORA-06550:第1行第7列:
PLS-00306:调用“MY_PROC”时参数的数量或类型错误
ORA-06550:第1行第7列:
PLS-00306:调用“MY_PROC”时参数的数量或类型错误
ORA-06550:第1行第7列:
PL/SQL:忽略语句

因为我的程序有57个参数,所以不容易知道问题到底出在哪里。 有没有办法得到更详细的信息

注意:但是参数类型和数量似乎匹配

以下是我的存储过程参数:

Var_PE_...  IN  NUMBER(8,0),
Var_PE_...  IN  NUMBER(4,0),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  NUMBER(4,0),
Var_PE_...  IN  NUMBER(4,0),
Var_PE_...  IN  NUMBER(8,0),
Var_PE_...  IN  NUMBER(7,0),
Var_PE_...  IN  VARCHAR2(1 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  NUMBER(15,0),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  VARCHAR2(25 BYTE)
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  NUMBER(5,0),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  NUMBER(5,0),
Var_PE_...  IN  NUMBER(5,0),
Var_PE_...  IN  VARCHAR2(11 BYTE),
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  CHAR(2 BYTE),
Var_PE_...  IN  VARCHAR2(17 BYTE),
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  NUMBER(12,5),
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  CHAR(2 BYTE),
Var_PE_...  IN  CHAR(3 BYTE),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  NUMBER(7,2),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  NUMBER(9,2), 
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  NUMBER(10,0),
Var_PE_...  IN  VARCHAR2(49 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  CHAR(6 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  VARCHAR2(13 BYTE),
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  VARCHAR2(2 BYTE),
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  VARCHAR2(1 BYTE),
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  VARCHAR2(20 BYTE),

Var_PS...   OUT VARCHAR2,
Var_PS...   OUT VARCHAR2
这是我从c#打来的电话:

用于创建参数的主代码:

    public DbParameter CreateInputDbParameter(DbType typeParam, int sizeparam,
        string nameParam, object valueParam)
    {
        DbParameter DbParam = Parameter;
        DbParam.DbType = typeParam;
        DbParam.Size = sizeparam;
        DbParam.Direction = ParameterDirection.Input;
        DbParam.ParameterName = nameParam;
        if (valueParam == null)
        {
            DbParam.Value = DBNull.Value;
        }
        else
        {
            DbParam.Value = valueParam;
        }
        return DbParam;
    }

    public DbParameter CreateOutputDbParameter(DbType typeParam, int sizeparam, string nameParam)
    {
        DbParameter DbParam = Parameter;
        DbParam.DbType = typeParam;
        DbParam.Size = sizeparam;
        DbParam.Direction = ParameterDirection.Output;
        DbParam.ParameterName = nameParam;
        return DbParam;
    }

您需要将参数方向设置为ParameterDirection.Output(如果是Output)

OracleParameter test= 
    new OracleParameter("testparameter", OracleDbType.Varchar2);
test.Direction = ParameterDirection.Output;
cmd.Parameters.Add(test);
如果是输入,则将其设置为ParameterDirection.input

检查参数的大小,您在声明时并没有给出大小。而且参数的类型也很重要。例如,
NUMBER(15,0)
映射为
DbType.Int32
NUMBER(3,0)
映射为
DbType.Double

编辑 您试图使用ADO.NET基类连接oracle,您知道即使
System.Data.OracleClient
也不推荐使用

System.Data.OracleClient中的类型已弃用。这些类型是 在.NET Framework的版本4中受支持,但将在 未来版本。Microsoft建议您使用第三方Oracle 提供者


您最好使用,这些错误大部分都会得到解决。

ParameterDirection
是在使用
CreateInputDbParameter
CreateOutputDbParameter
创建参数时设置的。很抱歉,我仍然支持Oracle 10和.NET 3.5。这种编码方式可以与同一程序中的其他一些过程一起工作,但这个过程很难修复。您能否显示
CreateOutputDbParameter
CreateInputDbParameter
的代码?您不能创建新的
DbParameter DbParam=new DbParameter()但是分配
参数
,有什么原因吗?看起来您发布的CreateInputDbParameter版本需要4个参数,但是显示的所有调用只提供3个参数。是否有其他版本的CreateInputDbParameter只接受3个参数?此外,传递给CreateInputDbParam和CreateOutputDbParam的
nameParam
参数值似乎与过程中定义的参数的实际名称相匹配,因此应该是
'Var_PE…'
,等等@BobJarvis I剪切行,以获得可读的代码,但在实际代码中,我提供了完整的参数。参数名称不重要,只使用它们的顺序。@Damith
Parameter
Command.CreateParameter()的getter
OracleParameter test= 
    new OracleParameter("testparameter", OracleDbType.Varchar2);
test.Direction = ParameterDirection.Output;
cmd.Parameters.Add(test);