如何访问IParameterMapper的输出参数值?

时间:2011-06-08 03:42:05

标签: c# sql-server-2008 repository enterprise-library repository-pattern

关系数据库:Sql Server 2008 编程语言:C# 使用的框架:Enterprise Library 5.0

如何访问在IParameterMapper实现中创建的输出参数?

我目前正在实施Repository Pattern。我们所有的Insert存储过程都包含一个输出参数。输出参数仅出现在那些主键是自动生成的标识列的表中。我的所有存储过程都具有IParameterMapper的关联实现。每个表都有一个关联的TransferObject。每个TransferObject都有一个关联的IRowMapper实现。

如果无法访问输出参数,我相信我只有两个其他选项。

1)更改存储过程以返回包含新创建的标识的行,而不是通过输出参数返回值。通过这种方式,我可以使用当前实现的IRowMapper来访问应用程序层中的值。这种方式会占用更多资源,但在存储库中将需要更少的编程。

2)不要使用Database.ExecuteSprocAccessor,只需“正常”执行存储过程;保持存储过程不变。这将是最有效的解决方案,但需要更多的编程工作。

以下是我们目前正在实施的一个示例。

当前实施

public class UserRepository : IRepository<User>
{
    ....
    public void Insert(User user)
    {
        this.database.
    }
    ....
}

public class User : TransferObject
{
    public string ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class UserRowMapper : IRowMapper<User>
{
    private static readonly UserRowMapper instance = new UserRowMapper();

    private UserRowMapper()
    {
    }

    public UserRowMapper Instance
    {
        get
        {
            return instance;
        }
    }

    public User MapRow(IDataRecord row)
    {
        var user = new User
            {
                ID = row.GetInt32("ID"),
                FirstName = row.GetString("FirstName"),
                LastName = row.GetString("LastName")
            };
    }
}

public class InsertUserParameterMapper : IParameterMapper
{
    private static readonly InsertUserParameterMapper instance = new InsertUserParameterMapper();

    public InsertUserParameterMapper()
    {
    }

    public static InsertUserParameterMapper Instance
    {
        get
        {
            return instance;
        }
    }

    public void AssignParameters(DBCommand command, object[] parameterValues)
    {
        var firstNameParameter = command.CreateParameter();
        firstNameParameter.ParameterName = "@firstName";
        firstNameParameter.Direction = ParameterDirection.Input;
        parameter.Value = parameterValues[0];
        command.Parameters.Add(firstNameParameter);

        var lastNameParameter = command.CreateParameter();
        lastNameParameter.ParameterName = "@lastName";
        lastNameParameter.Direction = ParameterDirection.Input;
        parameter.Value = parameterValues[1];
        command.Parameters.Add(lastNameParameter);

        var idParameter = command.CreateParameter();
        idParameter.ParameterName = "@id";
        idParameter.Direction = ParameterDirection.Output;
        command.Parameters.Add(idParameter);

    }
}

1 个答案:

答案 0 :(得分:3)

输出参数明确未包含在访问者设计中。如果您的sproc使用它们,那么直接调用sproc会更好。

考虑到你在插入sproc中使用它,我怀疑它不会返回行,所以访问器实际上不是正确的抽象。你想直接拨打电话。

话虽如此,如果你愿意,你仍然可以使用你的输入映射器 - 它对访问器没有任何特定的依赖关系,你可以直接调用它,而是传递一个DbCommand对象。但是db.ExecuteNonQuery无论如何都能有效地完成你正在做的事情,所以你可能会从交易中获得更短的代码。