Когда вы используете конструктор для DynamicParameters
, чтобы указать объект шаблона, вам все равно нужно будет указать, что @ID
является выходным параметром.Сначала через шаблон он будет установлен на ParameterDirection.Input
.Как только вы добавите его, он будет переопределен, чтобы иметь обновленные значения, тогда вы можете получить значение по имени параметра следующим образом:
procParams.Add("@ID", dbType: DbType.Int32, direction: ParameterDirection.Output);
// ... execute ...
person.ID = procParams.Get<int>("@ID");
Я смог заставить это работать и использовал ваши классы и кодВ дополнение к тому, что я показал выше.
EDIT: , как обсуждалось в комментариях, хранимая процедура не принимает больше аргументов, чем она объявила.Таким образом, альтернативный подход заключается в отказе от хранимой процедуры и использовании некоторого встроенного SQL.При использовании запроса Dapper будет игнорировать любые заданные ему параметры, которые не указаны в операторе SQL.Это обходной путь для решения этой проблемы:
string sql = "INSERT INTO Person (Name, DOB) VALUES (@Name, @DOB) SELECT SCOPE_IDENTITY()";
decimal id = conn.Query<decimal>(sql, procParams).First();
person.ID = (int)id;
Обратите внимание, что SCOPE_IDENTITY()
возвращает десятичное число, а не целое число.
Другая идея, которая, на мой взгляд, не идеальна,изменить код Dapper и добавить метод Remove
в класс DynamicParameters
для удаления нежелательных параметров.Это не сильно вас экономит, поскольку вы все равно будете тратить время на указание параметров, которые нужно удалить, чтобы сделать хранимую процедуру счастливой.Если вы решите реализовать это, помните, что регистр имеет значение при указании ключа для удаления из словаря parameters
.