【发布时间】: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