从 ExecuteMethodCall() 获取枚举

get an enum from ExecuteMethodCall()

我有一个遗留存储过程(我无法更改)。它 return 是一个 int,并且将 Linq2Sql 方法声明为 return 一个 int(像这样)工作正常:

public int spExample_upd(
    [Parameter(Name = "Id1", DbType = "int")] int id1,
    [Parameter(Name = "Id2", DbType = "int")] int id2)
{
    IExecuteResult result = ExecuteMethodCall(this, (MethodInfo)MethodInfo.GetCurrentMethod(), id1, id2);
    return (int)result.ReturnValue;
}

存储过程只有 return 一组有限的结果,只有 0、1 和 -1。我不想 returning 一个 int (在我的 C# 代码中),而是 spExample_upd() 到 return 一个枚举:

public enum DbReturn
{
    Success = 0,
    Failure = 1,
    NoCountOn = -1
}

当我声明 spExample_upd() 到 return 一个 DbReturn:

public DbReturn spExample_upd(
    [Parameter(Name = "Id1", DbType = "int")] int id1,
    [Parameter(Name = "Id2", DbType = "int")] int id2)
{
    IExecuteResult result = ExecuteMethodCall(this, (MethodInfo)MethodInfo.GetCurrentMethod(), id1, id2);
    return (DbReturn)result.ReturnValue;
}

...我收到 运行 时间错误 "DbReturn is not a valid return type for a mapped stored procedure method." 这发生在调用 ExecuteMethodCall() 时,所以我什至无法取回结果然后尝试投射它。

我尝试 forcing/coercing 方法信息的 return 类型,方法是将 spExample_upd() 更改为:

[return: Parameter(DbType = "Int")]
[ResultType(typeof(int))]
public DbReturn spExample_upd(
    [Parameter(Name = "Id1", DbType = "int")] int id1,
    [Parameter(Name = "Id2", DbType = "int")] int id2)
{
    IExecuteResult result = ExecuteMethodCall(this, (MethodInfo)MethodInfo.GetCurrentMethod(), id1, id2);
    return (DbReturn)result.ReturnValue;
}

...但这没有任何结果(我仍然得到 运行-time 错误)。

是否可以调用 ExecuteMethodCall,从存储过程中获取 int returned,将其转换为 DbReturn,然后 spExample_upd() return DbReturn?

问题是由 MethodInfo.GetCurrentMethod() 调用与 ExecuteMethodCall( ) 验证该签名的 return 值是否合适的调用。当您更改方法的 return 类型时,ExecuteMethodCall() 中的验证检测到签名不合适并产生您看到的错误。

您可以通过使用枚举公开公开 API 和使用整数的内部 API 来解决该问题,但这几乎就是 Rahul 在他的评论中建议的.理想情况下,您在某个地方有一个层可以对客户端隐藏数据库特定的点点滴滴API,尽管下面的解决方法有效,但 DataContext 可能不是最好的地方。

public DbReturn spExample_upd(int id1)
{
    return (DbReturn)spExample_upd_internal(id1);
}

[Function(Name = "spExample_upd")]
private int spExample_upd_internal([Parameter(Name = "Id1", DbType = "int")] int id1)
{
    var result = ExecuteMethodCall(this, (MethodInfo)MethodInfo.GetCurrentMethod(), id1);
    return (int)result.ReturnValue;
}