Реляционная база данных: Sql Server 2008 Язык программирования: C # Используется Framework: Enterprise Library 5.0
Как получить доступ к выходным параметрам, созданным в рамках реализации IParameterMapper?
Я в настоящее времяреализация Шаблон репозитория .Все наши хранимые процедуры вставки содержат выходной параметр.Выходной параметр присутствует только для тех таблиц, первичным ключом которых является автоматически генерируемый столбец идентификаторов.Все мои хранимые процедуры имеют связанные реализации 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);
}
}