В настоящее время у меня есть хранимая процедура, которая выполняет некоторые операторы вставки, вызывает другую хранимую процедуру, которая вставляет что-то еще и возвращает идентификатор, а затем выполняет некоторые операторы обновления.Итак, примерно так:
BEGIN
SET NO COUNT ON;
BEGIN TRY
BEGIN TRAN
-- Do some inserts
DECLARE @MyIdCount int = (SELECT COUNT(MyId) FROM MappingTable)
DECLARE @newId int
WHILE @MyIdCount > 0
BEGIN
EXEC mySproc @parentId = @SomeId, @outId = @newId OUTPUT
-- update table with result from sproc executed above
@MyIdCount = @MyIdCount - 1
END
-- Do some updates based on the table that's been updated in the while loop
SELECT * FROM MyUpdatedTable
END TRAN
END TRY
BEGIN CATCH
-- do something error
END CATCH
END
Я хотел бы переместить это, чтобы использовать dapper, а также хранимую процедуру, которая вызывается в цикле WHILE, но не вижу, как я тогда смогучтобы вызвать это как часть этой хранимой процедуры.
Вот хранимая процедура в цикле while:
BEGIN
SET NOCOUNT ON;
INSERT INTO Mapping(ParentId)
VALUES(@parentId)
SELECT @outId = SCOPE_IDENTITY()
END
@outId
определяется как параметр OUTPUT
и прекрасно работает при перемещении.чтобы получить доступ к этому:
var parameters = new DynamicParameters();
parameters.Add("@parentId", parentId);
parameters.Add("@outId", dbType: DbType.Int64, direction: ParameterDirection.Output);
// some query logic etc.
return parameters.Get<long>("@outId");
ОБНОВЛЕНИЕ
Так что я думаю Я должен быть в состоянии сделатьследующее:
using (IDbConnection = Connection)
{
var transaction = db.BeginTransaction();
var inputDataParams = new DynamicParameters();
//add various parameters for the inserts.
db.Execute(New Input Data query, inputDataParams, transaction);
var getOldIdsParams = new DynamicParameters():
//add parameters for gettings old ids for mapping
var oldIds = db.Query<long>(new query to get ids, getOldIdsParams, transaction).ToList();
var mapping = new Dictionary<long, long>();
var createNewIdsParams = new DynamicParameters();
createNewidsparams.Add("@parentId", parentId);
createNewidsparams.Add("@outId", , dbType: DbType.Int64, direction: ParameterDirection.Output);
long newId;
foreach(var oldId in oldIds)
{
db.Execute(Create Id Query, createNewIdsParams, transaction);
newId = createNewidsparams.Get<long>("@outId");
mapping.Add(oldId, newId);
}
var updateParameters = new DynamicParameters();
// add params
foreach(var oldId in oldIds)
{
updateParameters.Add(@oldId, oldId);
updateParameters.Add(@newId, mapping[oldId]);
db.Execute(New update query, updateParamters, transaction);
}
transaction.Commit();
}
Я постараюсь реализовать это полностью и посмотреть, будет ли это работать.Если кто-то может увидеть что-то не так с этим, пожалуйста, скажите!Это сэкономит мне время.Спасибо
ОБНОВЛЕНИЕ 2
Это похоже на работу.