【问题标题】:An exception of type 'System.InvalidOperationException' occurred in Microsoft.Practices.EnterpriseLibrary.Data.dllMicrosoft.Practices.EnterpriseLibrary.Data.dll 中出现“System.InvalidOperationException”类型的异常
【发布时间】:2018-06-08 10:59:09
【问题描述】:

我遇到了这个错误:Microsoft.Practices.EnterpriseLibrary.Data.dll 中发生了“System.InvalidOperationException”类型的异常,但未在用户代码中处理。附加信息:参数的数量与值的数量不匹配用于存储过程。这是我的代码:

public static IEnumerable<abcProduct> GetAll()
{
    string cnn =
    "database connectionstring";
    using (OracleConnection conn = new OracleConnection(cnn))
    {
        conn.Open();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = conn;
        cmd.CommandText = "package_name.sp_name";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("resultset_out", OracleDbType.RefCursor, ParameterDirection.Output);
        OracleDataReader rdr = cmd.ExecuteReader();
        //rdr.Read();
        while (rdr.Read())
        {
            yield return new vProduct(GetNullableValue<string>(rdr["ABC_PRODUCT"]), GetNullableValue<string>(rdr["ABC_PRODUCT_AREA"]));
        }
    }
}

这是我的存储过程结构

PROCEDURE PRC_ABC_PRODUCTS_GETALL(resultset_out OUTPUT TYPES.cursorType) AS

BEGIN
    OPEN resultset_out
    FOR

    SELECT UPPER(products.abc_product) abc_product,
        MAX(productareas.abc_product_area) abc_product_area
    FROM SCHEMA.AS_ABC_PRODUCT products
    LEFT JOIN SCHEMA.AS_ABC_PRODUCT_AREA productareas
        ON products.V_PRODUCT_AREA_ID = productareas.ABC_PRODUCT_AREA_ID
    WHERE products.VALID = 1
        AND products.abc_product NOT LIKE '$%'
    GROUP BY UPPER(products.abc_product),
        UPPER(productareas.abc_product_area)
    ORDER BY UPPER(products.ABC_PRODUCT);
END

PRC_ABC_PRODUCTS_GETALL;

有人可以帮忙吗?谁能指出错误是什么?非常感谢您的帮助:-)

【问题讨论】:

    标签: c# asp.net asp.net-mvc oracle stored-procedures


    【解决方案1】:

    我在您的代码中发现了几个问题。

    • 应该是cmd.CommandText = "PRC_ABC_PRODUCTS_GETALL"; 而不是cmd.CommandText = "package_name.sp_name";

    • resultset_out OUTPUT TYPES.cursorType 不是有效的 Oracle 语法。应该是resultset_out OUT SYS_REFCURSOR。你能编译程序吗?

    试试这样:

    cmd.CommandText = "begin res := PRC_ABC_PRODUCTS_GETALL; end;";
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Add("res", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
    OracleDataReader rdr = cmd.ExecuteReader();
    

    还有这个 PL/SQL:

    FUNCTION PRC_ABC_PRODUCTS_GETALL RETURN SYS_REFCURSOR AS
       resultset_out SYS_REFCURSOR;
    BEGIN
        OPEN resultset_out
        FOR
    
        SELECT UPPER(products.abc_product) abc_product,
            MAX(productareas.abc_product_area) abc_product_area
        FROM SCHEMA.AS_ABC_PRODUCT products
        LEFT JOIN SCHEMA.AS_ABC_PRODUCT_AREA productareas
            ON products.V_PRODUCT_AREA_ID = productareas.ABC_PRODUCT_AREA_ID
        WHERE products.VALID = 1
            AND products.abc_product NOT LIKE '$%'
        GROUP BY UPPER(products.abc_product),
            UPPER(productareas.abc_product_area)
        ORDER BY UPPER(products.ABC_PRODUCT);
    
        RETURN resultset_out;
    END;
    

    【讨论】:

    • 感谢@Wernfried Domscheit 的回复 :) 。我可以在 Visual Studio 中编译 sp,它显示 0 个错误,但我还没有用 sql developer 尝试过。我对这些东西非常陌生,这些都是由以前的开发人员完成的。让我试试这种方式 :)并再次感谢您回答我的问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多