【问题标题】:ORA-06550 exception while calling oracle stored procedure from C#从 C# 调用 oracle 存储过程时出现 ORA-06550 异常
【发布时间】:2011-09-14 00:10:21
【问题描述】:

我正在尝试从我的 C# 应用程序调用 oracle 存储过程,但出现以下错误:

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

过程声明为:

PROCEDURE delete_search (user_ip IN VARCHAR2)

假设调用它的 C# 代码是:

OracleCommand cmd;
OracleParameter param;
for (int i = 0; i < data.Tables[0].Rows.Count; i++)
{
    if (decimal.Parse(data.Tables[0].Rows[i][1].ToString()) < numericUpDown1.Value)
    {
        cmd = new OracleCommand("delete_search", Form1.conn());
        cmd.Parameters.Clear();
        cmd.CommandType = CommandType.StoredProcedure;
        param = new OracleParameter();
        param.ParameterName = "ip";
        param.Value = data.Tables[0].Rows[i][0].ToString();
        param.Direction = ParameterDirection.Input;
        param.OracleType = OracleType.VarChar;
        cmd.Parameters.Add(param);
        Form1.adapter().SelectCommand = cmd;
        Form1.adapter().SelectCommand.ExecuteNonQuery();
    }
}    

当然会在行中抛出异常:

Form1.adapter().SelectCommand.ExecuteNonQuery();

可能是什么问题?

【问题讨论】:

    标签: c# oracle


    【解决方案1】:

    不应该

    param.ParameterName = "ip";
    

    成为

    param.ParameterName = "user_ip";
    

    【讨论】:

    • 你在这里可能是正确的。但是请注意 OracleCommand 默认情况下按参数顺序绑定并忽略名称,除非 BindByName 设置为 true。但是我不知道这是否仅用于查询或也适用于存储过程:download.oracle.com/docs/html/E10927_01/…
    • from the .NET docs - 将参数与 SqlCommand 一起使用 - 将参数与 SqlCommand 一起使用时,添加到 Parameters 集合中的参数名称必须与参数名称匹配存储过程中的标记。 SQL Server 的 .NET Framework 数据提供程序将存储过程中的参数视为命名参数并搜索匹配的参数标记。
    • 很高兴知道。我知道BindByName 对常规查询生效,但不确定存储过程。
    【解决方案2】:

    您传递了错误的参数名称。应该是

    param.ParameterName = "user_ip";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      相关资源
      最近更新 更多