Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / async / await SQL DataReader / 6 сообщений из 6, страница 1 из 1
27.04.2021, 21:06
    #40066497
unq
unq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
async / await SQL DataReader
привет коллеги... вопрос как не получить DataReader is already open
есть синхронный проект со своей оберткой синхронного ридера. Хотел (видимо это была моя ошибка) добавить асинхронности. Думал что если не весь проект асинхронный то пусть хотя бы часть его не будет так нагружать UI. Часть переписал, все отрабатывает но один раз)) и в итоге ловлю ошибку:
авторThere is already an open DataReader associated with this Command which must be closed first.

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

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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;
            }
        }



пробовал оборачивать по-разному, но все равно ловлю ошибку. Что делаю не так и есть ли варианты? Заранее спс!
...
Рейтинг: 0 / 0
27.04.2021, 21:48
    #40066506
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
async / await SQL DataReader
unq,
пи синхронном использовании ошибки нет?
...
Рейтинг: 0 / 0
27.04.2021, 21:53
    #40066507
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
async / await SQL DataReader
unq
ExecuteAsync и прочие прелести не доступны. Есть только синхронный интерфейс для взаимодействия с базой IDbScope.

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

Врят ли этот ваш творческий IDbScope thread-safe, так что такой код, как у тебя, по сути своей неправильный, т.ч. забей.
...
Рейтинг: 0 / 0
27.04.2021, 22:19
    #40066512
unq
unq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
async / await SQL DataReader
fkthat,

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

Спасибо!
...
Рейтинг: 0 / 0
27.04.2021, 22:29
    #40066514
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
async / await SQL DataReader
unq
fkthat,
угасла моя последняя надежда.
Спасибо!

Можно попробовать включить MARS в настройках connection string. Но, опять-таки пока нет гарантии, что вызовы IDbScope потокобезопасные, можно ожидать чего угодно. Кстати, сам метод GetCurrencyInfo статический, т.е. сам по себе должен быть thread-safe, что, похоже, совсем не выполняется. В общем весь этот код это одна сплошная ошибка дизайна.
...
Рейтинг: 0 / 0
03.05.2021, 13:32
    #40068065
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
async / await SQL DataReader
>unq, 27 апр 21, 21:06 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1335684&msg=22315341][22315341]
>пробовал оборачивать по-разному...
<
Посмотрите здесь
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / async / await SQL DataReader / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]