【问题标题】:How to access output parameter values for IParameterMapper?如何访问 IParameterMapper 的输出参数值?
【发布时间】:2011-06-08 03:42:04
【问题描述】:

关系数据库: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);

    }
}

【问题讨论】:

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


    【解决方案1】:

    访问器设计中明确不包含输出参数。如果你的 sproc 使用它们,你最好直接调用 sproc。

    考虑到您将它与插入存储过程一起使用,我怀疑它无论如何都不会返回行,因此访问器确实不是正确的抽象。你想要一个直接的 sproc 调用。

    话虽如此,您仍然可以根据需要使用输入映射器 - 它对访问器没有任何特定的依赖关系,您可以直接调用它,而是传递一个 DbCommand 对象。但是 db.ExecuteNonQuery 可以有效地完成你已经在做的事情,所以你可能会得到更短的代码。

    【讨论】:

    • 是的,反正我就是这么做的。我实际上摆脱了我所有的 IRowMapper 和 IParameterMapper 实现。我进行了许多性能测试,实际上不使用访问器要快得多。
    • 您是如何使用直接 sproc 调用来访问输出参数的?我正在尝试做同样的事情,但不确定如何重写我的代码以不使用访问器,但仍然从存储过程中获取输出参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多