Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 async / await SQL DataReader  [new]
unq
Member

Откуда:
Сообщений: 551
привет коллеги... вопрос как не получить DataReader is already open
есть синхронный проект со своей оберткой синхронного ридера. Хотел (видимо это была моя ошибка) добавить асинхронности. Думал что если не весь проект асинхронный то пусть хотя бы часть его не будет так нагружать UI. Часть переписал, все отрабатывает но один раз)) и в итоге ловлю ошибку:
автор
There is already an open DataReader associated with this Command which must be closed first.


ExecuteAsync и прочие прелести не доступны. Есть только синхронный интерфейс для взаимодействия с базой IDbScope.

как пробовал оборачивать:

public static async Task<RbCurrency> GetCurrencyInfo(IDbScope dbScope, Guid currencyId)
        {
            RbCurrency currency;
            using (dbScope.Create())
            {
                var db = dbScope.Db;

                currency = await Task.Factory.StartNew(() =>
                {
                    return db.SetCommand(
                            @"SELECT TOP 1 rbc.[ID], rbc.[Name], rbc.[Caption], rbc.[ExchangeRate], rbc.[Multiplicity], rbc.[Decinations]
                        FROM RbCurrencies rbc with(nolock)
                        WHERE rbc.[ID] = @currencyId",
                            db.Parameter("currencyId", currencyId))
                        .ExecuteObject<RbCurrency>();
                });
                return currency;
            }
        }


пробовал оборачивать по-разному, но все равно ловлю ошибку. Что делаю не так и есть ли варианты? Заранее спс!
27 апр 21, 21:06    [22315341]     Ответить | Цитировать Сообщить модератору
 Re: async / await SQL DataReader  [new]
vb_sub
Member

Откуда:
Сообщений: 896
unq,
пи синхронном использовании ошибки нет?
27 апр 21, 21:48    [22315354]     Ответить | Цитировать Сообщить модератору
 Re: async  [new]
fkthat
Member

Откуда:
Сообщений: 4880
unq
ExecuteAsync и прочие прелести не доступны. Есть только синхронный интерфейс для взаимодействия с базой IDbScope.

Такая херь называется "инверсия абстракции" - то к чему почти всегда приводит творческое рукоблудие по изобретению своих мегафреймворков поверх и так вполне нормальных существующих.

Врят ли этот ваш творческий IDbScope thread-safe, так что такой код, как у тебя, по сути своей неправильный, т.ч. забей.
27 апр 21, 21:53    [22315355]     Ответить | Цитировать Сообщить модератору
 Re: async / await SQL DataReader  [new]
unq
Member

Откуда:
Сообщений: 551
fkthat,

угасла моя последняя надежда.

Спасибо!
27 апр 21, 22:19    [22315361]     Ответить | Цитировать Сообщить модератору
 Re: async  [new]
fkthat
Member

Откуда:
Сообщений: 4880
unq
fkthat,
угасла моя последняя надежда.
Спасибо!

Можно попробовать включить MARS в настройках connection string. Но, опять-таки пока нет гарантии, что вызовы IDbScope потокобезопасные, можно ожидать чего угодно. Кстати, сам метод GetCurrencyInfo статический, т.е. сам по себе должен быть thread-safe, что, похоже, совсем не выполняется. В общем весь этот код это одна сплошная ошибка дизайна.
27 апр 21, 22:29    [22315364]     Ответить | Цитировать Сообщить модератору
 Re: async / await SQL DataReader  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2515
>unq, 27 апр 21, 21:06 [22315341]
>пробовал оборачивать по-разному...
<
Посмотрите здесь
3 май 21, 13:32    [22317776]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить