关系数据库: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);
}
}
答案 0 :(得分:3)
输出参数明确未包含在访问者设计中。如果您的sproc使用它们,那么直接调用sproc会更好。
考虑到你在插入sproc中使用它,我怀疑它不会返回行,所以访问器实际上不是正确的抽象。你想直接拨打电话。
话虽如此,如果你愿意,你仍然可以使用你的输入映射器 - 它对访问器没有任何特定的依赖关系,你可以直接调用它,而是传递一个DbCommand对象。但是db.ExecuteNonQuery无论如何都能有效地完成你正在做的事情,所以你可能会从交易中获得更短的代码。