«Уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым».- но где? - PullRequest
0 голосов
/ 26 сентября 2019

Это буквально вся моя транзакция:

adc.BeginTransaction();

// create/edit quote assocated with quote request
adc.CreateOrEditQuote(model.QuoteRequestID, model.Amount);

adc.CommitTransaction();

Я нигде не вижу, чтобы у меня лежало открытое DataReader, которое могло бы мешать чему-либо еще - внутрисделка!У меня есть еще один вызов базы данных в другом классе, который должен быть завершен к тому времени, когда он будет вызван:

var model = new ViewQuoteRequestModel();

var qr = DataContextProvider.REDACTED.ListQuoteRequests().SingleOrDefault(q => q.QuoteRequestID == id);
if (null != qr)
{
    qr.CopyTo<IViewQuoteRequestModel>(model);
}

return model;

Вызов SingleOrDefault для моих данных должен разрешать их, а не оставлять их отложенно загруженными, верно?Так что это не должно быть проблемой в любом случае ...

edit: если я закомментирую строку, где я вызываю CreateOrEditQuote, то ошибки не будет, но, конечно, данные не сохраняются.Так что в случае, если это поможет, вот моя хранимая процедура:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[REDACTED].[CreateOrEditQuote]') AND type in (N'P', N'PC'))
DROP PROCEDURE [REDACTED].[CreateOrEditQuote]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE procedure [REDACTED].[CreateOrEditQuote]
(
    @QuoteRequestID int,
    @Amount money
)
as
begin
    declare @qid int
    select @qid = QuoteID from QuoteRequest where ID = @QuoteRequestID
    if @qid is null
    begin
        -- quote does not exist, create it
        insert into quote (Amount) values (@Amount)
        select @qid = @@IDENTITY
    end
    else
    begin
        -- quote exists, edit it
        update quote set Amount = @Amount where ID = @qid
    end
    update QuoteRequest set QuoteID = @qid where ID = @QuoteRequestID
    select @qid as QuoteID
end
GO

Странная вещь, если я запускаю хранимую процедуру вручную через SQL Server Management Studio, она запускается, но если я делаю это через свое веб-приложение(вызывая код, которым я поделился в верхней части моего поста), он падает ...

1 Ответ

0 голосов
/ 27 сентября 2019

Поскольку моя хранимая процедура возвращала данные, мне пришлось извлечь эти данные:

var qid = adc.CreateOrEditQuote(model.QuoteRequestID, model.Amount).SingleOrDefault()?.QuoteID;

, а не просто вызывать метод CreateOrEditQuote без присвоения результата переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...